Apollo(配置管理工具)
介绍
Python读取配置参数通常使用处理yaml, conf配置文件和env环境变量,这种配置方式比较方便本地加载,在微服务分布式部署时对这些配置需要集中管理,并支持热更新则引入了Apollo
Apollo(阿波罗) 是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行
Apollo的优点如下:
-
部署简单
-
灰度发布
-
版本发布管理
-
提供开放平台API
-
客户端配置信息监控
-
配置修改实时生效(热发布)
-
权限管理、发布审核、操作审计
-
统一管理不同环境、不同集群的配置
安装部署
我们采用 Docker-Compose 方式来启动 Apollo ,参考Github项目 apollo-quick-start 中给出的介绍,可以方便地在本地启动 Apollo 。
下载 docker-compose.yml 和 sql 文件夹 到本地目录
- docker-quick-start
- docker-compose.yml
- sql
- apolloconfigdb.sql
- apolloportaldb.sql
如果使用的是 arm 架构的机器,例如 mac m1,需要下载docker-compose-arm64.yml
docker-compose -f docker-compose-arm64.yml up -d
如果是其他架构的机器,如x86,则直接启动
docker-compose up -d
启动成功后,会默认启动一个MySQL数据库端口映射为13306,和一个apollo服务端,在浏览器中输入本地网址localhost:8070打开Apollo配置页面,账号apollo,密码admin
使用
参考 使用指南
-
创建应用
-
新增配置(客户端需要使用的配置变量和值)
在应用中可创建集群的配置和namespace
集群:
在有些特殊情况下,应用有需求对不同的集群做不同的配置,比如部署在A机房的应用连接的es服务器地址和部署在B机房的应用连接的es服务器地址不一样。
在这种情况下,可以通过在Apollo创建不同的集群来解决。
namespace:
在一些情况下,尽管应用本身不是公共组件,但还是需要在多个AppId之间共用同一份配置,比如同一个产品的不同项目:XX-Web, XX-Service, XX-Job等。
这种情况下如果希望实现多个AppId使用同一份配置的话,基本概念和公共组件的配置是一致的。
具体来说,就是在其中一个AppId下创建一个namespace,写入公共的配置信息,然后在各个项目中读取该namespace的配置即可。
如果某个AppId需要覆盖公共的配置信息,那么在该AppId下关联公共的namespace并写入需要覆盖的配置即可。
-
发布配置
-
管理秘钥并启用秘钥
-
客户端连接apollo读取配置
apollo天然支持Java, Net连接,支持度较好,对于Python,支持度较好的第三方模块,这里使用 pyapollo
pip install apollo-client==2.1.2
使用python读取apollo中以上配置
# -*- coding: utf-8 -*- from pyapollo.apollo_client import ApolloClient app_id = "128" config_server_url = "http://192.168.110.128:8090" authorization = "f3ea9013c53b468bb749eb586a41a74a" cache_file_path = 'my_apollo_config' env = 'DEV' namespace = 'application' cluster = 'default' client = ApolloClient( app_id=app_id, cluster=cluster, config_server_url=config_server_url, authorization=authorization, # cache_file_path=cache_file_path, env=env ) client.start() # print(client.__dict__) # get config from apollo MINIO_SECRET_KEY = client.get_value(key="MINIO_SECRET_KEY", default_val="*", namespace=namespace) MINIO_ACCESS_KEY = client.get_value(key="MINIO_ACCESS_KEY", default_val="**", namespace=namespace) MINIO_URL = client.get_value(key="MINIO_URL", default_val="***", namespace=namespace) timeout = client.get_value(key="timeout", default_val="*****", namespace=namespace) qc_dict = client.get_value(key="qc_dict", default_val="*****", namespace=namespace) is_delete = client.get_value(key="is_delete", default_val="*****", namespace=namespace) a = client.get_value(key="a", default_val="*****", namespace=namespace) print(MINIO_SECRET_KEY, type(MINIO_SECRET_KEY)) print(MINIO_ACCESS_KEY, type(MINIO_ACCESS_KEY)) print(MINIO_URL, type(MINIO_URL)) print(qc_dict, type(qc_dict)) print(timeout, type(timeout)) print(is_delete, type(is_delete)) print(a, type(a))
结果输出:
admin <class 'str'> admin123 <class 'str'> 192.168.110.237:9000 <class 'str'> { "a":"qqqq", "b":123456 } <class 'str'> 10 <class 'str'> false <class 'str'> ***** <class 'str'>
从apollo中读取的配置与通过使用os.getenv()方式获取环境变量方式值类型相同,都是字符串类型
项目中应用
项目中不是在启动项目时docker-compose文件中配置的变量如镜像号和部署路径等,在项目中使用的环境变量值可以使用apollo来集中管理处理
比如如下docker-compose文件中environment中的可以使用apollo来替换
version: '3' services: data_manage: image: ${DATA_MANAGE_IMAGE} restart: always container_name: data_manage ports: - "8802:8000" environment: POSTGRES_HOST: ${POSTGRES_HOST} POSTGRES_PORT: ${POSTGRES_PORT} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} REDIS_HOST: ${REDIS_HOST} REDIS_PORT: ${REDIS_PORT} PYENV: ${PYENV} volumes: - /etc/localtime:/etc/localtime - ${DEPLOY_DIR}/logs/datamanage:/app/DataManage/logs
在项目中使用pyapollo模块连接apollo服务端,在需要读取某个配置值直接从apollo中获取该配置
需要使用分布式部署apollo服务端以保证服务高可用稳定性,否则apollo宕时影像整个项目无法使用