Springboot 整合Apollo配置中心【記錄】

duanxiaobiao發表於2024-11-16

一、前言

​ 我們經常會在Springboot專案中整合配置中心,無外乎是因為配置中心即時改即時生效的緣故。而我選擇Apollo的原因,是因為它有個草稿、然後釋出的功能,這在上生產釋出前,提前配置好變更項,檢查透過再發布,這種機制對於我們來說可太友好了!
image

二、步驟

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註解

image

2.3 application.yml檔案配置

我們先在Apollo上建立一個user-admin-server應用,此時AppId就是:user-admin-server

(此時我本地的Apollo管理中心的地址是:http://localhost:8070/

image

然後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,效果如下:

image

我們在Apollo上配一下a.b的值,比如配成:Wo Cao! Apollo!!,再次訪問http://localhost:8888/test/apollo-test1

image

image

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("=======================================================================>>>>>>>>>>>");
        }
    }

}

image

相關文章