精彩明天 发表于 2023-10-31 21:16:05

Apollo 配置中心的部署与使用经验

前言

Apollo(阿波罗)是携程开源的分布式配置管理中心。
本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验
特点


[*]成熟,稳定
[*]支持管理多环境/多集群/多命名空间的配置
[*]配置修改发布实时(1s)通知到应用程序
[*]支持权限控制、配置继承,版本管理,灰度发布,使用监控等
[*]官方提供了 。NET/Java/Go 的 SDK 以及 Http 接口
[*]国产中文,文档友好,大厂背书,使用方案成熟
[*]使用简单,支持 Docker , K8S,官方也提供多种高可用方案参考
使用情况


[*]目前在微服务项目中做为配置中心,表现稳定,体验良好
[*]内存情况:新安装启动在 100M 左右,工作中实际 20 项目,80 客户端使用时,三个服务占 1.5G 左右
[*]测试环境和生产环境分开,安全及避免错误操作
[*]为什么选择 Apollo:稳定&简单,虽然比不上 Nacos 的性能,也没有服务发现功能,但是稳定啊!!!
[*]在我自己部署前,会觉得这个东西好难,好重,好麻烦。写这篇文章的时候的感受只有两个字:牛*
实践

准备


[*]当前版本:v2.1
[*]apollo-db:mysql 5.6.6+ 数据库

[*]默认端口:3306
[*]依赖两个数据库:ApolloPortalDB,ApolloConfigDB
[*]默认账号/密码:apollo/admin

[*]apollo-configservice:Config Service 提供配置的读取、推送等功能。

[*]默认端口:8080
[*]应用程序端连接到此服务使用

[*]apollo-adminservice: Admin Service 提供配置的修改、发布等功能

[*]默认端口:8090
[*]管理界面使用此服务

[*]apollo-portal:Portal 提供 Web 界面用来管理配置

[*]默认端口:8070
[*]Web 管理界面
[*]默认账号/密码:apollo/admin

[*]Deureka:提供服务注册和发现

[*]Config Service 和 Admin Service 会向 Eureka 注册服务,并保持心跳
[*]在 Admin Service 需要指定 eureka.service.url

[*]服务配置方式的优先级从高到低分别为:系统参数>环境变量>外部配置文件
使用 Docker Compose 安装

本篇文章基于 Docker V24 及 Docker Compose V2,安装可以参考之前的文章
配置说明


[*]挂载了日志文件到。/logs 目录
[*]固定了镜像版本 mysql v5.7 , apollo v2.1.0
[*]指定 MySql 账号密码: root devops666 ,修改了端口映射 13306:3306
[*]挂载 MySql 数据,初始化脚本文件夹 。/initsql(v2.1 脚本)
[*]Apollo 服务中使用服务名 apollo-db 连接 MySql:SPRING_DATASOURCE_URL:'...apollo-db:3306/...'
[*]设置先启动数据库:depends_on:apollo-db
[*]apollo-configservice 服务中指定向 Deureka(Apollo 服务发现组件)注册的地址:http://192.168.123.214:8080
[*]apollo-adminservice 服务中指定向 Deureka 注册的服务地址:http://192.168.123.214:809
[*]apollo-adminservice 服务需指定 Deureka 服务地址:-Deureka.service.url=``http://192.168.123.214:8080/eureka/
[*]指定网络:devopsnetwork (docker network create devopsnetwork)
[*]web 管理端默认账号密码:apollo admin,登录后修改!!!
配置文件 compose.yml


