docker-compose部署Apollo多环境高可用集群

docker-compose部署Apollo多环境高可用集群

  1. 架构

  1. 四大核心模块

  1. 三个辅助模块

这里部署包含dev、fat两个环境单集群

一、MySQL

  1. 机器规划

mysql为基础存储库,可复用其他现存mysql数据库。

服务器名称 IP Address Port 说明
MySQL数据库 128.0.255.96 3306 测试环境复用了mysql-archery
  1. 目录规划
mysql/ #docker-compose
mysql/script/ #数据库初始化脚本
  1. 多环境数据库脚本
#github 获取'apolloportaldb.sql''apolloconfigdb.sql' 放置script文件夹下
#apolloconfigdb.sql复制一份,并分别命名为apolloconfigdbdev.sql、apolloconfigdbfat.sql;并修改里面数据库名分别为'_dev''_fat'
  1. 编写docker-compose.yml文件
version: '3'
services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: always
    ports:
    - '3306:3306' # 这里需要暴露端口,用mysql客户端修改apollo一些配置
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: '512M'
    networks:
    - apollo
    volumes:
    - ./data:/var/lib/mysql
    - ./script:/docker-entrypoint-initdb.d/
    healthcheck:
      test: ["CMD","mysqladmin","-uroot","-p123456","ping","-h","localhost"]
      timeout: 2s
      interval: 10s
      retries: 5
      start_period: 5s
networks:
  apollo:
    name: apollo
    driver: bridge
    ipam:
      driver: default
      config:
      - subnet: 10.42.0.0/16
  1. 启动容器
docker-compose up -d
  1. 验证部署是否成功

使用mysql客户端连接

  1. 部署完后目录结构

二、Eureka

  1. 机器规划

mysql为基础存储库,可复用其他现存mysql数据库。

服务器名称 IP Address Port 说明
Eureka-Dev 128.0.255.96 8761/18761 服务治理(注册和发现)
Eureka-Fat 128.0.255.96 28761/38761 服务治理(注册和发现)
  1. 目录规划
eureka/eureka-dev #docker-cpomse
eureka/eureka-fat #docker-cpomse
  1. 编写docker-compose.yml文件
vim eureka/eureka-dev/docker-cpomse.yml
version: '3'
services:
  eureka-dev-1:
    container_name: eureka-dev-1
    image: lhstack/eureka
    ports:
    - 8761:8761
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: '256M'
    logging:
      options:
        max-size: "1kb"
        max-file: "1"
    environment:
      JAVA_OPTS: "-Xmx128m -Xms128m"
      SECURITY_ENABLE: true
      SECURITY_USERNAME: admin
      SECURITY_PASSWORD: admin
      EUREKA_SERVER_URLS: "http://admin:admin@eureka-dev-1:8761/eureka,http://admin:admin@eureka-dev-2:8761/eureka"
    networks:
    - apollo
  eureka-dev-2:
    container_name: eureka-dev-2
    image: lhstack/eureka
    ports:
    - 18761:8761
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: '256M'
    logging:
      options:
        max-size: "1kb"
        max-file: "1"
    environment:
      JAVA_OPTS: "-Xmx128m -Xms128m"
      SECURITY_ENABLE: true
      SECURITY_USERNAME: admin
      SECURITY_PASSWORD: admin
      EUREKA_SERVER_URLS: "http://admin:admin@eureka-dev-1:8761/eureka,http://admin:admin@eureka-dev-2:8761/eureka"
    networks:
    - apollo
networks:
  apollo:
    name: apollo
vim eureka/eureka-fat/docker-cpomse.yml
version: '3'
services:
  eureka-fat-1:
    container_name: eureka-fat-1
    image: lhstack/eureka
    ports:
    - 28761:8761
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: '256M'
    logging:
      options:
        max-size: "1kb"
        max-file: "1"
    environment:
      JAVA_OPTS: "-Xmx128m -Xms128m"
      SECURITY_ENABLE: true
      SECURITY_USERNAME: admin
      SECURITY_PASSWORD: admin
      EUREKA_SERVER_URLS: "http://admin:admin@eureka-fat-1:8761/eureka,http://admin:admin@eureka-fat-2:8761/eureka"
    networks:
    - apollo
  eureka-fat-2:
    container_name: eureka-fat-2
    image: lhstack/eureka
    ports:
    - 38761:8761
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: '256M'
    logging:
      options:
        max-size: "1kb"
        max-file: "1"
    environment:
      JAVA_OPTS: "-Xmx128m -Xms128m"
      SECURITY_ENABLE: true
      SECURITY_USERNAME: admin
      SECURITY_PASSWORD: admin
      EUREKA_SERVER_URLS: "http://admin:admin@eureka-fat-1:8761/eureka,http://admin:admin@eureka-fat-2:8761/eureka"
    networks:
    - apollo
