生产环境部署apollo
#
1 总体设计#
Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
官方文档地址: https://www.apolloconfig.com/#/zh/README
1.1 基础模型#
-
用户在配置中心对配置进行修改并发布
-
配置中心通知Apollo客户端有配置更新
-
Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用
1.2 架构模块#
上图简要描述了Apollo的总体设计,我们可以从下往上看:
1、Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端。
2、Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面) 。
3、Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳。
4、在Eureka之上我们架了一层Meta Server用于封装Eureka的服务发现接口。
5、Client通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做
load balance、错误重试。
6、Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做
load balance、错误重试。
7、为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中。
2 单环境高可用部署#
2.1 部署架构#
主机名 | OS | CPU/内存/磁盘 | IP地址 | 部署服务 |
---|---|---|---|---|
db | CentOS7.9 | 4c/8G/100GiB | 172.16.1.20 | mysql:5.7.44、docker |
apollo01 | CentOS7.9 | 4c/8G/100GiB | 172.16.1.21 | apollo-portal:2.2.0 apollo-adminservice:2.2.0 apollo-configservice:2.2.0 docker、docker-compose |
apollo02 | CentOS7.9 | 4c/8G/100GiB | 172.16.1.22 | apollo-portal:2.2.0 apollo-adminservice:2.2.0 apollo-configservice:2.2.0 docker、docker-compose |
nginx | CentOS7.9 | 4c/8G/100GiB | 172.16.1.23 | nginx |
注: 本文省略 docker、docker-compose 的安装
2.2 数据库配置#
在 172.16.1.20 节点上进行操作
-
版本要求:5.6.5+
1 使用docker方式部署mysql
[root@db ~]# docker run -d --name db \
-p 3306:3306 \
-v /mysql/mysqldata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=LiuChang@=123456 \
mysql:5.7.44-oraclelinux7 \
--character-set-server=utf8mb4
2 创建数据库
[root@db ~]# yum install mysql
[root@db ~]# mysql -uroot -h 127.0.0.1 -p'LiuChang@=123456'
MySQL [(none)]>
create database db_apollo_config default character set=utf8 default collate=utf8_general_ci;
create database db_apollo_portal default character set=utf8 default collate=utf8_general_ci;
grant all privileges on db_apollo_config.* to pro_apollo@"%" identified by "5LrS7MQnO#34iJHe";
grant all privileges on db_apollo_portal.* to pro_apollo@"%" identified by "5LrS7MQnO#34iJHe";
flush privileges;
3 初始化数据库
(1) apolloconfigdb.sql 表下载
https://github.com/apolloconfig/apollo/blob/master/scripts/sql/profiles/mysql-default/apolloconfigdb.sql
以 raw file 方式进行下载。
(2) apolloportaldb.sql 表下载
https://github.com/apolloconfig/apollo/blob/master/scripts/sql/profiles/mysql-default/apolloportaldb.sql
以 raw file 方式进行下载。
(3) 表所在目录
[root@db ~]# ls -l apollo_sql/
total 56
-rw-r--r-- 1 root root 28995 Jan 6 11:48 apolloconfigdb.sql
-rw-r--r-- 1 root root 24266 Jan 6 11:48 apolloportaldb.sql
(4) 导入表
[root@db ~]# mysql -h 127.0.0.1 -upro_apollo -p'5LrS7MQnO#34iJHe'
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db_apollo_config |
| db_apollo_portal |
+--------------------+
3 rows in set (0.00 sec)
MySQL [(none)]> use db_apollo_config;
Database changed
MySQL [db_apollo_config]> source /root/apollo_sql/apolloconfigdb.sql
MySQL [db_apollo_config]> use db_apollo_portal;
Database changed
MySQL [db_apollo_portal]> source /root/apollo_sql/apolloportaldb.sql
4 修改数据库配置
(1) 使用工具连接数据库
(2) 修改 db_apollo_config.ServerConfig 表内容
标红处为修改前的内容
标红处为修改后的内容
(3) 修改 db_apollo_portal.ServerConfig 表内容
标红处为修改前的内容
标红处为修改后的内容
2.3 apollo01 配置#
在 172.16.1.21 节点上进行操作
[root@apollo01 opt]# ls -l /opt/ total 0 drwxr-xr-x 2 root root 44 Jan 6 11:04 apollo_pro_config drwxr-xr-x 2 root root 44 Jan 6 11:02 apollo_pro_portal
1 apollo_pro_config docker-compose 相关配置
(1) .env 文件
[root@apollo01 ~]# cat /opt/apollo_pro_config/.env
# .env文件和compose文件放在同一目录
SPRING_DATASOURCE_HOST_PORT=172.16.1.20:3306
SPRING_DATASOURCE_USERNAME=pro_apollo
SPRING_DATASOURCE_PASSWORD=5LrS7MQnO#34iJHe
SPRING_DATASOURCE_CONFIG_DBNAME_PRO=db_apollo_config
MY_HOST=172.16.1.21
[root@apollo01 ~]#
参数说明:
# 数据库的 IP 及端口号
SPRING_DATASOURCE_HOST_PORT=172.16.1.20:3306
# 连接数据库的用户名
SPRING_DATASOURCE_USERNAME=pro_apollo
# 连接数据库的密码
SPRING_DATASOURCE_PASSWORD=5LrS7MQnO#34iJHe
# 连接的数据库名称
SPRING_DATASOURCE_CONFIG_DBNAME_PRO=db_apollo_config
#当前 linux 主机的 IP 地址
MY_HOST=172.16.1.21
(2) docker-compose.yml 文件
root@apollo01 ~ # cat /opt/apollo_pro_config/docker-compose.yml
# docker-compose.yml
services
apolloConfigservice-pro
container_name apolloConfigservice-pro
image apolloconfig/apollo-configservice2.2.0
volumes
./config_pro_logs:/opt/logs
ports
"8080:8080"
environment
SPRING_DATASOURCE_URL=jdbc:mysql://$ SPRING_DATASOURCE_HOST_PORT /$ SPRING_DATASOURCE_CONFIG_DBNAME_PRO ?characterEncoding=utf8
SPRING_DATASOURCE_USERNAME=$ SPRING_DATASOURCE_USERNAME
SPRING_DATASOURCE_PASSWORD=$ SPRING_DATASOURCE_PASSWORD
EUREKA_INSTANCE_HOME_PAGE_URL=http://$ MY_HOST :8080
EUREKA_INSTANCE_IP_ADDRESS=$ MY_HOST
restart always
#network_mode: host
apolloAdminservice-pro
depends_on
apolloConfigservice-pro
container_name apolloAdminservice-pro
image apolloconfig/apollo-adminservice2.2.0
volumes
./admin_pro_logs:/opt/logs
ports
"8090:8090"
environment
SPRING_DATASOURCE_URL=jdbc:mysql://$ SPRING_DATASOURCE_HOST_PORT /$ SPRING_DATASOURCE_CONFIG_DBNAME_PRO ?characterEncoding=utf8
SPRING_DATASOURCE_USERNAME=$ SPRING_DATASOURCE_USERNAME
SPRING_DATASOURCE_PASSWORD=$ SPRING_DATASOURCE_PASSWORD
EUREKA_INSTANCE_HOME_PAGE_URL=http://$ MY_HOST :8090
EUREKA_INSTANCE_IP_ADDRESS=$ MY_HOST
restart always
#network_mode: host
root@apollo01 ~ #
参数说明:
(1) EUREKA_INSTANCE_HOME_PAGE_URL
1) 这个参数指定的是实例的主页 URL。
2) 它通常用来描述服务实例的主页,通常是该服务提供的 Web 应用或监控页面的 URL。
3) 比如,假设你的服务有一个健康检查或者一个 UI 界面,该 URL 会指向该页面,方便其他系统管理员或开发人员查看服务的状态。
(2) EUREKA_INSTANCE_IP_ADDRESS
1) 这个参数指定的是该服务实例的 IP 地址。
2) 它通常用于告诉 Eureka 服务实例的实际网络地址,这对于服务发现和访问该实例是必要的,尤其是在容器化或云环境中,Eureka 可能需要
知道实例的具体 IP 地址来进行注册和发现。
3) 在某些情况下,服务可能绑定在多个网络接口上,所以明确指定实例的 IP 地址可以确保 Eureka 正确识别。
2 apollo_pro_portal docker-compose 相关配置
(1) .env 文件
[root@apollo01 ~]# cat /opt/apollo_pro_portal/.env
# .env文件和compose文件放在同一目录
PRO_META=http://172.16.1.21:8080,http://172.16.1.22:8080
SPRING_DATASOURCE_HOST_PORT=172.16.1.20:3306
SPRING_DATASOURCE_USERNAME=pro_apollo
SPRING_DATASOURCE_PASSWORD=5LrS7MQnO#34iJHe
SPRING_DATASOURCE_PORTAL_DBNAME_PRO=db_apollo_portal
[root@apollo01 ~]#
参数说明:
# 连接的 meta 地址,多个使用逗号进行分割
PRO_META=http://172.16.1.21:8080,http://172.16.1.22:8080
# 数据库的 IP 及端口号
SPRING_DATASOURCE_HOST_PORT=172.16.1.20:3306
# 连接数据库的用户名
SPRING_DATASOURCE_USERNAME=pro_apollo
# 连接数据库的密码
SPRING_DATASOURCE_PASSWORD=5LrS7MQnO#34iJHe
# 连接的数据库名称
SPRING_DATASOURCE_PORTAL_DBNAME_PRO=db_apollo_portal
(2) docker-compose.yml 文件
[root@apollo01 ~]# cat /opt/apollo_pro_portal/docker-compose.yml
# docker-compose.yml
services:
apolloPortal-pro:
container_name: apolloPortal-pro
image: apolloconfig/apollo-portal:2.2.0
volumes:
- ./portal_pro_logs:/opt/logs
ports:
- "8070:8070"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://${SPRING_DATASOURCE_HOST_PORT}/${SPRING_DATASOURCE_PORTAL_DBNAME_PRO}?characterEncoding=utf8
- SPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME}
- SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
- APOLLO_PORTAL_ENVS=pro
- PRO_META=${PRO_META}
restart: always
#network_mode: host
[root@apollo01 ~]#
参数说明:
(1) APOLLO_PORTAL_ENVS=dev,pro
对应 ApolloPortalDB 中的 apollo.portal.envs 配置项,如果没有在数据库中配置的话,可以通过此环境参数配置。
(2) DEV_META PRO_META
配置对应环境的 Meta Service 地址,以 ${ENV}_META 命名,需要注意的是如果配置了 ApolloPortalDB 中的 apollo.portal.meta.servers配置,则以 apollo.portal.meta.servers 中的配置为准。
2.4 apollo02 配置#
在 172.16.1.22 节点上进行操作
[root@apollo02 opt]# ls -l /opt/ total 0 drwxr-xr-x 2 root root 44 Jan 6 15:06 apollo_pro_config drwxr-xr-x 2 root root 44 Jan 6 15:55 apollo_pro_portal
直接将 apollo01 的配置文件拷贝作为 apollo02 的配置文件即可,需要注意的是需要修改 apollo02 中 /opt/apollo_pro_config/.env
文件的 MY_HOST 变量值为当前 linux 主机的 IP 地址 172.16.1.22 即可。
2.5 启动服务#
(1) 启动 config、admin 服务
# 分别在 172.16.1.21、172.16.1.22 节点上进行操作。
# cd /opt/apollo_pro_config/
# docker-compose up -d
(2) 启动 portal 服务
# 分别在 172.16.1.21、172.16.1.22 节点上进行操作。
# cd /opt/apollo_pro_portal/
# docker-compose up -d
2.6 nginx 配置#
在 172.16.1.23 节点上进行操作
1 安装nginx
[root@nginx ~]# yum install nginx -y
[root@nginx ~]# systemctl start nginx
[root@nginx ~]# systemctl enable nginx
2 添加反向代理配置
[root@nginx ~]# cat > /etc/nginx/conf.d/apollo.conf << EOF
upstream config-cluster {
server 172.16.1.21:8080;
server 172.16.1.22:8080;
}
upstream portal-cluster {
server 172.16.1.21:8070;
server 172.16.1.22:8070;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://config-cluster/;
}
}
server {
listen 8070;
server_name localhost;
location / {
proxy_pass http://portal-cluster/;
}
}
EOF
3 重启nginx
[root@nginx ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@nginx ~]# systemctl restart nginx
[root@nginx ~]# netstat -tunlp | egrep "8070|8080"
tcp 0 0 0.0.0.0:8070 0.0.0.0:* LISTEN 9100/nginx: master
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 9100/nginx: master
[root@nginx ~]#
3 访问#
3.1 访问客户端#
在浏览器上访问 http://172.16.1.23:8080/ 地址,nginx 会轮询后端服务,由于后端服务是 eureka 集群,具有 AP 特性,轮询到哪一个 eureka 节点上数据都相同,浏览器上会轮询显示对应节点的信息。
1 显示 172.16.1.21 节点信息
2 显示 172.16.1.22 节点信息
3.2 访问portal端#
在浏览器上访问 http://172.16.1.23:8070/ 地址,nginx 会轮询后端服务,由于后端服务使用相同的 portalDB 库,实现了 session共享,所以多次刷新浏览器显示的结果都是一样的。
管理员初始账号和密码是: apollo/admin
登录成功后首页
查看系统信息
4 发布应用#
4.1 创建应用#
填写应用信息
4.2 新增配置#
说明: 点击 "管理应用" 可以为当前的 apollo 应用添加管理员
填写配置信息
点击发布
发布
发布成功
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)