参考文章:微服务架构~携程Apollo配置中心
分为七个模块,其中四个负责核心功能,剩余三个为辅助模块
- 提供配置获取接口
- 提供配置推送接口
- 服务于Client客户端
- 提供配置管理接口
- 提供配置修改发布接口
- 服务于Portal管理界面
- 为应用获取配置内容,实时更新到应用中
- 通过MetaServer获取ConfigService的服务列表
- 使用客户端软负载SLB方式调用ConfigService
- 提供配置管理可视化页面
- 通过MetaServer获取AdminService的服务列表
- 使用客户端软负载SLB方式调用AdminService
- 用于服务注册与发现
- Config/Admin Service注册实例并定期心跳报告
- 和ConfigService绑定部署
- Portal通过域名访问MetaServer获取AdminService的地址列表
- Client通过域名访问MetaServer获取ConfigService的地址列表
- 相当于一个Eureka Proxy,是逻辑角色,和ConfigService住在一起部署
- 和域名系统配合,协助Portal访问MetaServer获取AdminService地址列表
- 和域名系统配合,协助Client访问MetaServer获取ConfigService地址列表
- 和域名系统配合,协助用户访问Portal进行配置管理
(1)ConfigService和AdminService都是独立的微服务;
- 前者服务于Client,进行配置的获取
- 后者服务于Portal,进行配置的管理和发布
(2)Client和ConfigService保持长链接,通过推拉结合的方式实现配置实时更新,同时保证配置不丢失(本地副本)。
(3)存在两个数据库Config DB和Portal DB
- Config DB:存放项目在某个环境中的配置信息。ConfigService/AdminService/ConfigDB三者在每个环境(DEV/FAT/UAT/PRO)中都要部署一份
- Portal DB:存放用户权限、项目和配置的元数据信息。Protal只需部署一份,它可以管理多套环境
为了保证服务高可用,Config Service和Admin Service都是通过集群的方式部署;
此时为了解决Client/Portal在集群模式下找到Config Service/Admin Service的问题,引入了Eureka服务注册中心组件,实现微服务的注册和发现!
(1)Config Service/Admin Service启动后会注册到Eureka服务中心,并且通过定期发送心跳包的方式证明存活。
(2)Eureka也采用集群方式部署,使用分布式一致性协议保证每个实例状态最终一致。
- 我们知道Eureka是自带服务发现的Java客户端的,如果Apollo只支持Java客户端接入,不支持其它语言客户端接入的话,那么Client和Portal只需要引入Eureka的Java客户端,就可以实现服务发现功能。
- 发现目标服务后,通过客户端软负载(SLB,例如Ribbon)就可以路由到目标服务实例。这是一个经典的微服务架构,基于Eureka实现服务注册发现+客户端Ribbon配合实现软路由,如下图所示:
- 为在兼容其他语言的同时减小开发成本(不需要开发Eureka/Ribbon客户端),引入中间处理角色Meta Server,可以理解成为Eureka的一个Proxy代理,将Eureka的服务发现接口通过HTTP接口的形式暴露出来。
- 方便Client/Protal通过简单的HTTPClient查询得到Config/Admin Service服务的地址列表,获取到服务地址后,再通过客户端软负载(Client SLB)策略路由定位到目标实例,发起调用。
- 现在还有一个问题,MetaServer本身也是无状态以集群方式部署的,那么Client/Protal该如何发现MetaServer呢?一种传统的做法是借助硬件或者软件负载均衡器,例如在携程采用的是扩展后的NginxLB(也称Software Load Balancer),由运维为MetaServer集群配置一个域名,指向NginxLB集群,NginxLB再对MetaServer进行负载均衡和流量转发。Client/Portal通过域名+NginxLB间接访问MetaServer集群。
- Portal也是通过无状态集群方式部署,用户如何发现访问Portal?
- 通过域名 + NginxLB 间接访问Portal集群
- Config Service提供配置更新的推送接口,基于Http Long Polling
- Config Service服务端使用Spring DeferredResult实现异步优化,大大增加长链接数量



