Springboot 集成Apollo配置中心【记录】

一、前言

​ 我们经常会在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

posted @ 2024-11-16 16:27  xiaobiao~  阅读(12)  评论(0编辑  收藏  举报