- 架构

- 四大核心模块

- 三个辅助模块

这里部署包含dev、prod两个环境单集群
一、MySQL
- 机器规划
mysql为基础存储库,可复用其他现存mysql数据库。
| 服务器名称 | IP Address | Port | 说明 | 
| MySQL数据库 | 128.0.255.96 | 3306 | 测试环境复用了mysql-archery | 
- 目录规划
| 12
 
 | mysql/ #docker-composemysql/script/ #数据库初始化脚本
 
 | 
- 多环境数据库脚本
| 12
 
 | #github 获取'apolloportaldb.sql'、'apolloconfigdb.sql' 放置script文件夹下#apolloconfigdb.sql复制一份,并分别命名为apolloconfigdbdev.sql、apolloconfigdbprod.sql;并修改里面数据库名分别为'_dev'、'_prod'
 
 | 
- 编写docker-compose.yml文件
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 
 | version: '3.5'services:
 mysql:
 image: mysql:5.7.42
 container_name: mysql
 restart: always
 ports:
 - '3306:3306'
 environment:
 MYSQL_ROOT_PASSWORD: "Apollo"
 deploy:
 resources:
 limits:
 cpus: '1'
 memory: '512M'
 networks:
 - apollo
 volumes:
 - ./data:/var/lib/mysql
 - ./script:/docker-entrypoint-initdb.d/
 healthcheck:
 test: ["CMD","mysqladmin","-uroot","-pApollo123","ping","-h","localhost"]
 timeout: 2s
 interval: 10s
 retries: 5
 start_period: 5s
 networks:
 apollo:
 name: apollo
 driver: bridge
 ipam:
 driver: default
 config:
 - subnet: 10.88.30.0/24
 
 | 
- 启动容器
- 验证部署是否成功
使用mysql客户端连接

- 部署完后目录结构

二、Eureka
- 机器规划
mysql为基础存储库,可复用其他现存mysql数据库。
| 服务器名称 | IP Address | Port | 说明 | 
| Eureka-Dev | 128.0.255.96 | 8761/18761 | 服务治理(注册和发现) | 
| Eureka-prod | 128.0.255.96 | 28761/38761 | 服务治理(注册和发现) | 
- 目录规划
| 12
 
 | eureka/eureka-dev #docker-cpomseeureka/eureka-prod #docker-cpomse
 
 | 
- 编写docker-compose.yml文件
| 1
 | vim eureka/eureka-dev/docker-cpomse.yml
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 
 | version: '3.5'services:
 eureka-dev-1:
 container_name: eureka-dev-1
 image: lhstack/eureka
 ports:
 - 8761:8761
 deploy:
 resources:
 limits:
 cpus: '1'
 memory: '256M'
 logging:
 driver: json-file
 options:
 max-size: "1k"
 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:
 driver: json-file
 options:
 max-size: "1k"
 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
 
 | 
| 1
 | vim eureka/eureka-prod/docker-cpomse.yml
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 
 | version: '3.5'services:
 eureka-prod-1:
 container_name: eureka-prod-1
 image: lhstack/eureka
 ports:
 - 28761:8761
 deploy:
 resources:
 limits:
 cpus: '1'
 memory: '256M'
 logging:
 driver: json-file
 options:
 max-size: "1k"
 max-file: "1"
 environment:
 JAVA_OPTS: "-Xmx128m -Xms128m"
 SECURITY_ENABLE: "true"
 SECURITY_USERNAME: admin
 SECURITY_PASSWORD: admin
 EUREKA_SERVER_URLS: "http://admin:admin@eureka-prod-1:8761/eureka,http://admin:admin@eureka-prod-2:8761/eureka"
 networks:
 - apollo
 eureka-prod-2:
 container_name: eureka-prod-2
 image: lhstack/eureka
 ports:
 - 38761:8761
 deploy:
 resources:
 limits:
 cpus: '1'
 memory: '256M'
 logging:
 driver: json-file
 options:
 max-size: "1k"
 max-file: "1"
 environment:
 JAVA_OPTS: "-Xmx128m -Xms128m"
 SECURITY_ENABLE: "true"
 SECURITY_USERNAME: admin
 SECURITY_PASSWORD: admin
 EUREKA_SERVER_URLS: "http://admin:admin@eureka-prod-1:8761/eureka,http://admin:admin@eureka-prod-2:8761/eureka"
 networks:
 - apollo
 networks:
 apollo:
 name: apollo
 
 | 
