Apollo演进及实践
一、Apollo调用过程
二、功能模块
-
ConfigService: 配置获取接口,配置推送接口,服务Apollo客户端(/services/admin...)
-
AdminService:配置管理,修改发布接口,服务管理界面Portal
-
Client:应用获取配置(支持实时更新,通过MetaServer获取ConfigService的服务列表,使用客户端软负载SLB方式调用ConfigService)
-
Portal:配置管理界面,通过MetaServer获取AdminService的服务列表,使用客户端软负载SLB方式调用AdminService
-
MetaServer:相当于一个Eureka Proxy,和ConfigService一起部署
Portal通过域名访问MetaServer获取AdminService的地址列表
Client通过域名访问MetaServer获取ConfigService的地址列表
-
NginxLB:和域名系统配合
协助Portal访问MetaServer获取AdminService地址列表
协助Client访问MetaServer获取ConfigService地址列表
协助用户访问Portal进行配置管理
三、架构演进
- Client和ConfigService保持长连接,通过一种拖拉结合(push & pull)的模式,实现配置实时更新的同时,保证配置更新不丢失。
- Client通过 ConfigService进行配置获取、Portal通过调用AdminService进行配置管理和发布。
- ConfigService和AdminService共享ConfigDB,ConfigDB中存放项目在某个环境的配置信息。
- Protal有一个独立的PortalDB,存放用户权限、项目和配置的元数据信息。Protal只需部署一份,它可以管理多套环境。
- Client怎么找到ConfigService?Portal怎么找到AdminService?注册中心
- 完善成形,妥妥的微服务架构
- 引入MetaServer,将Eureka的服务发现接口以更简单明确的HTTP接口的形式暴露出来,方便Client/Protal通过简单的HTTPClient就可以查询到Config/AdminService的地址列表。获取到服务实例地址列表之后,再以简单的客户端软负载(Client SLB)策略路由定位到目标实例,并发起调用。
- MetaServer无状态部署,可为MetaServer集群配置一个域名,指向NginxLB集群,NginxLB再对MetaServer进行负载均衡和流量转发。
- 用户通过域名+NginxLB间接访问MetaServer集群
四、实践
- 源码 :https://github.com/ctripcorp/apollo.git
- SpringSecurity鉴权放过(permitAll)
@Order(99) // @Profile("auth") @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) static class SpringSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); http.headers().frameOptions().sameOrigin(); http.authorizeRequests() .antMatchers("/**").permitAll(); } }
3. 启动参数:
-
- apollo-admin.jar -Dapollo_profile=github
- apollo-configservice.jar -Dapollo_profile=github
- apollo-portal.jar -Dapollo_profile=github,auth
- 数据库:
-
- 注册中心 apolloconfigdb_dev
update serverconfig set `Value` = "http://localhost:30000/eureka/" WHERE `Key` = "eureka.service.url"
-
- 部门列表 applloportaldb,
修改部门信息organizations,
apollo.portal.envs和configView.memberOnly.envs配置相对应环境,逗号隔开
- 配置文件整合
- 将bootstrap.yml,application.yml,adminservice.properties整合到application-github.properties(注意common也会引入这个文件,相同名称会覆盖,改为其他文件数据库会找不到)
- 启动添加@PropertySource(value = {"file:${APOLLO_CONFIG_PATH}/application-github.properties"})