一、前言
我们经常会在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:8060bootstrap:enabled: trueeagerLoad:enabled: trueserver: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 {@ResourceApplicationContext applicationContext;@Overridepublic 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("=======================================================================>>>>>>>>>>>");}}}