将数据库ApolloConfigDB-dev、ApolloConfigDB-prod中ServerConfig表中的eureka.service.url值分别修改为如下内容
http://admin:admin@eureka-dev-1:8761/eureka,http://admin:admin@eureka-dev-2:8761/eureka
http://admin:admin@eureka-prod-1:8761/eureka,http://admin:admin@eureka-prod-2:8761/eureka
- 启动容器
- 验证部署是否成功
查看Eureka状态

如果部署了eureka多实例,”DS Replicas”将显示”eureka-dev-1”、”eureka-dev-2”
- 部署完后目录结构

三、ConfigService
- 机器规划
mysql为基础存储库,可复用其他现存mysql数据库。
| 服务器名称 | IP Address | Port | 说明 | 
| Configservice-Dev | 128.0.255.96 | 8080 | Client接口服务 | 
| Configservice-prod | 128.0.255.96 | 18080 | Client接口服务 | 
- 目录规划
| 12
 3
 4
 5
 
 | configserviceconfigservice/configservice-dev #docker-compose
 configservice/configservice-dev/conf.d #nginx.config
 configservice/configservice-prod #docker-compose
 configservice/configservice-prod/conf.d #nginx.config
 
 | 
- 编写dev环境configservice
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 
 | version: '3.5'services:
 configservice-dev-ha:
 image: nginx:alpine
 container_name: configservice-dev-ha
 restart: always
 ports:
 - '8080:8080'
 logging:
 driver: json-file
 options:
 max-file: '2'
 max-size: '32k'
 deploy:
 resources:
 limits:
 memory: '16M'
 
 volumes:
 - ./conf.d:/etc/nginx/conf.d
 networks:
 - apollo
 depends_on:
 - configservice-dev-1
 - configservice-dev-2
 configservice-dev-1:
 image: apolloconfig/apollo-configservice:2.0.0
 container_name: configservice-dev-1
 restart: always
 environment:
 SPRING_DATASOURCE_USERNAME: "root"
 SPRING_DATASOURCE_PASSWORD: "Apollo"
 SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96: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"
 
 logging:
 driver: json-file
 options:
 max-file: '2'
 max-size: '32k'
 configservice-dev-2:
 image: apolloconfig/apollo-configservice:2.0.0
 container_name: configservice-dev-2
 restart: always
 environment:
 SPRING_DATASOURCE_USERNAME: "root"
 SPRING_DATASOURCE_PASSWORD: "Apollo"
 SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96: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"
 
 logging:
 driver: json-file
 options:
 max-file: '2'
 max-size: '32k'
 networks:
 apollo:
 name: apollo
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | 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;
 }
 }
 
 | 
- 编写prod环境configservice
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 
 | version: '3.5'services:
 configservice-prod-ha:
 image: nginx:alpine
 container_name: configservice-prod-ha
 restart: always
 ports:
 - '18080:8080'
 logging:
 driver: json-file
 options:
 max-file: '2'
 max-size: '32k'
 deploy:
 resources:
 limits:
 memory: '16M'
 
 volumes:
 - ./conf.d:/etc/nginx/conf.d
 networks:
 - apollo
 depends_on:
 - configservice-prod-1
 - configservice-prod-2
 configservice-prod-1:
 image: apolloconfig/apollo-configservice:2.0.0
 container_name: configservice-prod-1
 restart: always
 environment:
 SPRING_DATASOURCE_USERNAME: "root"
 SPRING_DATASOURCE_PASSWORD: "Apollo"
 SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_prod?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"
 
 logging:
 driver: json-file
 options:
 max-file: '2'
 max-size: '32k'
 configservice-prod-2:
 image: apolloconfig/apollo-configservice:2.0.0
 container_name: configservice-prod-2
 restart: always
 environment:
 SPRING_DATASOURCE_USERNAME: "root"
 SPRING_DATASOURCE_PASSWORD: "Apollo"
 SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_prod?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"
 
 logging:
 driver: json-file
 options:
 max-file: '2'
 max-size: '32k'
 networks:
 apollo:
 name: apollo
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | upstream configservice{server configservice-prod-1:8080;
 server configservice-prod-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;
 }
 }
 
 | 
- 启动容器
- 验证部署是否成功
查看configservice状态

如果configservice部署了多个实例,则”Status”列会显示多个实例
- 部署完后目录结构

四、AdminService
- 机器规划
mysql为基础存储库,可复用其他现存mysql数据库。
| 服务器名称 | IP Address | Port | 说明 | 
| Adminservice-Dev | 128.0.255.96 | 8090 | UI界面接口服务 | 
| Adminservice-prod | 128.0.255.96 | 18090 | UI界面接口服务 | 
- 目录规划
| 12
 3
 4
 5
 
 | adminserviceadminservice/adminservice-dev #docker-compose
 adminservice/adminservice-dev/conf.d #nginx.config
 adminservice/adminservice-prod #docker-compose
 adminservice/adminservice-prod/conf.d #nginx.config
 
 | 
