假如你有 4 套独立的 Kubernetes 集群环境,DEV 开发环境用于研发开发调试、前端终端对接,并通过 VPN 使办公网络可以访问到 Kubernetes 的 Service、Pod 集群网络,TEST 环境用于测试,UAT 环境作为二轮测试和验收环境,PRO 作为生产环境。
不同环境的权限要做严格的控制,TEST、UAT、PRO 环境的配置只能由运维操作,研发只有查看权限,禁止研发编辑、发布;DEV 环境的配置,研发具有编辑、发布权限。
可想而知,如果没有一套可以集中式的管理多个环境、可以对不同环境操作进行权限控制的配置中心,来管理这么多的环境,将是非常混乱的。因为这意味着你可能要收藏 4 个环境的配置中心地址,每次新增修改配置可能要重复 4 次,也不能清晰的对各个环境的参数进行差异化比较。
下面是携程 Apollo 官方文档的特性说明,也正是我们选择使用 Apollo 作为云服务配置中心的原因。
统一管理不同环境、不同集群的配置
- Apollo 提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。
- 通过命名空间(namespace)可以很方便的支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖。
权限管理、发布审核、操作审计
- 应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。
- 所有的操作都有审计日志,可以方便的追踪问题。
接下来,看下 Apollo 是如何统一管理多套环境的配置信息?如何在不同环境中共享配置?
首先部署一个 Portal 服务,一套 Portal 可以管理多个环境的配置,但是每个环境都需要独立部署一套 Config Service、Admin Service 和相互独立的数据库 ApolloConfigDB。
-
Config Service 提供配置获取接口,接口服务对象为 Apollo 客户端
-
Admin Service 提供配置管理接口,接口服务对象为 Portal
-
Portal
- 提供 Web 界面供用户管理配置
- 通过 Meta Server 获取 Admin Service 服务列表(IP+Port)
Eureka Server、Config Service、Meta Server 三个角色都集成在 Config Service 服务中,也就是说这三个服务地址是相同的,其中 Meta Server 只是一个逻辑角色,简单封装了 Eureka 的服务发现接口,如下图。

Meta Server 的服务地址有两个用处,分布式部署情况如下图:
- 一个是配置在 Portal 中,通过访问 Meta Server 来获取 Admin Service 服务地址列表,操作配置的修改、发布等功能。
- 另一个在 Client 中,也就是我们 Spring Cloud 服务的配置文件中通过配置 Meta Server 地址来获取 Config Service 服务列表,读取相关配置。

登录 Protal【管理员工具-系统参数】
- 配置可支持的环境列表: apollo.portal.envs:DEV,TEST,UAT,PRO

- 配置各环境 Meta Service 列表:apollo.portal.meta.servers。

创建一个应用 appId = AIoT,进入后即可看到左侧有四个环境的菜单,与上面配置的 envs、meta servers 相对应,通过切换列表即可查看四个环境的配置信息;每个环境下会默认生成一个私有的配置空间 namespace 名称为 application,来配置各个环境私有的 db 连接信息、mqtt 连接信息等。

在 Spring Cloud 微服务中如何引入?一般服务中会创建一个公共的配置 application.yml 文件,通过 profiles 来选择激活不同环境的配置文件。
spring:
application:
name: gateway
profiles:
active: ${env}
TEST 测试环境:application-test.yml
app:
id: AIoT
apollo:
meta: http://192.168.0.101:6061
bootstrap:
enabled: true
namespaces: application
UAT 预发布环境:application-uat.yml
app:
id: AIoT
apollo:
meta: http://192.168.0.102:5051
bootstrap:
enabled: true
namespaces: application
这样服务在发布时,就可以通过指定环境变量来使用不同环境的配置,例如:
ENV JAVA_OPTS="-Denv=dev -server -Xmx1024m -Xms1024m"
java $JAVA_OPTS -jar gateway.jar
如果业务需要在 application 中增加一项配置,我们需要在每个环境中分别进行新增吗?当然不是。在新增配置时,可以指定要新增的环境。如下会在三个环境中都新增出相同的配置。

如果是后加入的环境,则可以使用同步功能。

~ END ~。
网友评论