一、apollo介绍:
下载项目地址:https://github.com/ctripcorp/apollo
架构图如下:
四个核心模块及其主要功能:
1.ConfigService
(1)提供配置获取接口
(2)提供配置推送接口
(3)服务于Apollo客户端
2.AdminService
(1)提供配置管理接口
(2)提供配置修改发布接口
(3)服务于管理界面Portal
3.Client
(1)为应用获取配置,支持实时更新
(2)通过MetaServer获取ConfigService的服务列表
(3)使用客户端软负载SLB方式调用ConfigService
4.Portal
(1)配置管理界面
(2)通过MetaServer获取AdminService的服务列表
(3)使用客户端软负载SLB方式调用AdminService
三个辅助服务发现模块:
1.Eureka
(1)用于服务发现和注册
(2)Config/AdminService注册实例并定期报心跳
(3)和ConfigService住在一起部署
2.MetaServer
(1)Portal通过域名访问MetaServer获取AdminService的地址列表
(2)Client通过域名访问MetaServer获取ConfigService的地址列表
(3)相当于一个Eureka Proxy
(4)逻辑角色,和ConfigService住在一起部署
3.NginxLB
(1)和域名系统配合,协助Portal访问MetaServer获取AdminService地址列表
(2)和域名系统配合,协助Client访问MetaServer获取ConfigService地址列表
(3)和域名系统配合,协助用户访问Portal进行配置管理
二、如何在spring中整合apollo
(一)属性注入:
1.在MTEA-INF中创建app.properties文件
app.id=yidiankt
2.添加依赖
com.ctrip.framework.apollo
apollo-client
1.1.2
3.cotrollo中增加@EnableApolloConfig注解
@RestController
@EnableApolloConfig
public class ApolloController {
@Value("${dev.yidiankt.name}")
private String str;
@RequestMapping("/apollo")
publc String apollo() {
return "value:" + str;
}
}
4.在resource中创建application.properties
apollo.meta=http://192.168.57.202:8080
5.创建c:\opt\setting\server.properties文件
env=DEV
(二)bean注入:
1.创建bean类
@Component
@ConfigurationProperties("duoan")
public class DevConfig {
private String mobile;
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
}
2.在controller中加入bean
@RestController
@EnableApolloConfig("iduoan")
public class ApolloController {
@Value("${dev.yidiankt.email}")
private String str;
@Resource
private DevConfig devConfig;
@RequestMapping("/apollo")
publc String apollo() {
return "value:" + str + "bean:" + devConfig.getMobile();
}
}
但是该bean的值更改后是不会实时刷新的,那如何才能实时刷新该bean的值呢?
1.首先加入依赖
org.springframework.cloud
spring-cloud-content
2.0.1.RELEASE
2.创建ConfigRefresh类用于配置apollo及springcloud的自动刷新机制
@Component
public class ConfigRefresh {
@Resource
private DevConfig devConfig;
@Resource
private RefreshScope refreshScope;
@ApolloConfigChangeListener
public void onChange(ConfigChangeEvent changeEvent) {
boolean configChange = false;
for(String cKey : changeEvent.changedKeys()) {
if(cKey.startsWith("duoan")) {
configChange = true;
break;
}
}
if(!configChange) {
return;
}
refreshScope.refresh(name: "devConfig");
}
}
3.在DevConfig类中增加@RefreshScope注解
@Component
@ConfigurationProperties("duoan")
@RefreshScope
public class DevConfig {
private String mobile;
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
}
三、灰度发布:发布到部分客户端上,发布前需要制定灰度规则。