- 编写dev环境adminservice
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 
 | version: '3.5'services:
 adminservice-dev-ha:
 image: nginx:alpine
 container_name: adminservice-dev-ha
 restart: always
 ports:
 - '8090:8090'
 logging:
 driver: json-file
 deploy:
 resources:
 limits:
 memory: '16M'
 volumes:
 - ./conf.d:/etc/nginx/conf.d
 networks:
 - apollo
 depends_on:
 - adminservice-dev-1
 - adminservice-dev-2
 adminservice-dev-1:
 image: apolloconfig/apollo-adminservice:2.0.0
 container_name: adminservice-dev-1
 restart: always
 environment:
 SPRING_DATASOURCE_USERNAME: "root"
 SPRING_DATASOURCE_PASSWORD: "Apollo"
 SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96: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"
 logging:
 driver: json-file
 options:
 max-size: '32k'
 adminservice-dev-2:
 image: apolloconfig/apollo-adminservice:2.0.0
 container_name: adminservice-dev-2
 restart: always
 environment:
 SPRING_DATASOURCE_USERNAME: "root"
 SPRING_DATASOURCE_PASSWORD: "Apollo"
 SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96: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"
 logging:
 driver: json-file
 options:
 max-size: '32k'
 networks:
 apollo:
 name: apollo
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | 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;
 }
 }
 
 | 
- 编写prod环境adminservice
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 
 | version: '3.5'services:
 adminservice-prod-ha:
 image: nginx:alpine
 container_name: adminservice-prod-ha
 restart: always
 ports:
 - '18090:8090'
 logging:
 driver: json-file
 deploy:
 resources:
 limits:
 memory: '16M'
 volumes:
 - ./conf.d:/etc/nginx/conf.d
 networks:
 - apollo
 depends_on:
 - adminservice-prod-1
 - adminservice-prod-2
 adminservice-prod-1:
 image: apolloconfig/apollo-adminservice:2.0.0
 container_name: adminservice-prod-1
 restart: always
 environment:
 SPRING_DATASOURCE_USERNAME: "root"
 SPRING_DATASOURCE_PASSWORD: "Apollo"
 SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_prod?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"
 logging:
 driver: json-file
 options:
 max-size: '32k'
 adminservice-prod-2:
 image: apolloconfig/apollo-adminservice:2.0.0
 container_name: adminservice-prod-2
 restart: always
 environment:
 SPRING_DATASOURCE_USERNAME: "root"
 SPRING_DATASOURCE_PASSWORD: "Apollo"
 SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_prod?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"
 logging:
 driver: json-file
 options:
 max-size: '32k'
 networks:
 apollo:
 name: apollo
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | upstream adminservice{server adminservice-prod-1:8080;
 server adminservice-prod-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;
 }
 }
 
 | 
- 启动容器
- 验证部署是否成功
查看adminservice状态

如果adminservice部署了多个实例,则”Status”列会显示多个实例
- 部署完后目录结构

五、Portal
- 机器规划
mysql为基础存储库,可复用其他现存mysql数据库。
| 服务器名称 | IP Address | Port | 说明 | 
| Portal | 128.0.255.96 | 8090 | UI界面服务 | 
- 目录规划
- 编写docker-compose.yml文件
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 
 | version: '3.5'services:
 portal:
 image: apolloconfig/apollo-portal
 container_name: portal
 restart: always
 ports:
 - '8070:8070'
 environment:
 SPRING_DATASOURCE_USERNAME: "root"
 SPRING_DATASOURCE_PASSWORD: "Apollo"
 SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
 
 
 networks:
 - apollo
 deploy:
 resources:
 limits:
 memory: "384M"
 logging:
 driver: json-file
 options:
 max-size: '32k'
 privileged: true
 networks:
 apollo:
 name: apollo
 
 | 
在数据库ApolloPortalDB的ServerConfig表中修改以下字段内容如下
apollo.portal.envs
添加开发和测试环境
dev,prod
apollo.portal.meta.servers
补充各环境的meta地址
{“dev”:”http://configservice-dev-ha:8080","prod":"http://configservice-prod-ha:8080"}
- 启动容器
- 验证部署是否成功
访问apollo网站

- 部署完后目录结构

- 使用

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

- 开放平台授权
- 第三方应用调用的是portal服务
- 一个第三方应用appid可以管理多个appid(逐个添加)
 
创建第三方应用,支持第三方应用操作apollo配置