networks:
  apollo:
    name: apollo

将数据库ApolloConfigDB-dev、ApolloConfigDB-fat中ServerConfig表中的eureka.service.url值分别修改为如下内容

http://admin:admin@eureka-dev-1:8761/eureka,http://admin:admin@eureka-dev-2:8761/eureka
http://admin:admin@eureka-fat-1:8761/eureka,http://admin:admin@eureka-fat-2:8761/eureka

  1. 启动容器
docker-compose up -d
  1. 验证部署是否成功

查看Eureka状态

如果部署了eureka多实例,"DS Replicas"将显示"eureka-dev-1"、"eureka-dev-2"

  1. 部署完后目录结构

三、ConfigService

  1. 机器规划

mysql为基础存储库,可复用其他现存mysql数据库。

服务器名称 IP Address Port 说明
Configservice-Dev 128.0.255.96 8080 Client接口服务
Configservice-Fat 128.0.255.96 18080 Client接口服务
  1. 目录规划
configservice
configservice/configservice-dev #docker-compose
configservice/configservice-dev/conf.d #nginx.config
configservice/configservice-fat #docker-compose
configservice/configservice-fat/conf.d #nginx.config
  1. 编写dev环境configservice
  • docker-compose
version: '3'
services:
  configservice-dev-ha:
    image: nginx:alpine
    container_name: configservice-dev-ha
    restart: always
    ports:
    - '8080:8080'
    logging:
      options:
        max-file: '1'
        max-size: '16k'
    deploy:
      resources:
        limits:
          memory: '16M'
          cpus: '16k'
    volumes:
    - ./conf.d:/etc/nginx/conf.d
    networks:
    - apollo
    depends_on:
      configservice-dev-1:
        condition: service_healthy
      configservice-dev-2:
        condition: service_healthy
  configservice-dev-1:
    image: lhstack/apollo:configservice-1.9.2
    container_name: configservice-dev-1
    restart: always
    environment:
      DB_HOST: "mysql"
      DB_PASSWORD: "123456"
      SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.23.17:3306/ApolloConfigDB_Dev?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
    networks:
    - apollo
    healthcheck:
      test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
      timeout: 2s
      interval: 10s
      retries: 5
      start_period: 15s
    deploy:
      resources:
        limits:
          memory: "384M"
          cpus: '50m'
    logging:
      options:
        max-file: '2'
        max-size: '32k'
  configservice-dev-2:
    image: lhstack/apollo:configservice-1.9.2
    container_name: configservice-dev-2
    restart: always
    environment:
      DB_HOST: "mysql"
      DB_PASSWORD: "123456"
      SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.23.17:3306/ApolloConfigDB_Dev?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
    networks:
    - apollo
    healthcheck:
      test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
      timeout: 2s
      interval: 10s
      retries: 5
      start_period: 15s
    deploy:
      resources:
        limits:
          memory: "384M"
          cpus: '50m'
    logging:
      options:
        max-file: '2'
        max-size: '32k'
networks:
  apollo:
    name: apollo
  • configservice.conf
upstream configservice{
    server configservice-dev-1:8080;
    server configservice-dev-2:8080;
}
server {
    listen       8080;
    listen  [::]:8080;
    server_name  configservice.lhstack.com;
    root  /usr/share/nginx/html;
    client_max_body_size 50m;
    location / {
        proxy_pass http://configservice;
    }
}
  1. 编写fat环境configservice
  • docker-compose
