生产环境部署apollo

生产环境部署apollo#

1 总体设计#

Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

官方文档地址: https://www.apolloconfig.com/#/zh/README

1.1 基础模型#

basic-architecture

  1. 用户在配置中心对配置进行修改并发布

  2. 配置中心通知Apollo客户端有配置更新

  3. Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用

1.2 架构模块#

overall-architecture

上图简要描述了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进程中。 image-20250102141829965

2 单环境高可用部署#

2.1 部署架构#

apollo

主机名 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) 使用工具连接数据库

image-20250106143036540

(2) 修改 db_apollo_config.ServerConfig 表内容

标红处为修改前的内容

image-20250106143536546

标红处为修改后的内容

image-20250106144242216

(3) 修改 db_apollo_portal.ServerConfig 表内容

标红处为修改前的内容

image-20250106144544790

标红处为修改后的内容

image-20250106144645870

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-configservice:2.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-adminservice:2.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 节点信息

image-20250108160140454

2 显示 172.16.1.22 节点信息

image-20250108161627328

3.2 访问portal端#

在浏览器上访问 http://172.16.1.23:8070/ 地址,nginx 会轮询后端服务,由于后端服务使用相同的 portalDB 库,实现了 session共享,所以多次刷新浏览器显示的结果都是一样的。

管理员初始账号和密码是: apollo/admin

image-20250108172239275

登录成功后首页

image-20250108172533603

查看系统信息

image-20250108172941342

image-20250108180949758

4 发布应用#

4.1 创建应用#

image-20250108181415586

填写应用信息

image-20250108181910855

4.2 新增配置#

image-20250108182211831

说明: 点击 "管理应用" 可以为当前的 apollo 应用添加管理员

填写配置信息

image-20250108182451222

点击发布

image-20250108182742655

发布

image-20250108182844931

发布成功

image-20250108183035224


posted @   云起时。  阅读(20)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示
主题色彩