[*]准备好 compose.yml 及 。/initsql/初始化脚本,修改其中的 IP
[*]拷贝到服务器
[*]然后运行docker compose up -d即可
version: '3.1'
services:
   # Apollo数据库
   apollo-db:
   image: mysql:5.7
   container_name: apollo_db_5_7
   restart: always
   environment:
       TZ: Asia/Shanghai
       MYSQL_ROOT_PASSWORD: 'devops666'
   ports:
       - "13306:3306"
   volumes:
       - ./initsql:/docker-entrypoint-initdb.d
       - ./data:/var/lib/mysql
   networks:
       - devopsnetwork

   # Apollo 服务发现注册中心
   apollo-configservice:
   container_name: apollo_configservice_2_1
   image: apolloconfig/apollo-configservice:2.1.0
   restart: always
   depends_on:
       - apollo-db
   environment:
       SPRING_DATASOURCE_URL: 'jdbc:mysql://apollo-db:3306/ApolloConfigDB?characterEncoding=utf8'
       SPRING_DATASOURCE_USERNAME: 'root'
       SPRING_DATASOURCE_PASSWORD: 'devops666'
       JAVA_OPTS: "-Deureka.instance.homePageUrl=http://192.168.123.214:8080"
       # EUREKA_INSTANCE_HOME_PAGE_URL: http://192.168.123.214:8080
       # EUREKA_INSTANCE_PREFER_IP_ADDRESS: false
   volumes:
       - ./logs:/opt/logs
   ports:
       - "8080:8080"
   networks:
       - devopsnetwork

   #核心接口服务
   apollo-adminservice:
   container_name: apollo_adminservice_2_1
   image: apolloconfig/apollo-adminservice:2.1.0
   restart: always
   environment:
       SPRING_DATASOURCE_URL: 'jdbc:mysql://apollo-db:3306/ApolloConfigDB?characterEncoding=utf8'
       SPRING_DATASOURCE_USERNAME: 'root'
       SPRING_DATASOURCE_PASSWORD: 'devops666'
       JAVA_OPTS: "-Deureka.instance.homePageUrl=http://192.168.123.214:8090 -Deureka.service.url=http://192.168.123.214:8080/eureka/ "
   depends_on:
       - apollo-db
   ports:
       - "8090:8090"
   volumes:
       - ./logs/:/opt/logs      
   networks:
       - devopsnetwork
      

   apollo-portal:
   image: apolloconfig/apollo-portal:2.1.0
   container_name: apollo_portal_2_1
   restart: always
   environment:
       SPRING_DATASOURCE_URL: 'jdbc:mysql://apollo-db:3306/ApolloPortalDB?characterEncoding=utf8'
       SPRING_DATASOURCE_USERNAME: 'root'
       SPRING_DATASOURCE_PASSWORD: 'devops666'
       APOLLO_PORTAL_ENVS: 'dev'      
       DEV_META: 'http://192.168.123.214:8080'
       # 默认账号 apollo admin
   depends_on:
       - apollo-db
   ports:
       - "8070:8070"
   volumes:
       - ./logs/:/opt/logs         
   networks:
       - devopsnetwork

networks:
   devopsnetwork:
   external: true
```
部署成功

部署机器IP:192.168.123.214


使用 K8S 安装

跟着官方文档一步步来即可,helm 的文件可以从 apolloconfig/apollo-helm-chart 获取,这里只分享下步骤和些注意的地方

[*]初始化数据库

[*]可以使用已有或者部署 mysql 服务,并创建 apollo 专门的账号密码
[*]执行 Apollo 对应版本的 v2.1 默认初始化脚本 创建 ApolloConfigDB,ApolloPortalDB
[*]生产环境 记得修改 ServerConfig 表的 环境和组织apollo.portal.envs:pro organizations:[{"orgId":"xxx","orgName":"xxx公司"}]

[*]使用 helm 添加 apollo repo
[*]安装 apollo-service
[*]安装 apollo-portal
[*]k8s 使用

[*]可以将 Apollo 相关配置存储到 k8s 的 ConfigMap 中方便 k8s 服务中使用

使用

.NET SDK

官方:Com.Ctrip.Framework.Apollo.Configuration

[*]添加包:Com.Ctrip.Framework.Apollo.Configuration
[*]appsetting.json 中添加 apollo 配置

[*]MetaServer:Apollo 服务地址,系统信息中也可以查看到
[*]AppId:应用 Id
[*]Namespaces:命名空间默认是 application

[*]获取参数注册:可以是配置,也可以是从环境变量中
builder.Configuration.AddApollo(builder.Configuration.GetSection("apollo"));
[*]注入 IConfiguration 使用即可
连接配置

"apollo": {
    "MetaServer": "http://192.168.123.214:8080",
    "AppId": "devops.test",
    "Namespaces": [ "application" ]
}

Demo 示例

dotnet v7.0
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddApollo(builder.Configuration.GetSection("apollo"));
app.MapGet("/config", context =>
{
    context.Response.Headers["Content-Type"] = "text/html; charset=utf-8";
    //配置服务
    var configService = context.RequestServices.GetRequiredService<IConfiguration>();
    string? key = context.Request.Query["key"];
    if (string.IsNullOrWhiteSpace(key))
    {
      return context.Response.WriteAsync("获取配置:/config?key=test");
    }
    var value = configService;
    return context.Response.WriteAsync(value ?? "undefined");
});完整 Demo 示例 :Github 地址
踩过的坑


[*]数据库配置连接,使用服务名,而不是容器名
[*]-Deureka.instance.homePageUrl 和 -Deureka.service.url 参数一开始没有理解到是做什么的,只知道配置健康检查失败,看了文档才理解到是 Deureka.instance.homePageUrl 是注册的服务地址,-Deureka.service.url 是注册中心的接口地址
相关文档


[*]Github 地址
[*]官方文档
[*]模块介绍
[*]Docker 方式部署 Quick Start
[*]分布式部署
[*]部署架构
[*]性能测试
[*].NET SDK: apollo.net
[*]默认初始化脚本
[*]跳过服务发现
[*]配置说明
后语

时间充裕的情况最好是过一遍文档,知道是怎么设计的,遇到问题真会一头雾水。
每天进步一点,哪怕只是一点!

来源:https://www.cnblogs.com/morang/archive/2023/10/31/devops-apollo-install.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Apollo 配置中心的部署与使用经验