version: '3'
services:
  configservice-fat-ha:
    image: nginx:alpine
    container_name: configservice-fat-ha
    restart: always
    ports:
    - '18080:8080'
    logging:
      options:
        max-file: '1'
        max-size: '16k'
    deploy:
      resources:
        limits:
          memory: '16M'
          cpus: '16k'
    volumes:
    - ./conf.d:/etc/nginx/conf.d
    networks:
    - apollo
    depends_on:
      configservice-fat-1:
        condition: service_healthy
      configservice-fat-2:
        condition: service_healthy
  configservice-fat-1:
    image: lhstack/apollo:configservice-1.9.2
    container_name: configservice-fat-1
    restart: always
    environment:
      DB_HOST: "mysql"
      DB_PASSWORD: "123456"
      SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.23.17:3306/ApolloConfigDB_Fat?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
    networks:
    - apollo
    healthcheck:
      test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
      timeout: 2s
      interval: 10s
      retries: 5
      start_period: 15s
    deploy:
      resources:
        limits:
          memory: "384M"
          cpus: '50m'
    logging:
      options:
        max-file: '2'
        max-size: '32k'
  configservice-fat-2:
    image: lhstack/apollo:configservice-1.9.2
    container_name: configservice-fat-2
    restart: always
    environment:
      DB_HOST: "mysql"
      DB_PASSWORD: "123456"
      SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.23.17:3306/ApolloConfigDB_Fat?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
    networks:
    - apollo
    healthcheck:
      test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
      timeout: 2s
      interval: 10s
      retries: 5
      start_period: 15s
    deploy:
      resources:
        limits:
          memory: "384M"
          cpus: '50m'
    logging:
      options:
        max-file: '2'
        max-size: '32k'
networks:
  apollo:
    name: apollo
  • configservice.conf
upstream configservice{
    server configservice-fat-1:8080;
    server configservice-fat-2:8080;
}
server {
    listen       8080;
    listen  [::]:8080;
    server_name  configservice.lhstack.com;
    root  /usr/share/nginx/html;
    client_max_body_size 50m;
    location / {
        proxy_pass http://configservice;
    }
}
  1. 启动容器
docker-compose up -d
  1. 验证部署是否成功

查看configservice状态

如果configservice部署了多个实例,则"Status"列会显示多个实例

  1. 部署完后目录结构

四、AdminService

  1. 机器规划

mysql为基础存储库,可复用其他现存mysql数据库。

服务器名称 IP Address Port 说明
Adminservice-Dev 128.0.255.96 8090 UI界面接口服务
Adminservice-Fat 128.0.255.96 18090 UI界面接口服务
  1. 目录规划
adminservice
adminservice/adminservice-dev #docker-compose
adminservice/adminservice-dev/conf.d #nginx.config
adminservice/adminservice-fat #docker-compose
adminservice/adminservice-fat/conf.d #nginx.config
  1. 编写dev环境adminservice
  • docker-compose
version: '3'
services:
  adminservice-dev-ha:
    image: nginx:alpine
    container_name: adminservice-dev-ha
    restart: always
    ports:
    - '8090:8090'
    logging:
      options:
        max-file: '1'
        max-size: '16k'
    deploy:
      resources:
        limits:
          memory: '16M'
          cpus: '16k'
    volumes:
    - ./conf.d:/etc/nginx/conf.d
    networks:
    - apollo
    depends_on:
      adminservice-dev-1:
        condition: service_healthy
      adminservice-dev-2:
        condition: service_healthy
  adminservice-dev-1:
    image: lhstack/apollo:adminservice-1.9.2
    container_name: adminservice-dev-1
    restart: always
    environment:
      DB_HOST: "mysql"
      DB_PASSWORD: "123456"
      SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.23.17:3306/ApolloConfigDB_Dev?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
    networks:
    - apollo
    healthcheck:
      test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
      timeout: 2s
      interval: 10s
      retries: 5
      start_period: 15s
    deploy:
      resources:
        limits:
          memory: "384M"
          cpus: '50m'
    logging:
      options:
        max-file: '2'
        max-size: '32k'
  adminservice-dev-2:
    image: lhstack/apollo:adminservice-1.9.2
    container_name: adminservice-dev-2
    restart: always
    environment:
      DB_HOST: "mysql"
      DB_PASSWORD: "123456"
      SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.23.17:3306/ApolloConfigDB_Dev?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
    networks:
    - apollo
    healthcheck:
      test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
      timeout: 2s
      interval: 10s
      retries: 5
      start_period: 15s
    deploy:
      resources:
        limits:
          memory: "384M"
          cpus: '50m'
    logging:
      options:
        max-file: '2'
        max-size: '32k'
networks:
  apollo:
    name: apollo
  • adminservice.conf
