Apollo(配置管理工具)

介绍

Python读取配置参数通常使用处理yaml, conf配置文件和env环境变量,这种配置方式比较方便本地加载,在微服务分布式部署时对这些配置需要集中管理,并支持热更新则引入了Apollo
 Apollo(阿波罗) 是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行
Apollo的优点如下:
  • 部署简单
  • 灰度发布
  • 版本发布管理
  • 提供开放平台API
  • 客户端配置信息监控
  • 配置修改实时生效(热发布)
  • 权限管理、发布审核、操作审计
  • 统一管理不同环境、不同集群的配置

安装部署

我们采用 Docker-Compose 方式来启动 Apollo ,参考Github项目 apollo-quick-start 中给出的介绍,可以方便地在本地启动 Apollo 
- 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

使用

  1. 创建应用
image.png
 
 
  1. 新增配置(客户端需要使用的配置变量和值)
image.png
 
 
在应用中可创建集群的配置和namespace
集群:
在有些特殊情况下,应用有需求对不同的集群做不同的配置,比如部署在A机房的应用连接的es服务器地址和部署在B机房的应用连接的es服务器地址不一样。
在这种情况下,可以通过在Apollo创建不同的集群来解决。
namespace:
在一些情况下,尽管应用本身不是公共组件,但还是需要在多个AppId之间共用同一份配置,比如同一个产品的不同项目:XX-Web, XX-Service, XX-Job等。
这种情况下如果希望实现多个AppId使用同一份配置的话,基本概念和公共组件的配置是一致的。
具体来说,就是在其中一个AppId下创建一个namespace,写入公共的配置信息,然后在各个项目中读取该namespace的配置即可。
如果某个AppId需要覆盖公共的配置信息,那么在该AppId下关联公共的namespace并写入需要覆盖的配置即可。
 
  1. 发布配置
image.png
 
 
  1. 管理秘钥并启用秘钥
image.png
 
 
  1. 客户端连接apollo读取配置
image.png
 
 
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宕时影像整个项目无法使用
posted @ 2024-06-13 11:15  Mr沈  阅读(16)  评论(0编辑  收藏  举报