前面几章,介绍了apollo客户端,这章开始介绍apollo服务端的meta server和apollo-config,apollo版本1.6.1

一.Meta Server

客户端首先请求Meta Server,查询可用的Cofig Service

1.前面在讲使用apollo项目启动的时候,要配置参数apollo.meta或者spi方式的MetaServerProvider#getMetaServerAddress提供一个url地址,做为apollo客户端和服务端交互的url,那Meta Server到底是什么?

2.其实Meta Server就是一个空壳子,对eurekaClient.getApplication()的包装,可以简单理论成Meta Server就是注册中心的客户端,查询注册中心上面有多少个apollo-configservice和apollo-adminservice服务,返回Admin Service服务列表(IP+Port).Config Service服务列表(IP+Port),而不是直接暴露出eureka,减少代码耦合度,如果注册中心换了,不再是eureka,对apollo客户端来说无感知

3.为了部署方便,Meta Server和Config Service在一个JVM进程中,所以IP、端口和Config Service一致;同样,注册中心服务端也和Config Service部署在一起

4.为了高可用,Meta Server可以部署多个实例(因为和Config Service部署在一起,所以config同样也是多个实例)

5.apollo-client请求Meta Server服务,怎么做负载?上面官方图示SLB(Software Load Balancer)软件负载均衡,如url配置多个用逗号分割(源码内使用随机负载)或者配置域名(使用ngix负载)等

二.Cofig Service

客户端请求Cofig Server,查询配置

1.ClientAuthenticationFilter客户端权限拦截

1)查询密钥缓存中有没有该appId配置的密钥,有,校验请求头信息中是否有密钥,密钥是否过期(超过一分钟),利用密钥判断是否是合法请求;2)AccessKeyServiceWithCache创建守护线程不停的轮循数据库ApolloConfigDB中accesskey表的数据,更新或重建密钥缓存

2.同步接口

http get:configs/{appId}/{clusterName}/{namespace:.+},拉取模式

1)取客户端 IP,用于灰度发布的功能 ;2)查询数据库,找到相应配置;3)对比客户端传过来的值,如果有变更就返回,无变更返回304

3.异步接口

http get:/notifications/v2/pollNotification,主动拉取+hold住请求(http长连接)+有结果200/超时304返回=推送模式

4.一个应用对应一个apollo-client,只会发起一个长连接;客户端收到200的返回后,会立即调用同步接口来拉取配置信息;同时客户端也有线程在周期性调用同步接口,也即同步+异步双重保障