upstream adminservice{
    server adminservice-dev-1:8080;
    server adminservice-dev-2:8080;
}
server {
    listen       8090;
    listen  [::]:8090;
    server_name  adminservice.lhstack.com;
    root  /usr/share/nginx/html;
    client_max_body_size 50m;
    location / {
        proxy_pass http://adminservice;
    }
}
  1. 编写fat环境adminservice
  • docker-compose
version: '3'
services:
  adminservice-fat-ha:
    image: nginx:alpine
    container_name: adminservice-fat-ha
    restart: always
    ports:
    - '18090:8090'
    logging:
      options:
        max-file: '1'
        max-size: '16k'
    deploy:
      resources:
        limits:
          memory: '16M'
          cpus: '16k'
    volumes:
    - ./conf.d:/etc/nginx/conf.d
    networks:
    - apollo
    depends_on:
      adminservice-fat-1:
        condition: service_healthy
      adminservice-fat-2:
        condition: service_healthy
  adminservice-fat-1:
    image: lhstack/apollo:adminservice-1.9.2
    container_name: adminservice-fat-1
    restart: always
    environment:
      DB_HOST: "mysql"
      DB_PASSWORD: "123456"
      SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.23.17:3306/ApolloConfigDB_Fat?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
    networks:
    - apollo
    healthcheck:
      test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
      timeout: 2s
      interval: 10s
      retries: 5
      start_period: 15s
    deploy:
      resources:
        limits:
          memory: "384M"
          cpus: '50m'
    logging:
      options:
        max-file: '2'
        max-size: '32k'
  adminservice-fat-2:
    image: lhstack/apollo:adminservice-1.9.2
    container_name: adminservice-fat-2
    restart: always
    environment:
      DB_HOST: "mysql"
      DB_PASSWORD: "123456"
      SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.23.17:3306/ApolloConfigDB_Fat?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
    networks:
    - apollo
    healthcheck:
      test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
      timeout: 2s
      interval: 10s
      retries: 5
      start_period: 15s
    deploy:
      resources:
        limits:
          memory: "384M"
          cpus: '50m'
    logging:
      options:
        max-file: '2'
        max-size: '32k'
networks:
  apollo:
    name: apollo
  • adminservice.conf
upstream adminservice{
    server adminservice-fat-1:8080;
    server adminservice-fat-2:8080;
}
server {
    listen       8090;
    listen  [::]:8090;
    server_name  adminservice.lhstack.com;
    root  /usr/share/nginx/html;
    client_max_body_size 50m;
    location / {
        proxy_pass http://adminservice;
    }
}
  1. 启动容器
docker-compose up -d
  1. 验证部署是否成功

查看adminservice状态

如果adminservice部署了多个实例,则"Status"列会显示多个实例

  1. 部署完后目录结构

五、Portal

  1. 机器规划

mysql为基础存储库,可复用其他现存mysql数据库。

服务器名称 IP Address Port 说明
Portal 128.0.255.96 8090 UI界面服务
  1. 目录规划
portal #docker-compose
  1. 编写docker-compose.yml文件
version: '3'
services:
  portal:
    image: lhstack/apollo:portal-1.9.2
    container_name: portal
    restart: always
    ports:
    - '8070:8080'
    environment:
      DB_HOST: "mysql"
      DB_PASSWORD: "123456"
      #SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.23.17:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
    networks:
    - apollo
    deploy:
      resources:
        limits:
          memory: "384M"
          cpus: '50m'
    logging:
      options:
        max-file: '2'
        max-size: '32k'
networks:
  apollo:
    name: apollo

在数据库ApolloPortalDB的ServerConfig表中修改以下字段内容如下

apollo.portal.envs
添加开发和测试环境
dev,fat

apollo.portal.meta.servers
补充各环境的meta地址

  1. 启动容器
docker-compose up -d
  1. 验证部署是否成功

访问apollo网站

  1. 部署完后目录结构

  1. 使用
  • 环境列表、命名空间、集群

环境:同一应用的多个环境
命名空间:后者覆盖前者,私有覆盖共有,共有可多个应用使用
集群:同一环境的不同地区或场景集群

  • 系统信息

系统的部署信息

  • 开放平台授权

    • 第三方应用调用的是portal服务
    • 一个第三方应用appid可以管理多个appid(逐个添加)

创建第三方应用,支持第三方应用操作apollo配置

posted @   Nine4酷  阅读(545)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示