一、前言
我們經常會在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("=======================================================================>>>>>>>>>>>");
}
}
}