Springboot 集成Apollo配置中心【记录】
一、前言
我们经常会在Springboot项目中集成配置中心,无外乎是因为配置中心即时改即时生效的缘故。而我选择Apollo的原因,是因为它有个草稿、然后发布的功能,这在上生产发布前,提前配置好变更项,检查通过再发布,这种机制对于我们来说可太友好了!
二、步骤
2.1 pom.xml
pom.xml文件引入apollo客户端依赖,如下:
<!--apollo-->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.6.0</version>
</dependency>
我们顺便把spring-cloud-context、lombok、fastjson等依赖一起引入。
<!--spring-cloud-context-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
<version>3.1.4</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.32</version>
</dependency>
2.2 SpringBoot启动类
启动类添加@EnableApolloConfig
注解
2.3 application.yml文件配置
我们先在Apollo上创建一个user-admin-server
应用,此时AppId就是:user-admin-server
(此时我本地的Apollo管理中心的地址是:http://localhost:8070/
)
然后application.yml配置信息如下:
下面👇🏻我以spring.application.name作为AppId的值,本地启动8888端口:
app:
id: ${spring.application.name:user-admin-server}
apollo:
meta: http://localhost:8060
bootstrap:
enabled: true
eagerLoad:
enabled: true
server:
port: 8888
2.4 TestController测试
我们写个测试类,试一下,下面举两种示例:一、@Value动态更新;二、@ApolloJsonValue动态更新
2.4.1 @Value动态更新
@Slf4j
@RestController
@RequestMapping("test")
public class TestController {
@Value("${a.b:12121}")
private String abStr;
@GetMapping("apollo-test1")
public String test1() {
return "Hello, Apollo! " + abStr;
}
}
我们访问下:http://localhost:8888/test/apollo-test1
,效果如下:
我们在Apollo上配一下a.b的值,比如配成:Wo Cao! Apollo!!
,再次访问http://localhost:8888/test/apollo-test1
2.4.2 @ApolloJsonValue动态更新
Apollo也支持实体类/JSON注入,比如:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
private String sex;
}
@Slf4j
@RestController
@RequestMapping("test")
public class TestController {
@ApolloJsonValue("${user.config:{'name':'张三','age':23,'sex':'男'}}")
private User user;
@GetMapping("apollo-test2")
public String test2() {
log.info("用户配置信息【{}】", JSON.toJSONString(user));
return "Hello, Apollo! " + JSON.toJSONString(user);
}
}
好了,这个我就不贴效果了,自己试!
2.5 ApolloChangeListener监听类
Apollo也支持监听某些字段的变更,然后进行自定义的实现操作。
@Slf4j
@RefreshScope
@Configuration
public class ApolloChangeListener implements ApplicationContextAware {
@Resource
ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@ApolloConfigChangeListener()
public void refresh(ConfigChangeEvent configChangeEvent) {
log.info("Apollo 发生了变化...");
ConfigChange change = configChangeEvent.getChange("a.b");
if (Objects.nonNull(change)) {
log.info("【Apollo变更】旧数据【{}】", change.getOldValue());
log.info("【Apollo变更】新数据【{}】", change.getNewValue());
log.info("=======================================================================>>>>>>>>>>>");
}
}
}