SpringCloud集成携程Apollo配置中心详解

SpringCloud集成

  • 第一步 登录Apollo添加测试项目(apollo-test)

  • 第二步 添加测试配置

    ini 复制代码
    // 服务的端口
    server.port = 8888
    // 测试的key
    key = va
    a = 1
  • 第三步 添加依赖

    xml 复制代码
    <dependency>
         <groupId>com.ctrip.framework.apollo</groupId>
         <artifactId>apollo-client</artifactId>
         <version>1.5.0</version>
    </dependency>
  • 第四步,修改application.properties

    ini 复制代码
    apollo.bootstrap.enabled = true
    
    #apollo项目的appid
    app.id=apollo-test
    
    #环境meta server的地址
    #实际的使用中  这个配置不会配置到这里
    apollo.meta=http://127.0.0.1:8080

    到此,一个最基础的使用配置就已经完成

自定义配置文件及动态刷新

获取单个配置

kotlin 复制代码
// 和普通的配置方式一样,直接通过@Value获取即可
@Value("${key}")
private String key;

获取自定义配置对象ApolloConfig

如果是由多个配置项组成的一个配置集合,那我们可以针对起做一个单独的配置对象

  • 创建配置文件对象

    less 复制代码
    // 默认值就是application,如果配置是配在application命名空间下,就可以不用写value值
    // 如果是自定义的命名空间,就需要加上对于的名称
    @EnableApolloConfig(value = "application")
    @Component
    // 获取配置文件
    @ConfigurationProperties
    // lombok的get set
    @Data
    public class ApolloConfig {
        private String key;
        private Integer a;
    }
  • 创建测试接口

    kotlin 复制代码
    @RestController
    public class TestController {
        @Value("${key}")
        private String key;
    
        @Autowired
        ApolloConfig apolloConfig;
    
        @GetMapping("key")
        public String getKey() {
            return key;
        }
    
        @GetMapping("va")
        public String getVa() {
             return apolloConfig.toString();
        }
    }
  • 测试

自动刷新

第一种方式(推荐)
  • 导入SpringCloud

    xml 复制代码
    <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter</artifactId>
         <version>2.1.3.RELEASE</version>
    </dependency>
  • 创建配置文件刷新帮助类ApolloRefreshConfig

    typescript 复制代码
    @Component
    @Slf4j
    public class ApolloRefreshConfig implements ApplicationContextAware {
    
        ApplicationContext applicationContext;
    
        @Autowired
        RefreshScope refreshScope;
    
        // 这里指定Apollo的namespace,非常重要,如果不指定,默认只使用application
        // 有多少命名空间(namespace)就指定多少个,这里传入的是一个数组
        @ApolloConfigChangeListener(value = {ConfigConsts.NAMESPACE_APPLICATION, "namespace1", "namespace2"})
        public void onChange(ConfigChangeEvent changeEvent) {
            for (String changedKey : changeEvent.changedKeys()) {
                log.info("apollo changed namespace:{} Key:{} value:{}", changeEvent.getNamespace(), changedKey, changeEvent.getChange(changedKey));
            }
            refreshProperties(changeEvent);
        }
    
        public void refreshProperties(ConfigChangeEvent changeEvent) {
            this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
            refreshScope.refreshAll();
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    }
  • 启用自动配置向

    ini 复制代码
    spring.boot.enableautoconfiguration=true
  • 重启测试

    启动之后在apollo管理平台修改a的值,发布之后可以看到控制台会出现一天刷新记录,直接访问发现其值以及发生了变化

第二种 @Value注解
kotlin 复制代码
@Value("${key}")
private String key;

缺点:该方式只有添加了@Value才能正常的刷新,如果配置比较多的话,无形中会增加很多体力劳动,第一种方式是一劳永逸的

meta server配置

一开始的测试中,我们会在application.properties中添加一个apollo.meta=http://127.0.0.1:8080,这个只是适合本地开发的时候使用一下,如果需要发布测试环境、正式环境的时候,如何如配置环境的地址来实现切换呢?官方提供了几种方式

  • 第一种,setting配置文件

    csharp 复制代码
    // window在C:\opt\settings
    // linux或者mac在 /opt/settings
    // 下添加server.properties  并加入以下配置
    #集群环境
    #apollo.cluster=xxx
    #meta server地址
    apollo.meta=http://127.0.0.1:8080
  • 第二种,运行时参数

    ini 复制代码
    java -Dapollo.meta=http://127.0.0.1:8080 -jar xxx.jar
  • 第三种,代码中设置

    arduino 复制代码
    System.setProperty("apollo.meta", "http://127.0.0.1:8080");

    具体的meta server的地址请根据个人的实际情况填写

到此,Apollo的整合就已经完成,基于目前的情况几乎可以满足日常开发过程中的大部分需要了,是不是超级简单,而且用起来也很方便。

相关推荐
别看我只是一直狼6 分钟前
从观察者模式到 RxJS:让复杂的异步逻辑变得优雅又舒服
javascript
Bug终结者_9 分钟前
别只会写 Java 了!LangChain4J 带你弯道超车 AI 赛道
后端·langchain·ai编程
Oneslide15 分钟前
MySQL性能排查实战:大量Sleep空闲连接导致数据库写入缓慢解决方案
后端
|晴 天|16 分钟前
我如何用Vue 3打造一个现代化个人博客系统(性能提升52%)
前端·javascript·vue.js
风止何安啊24 分钟前
网页都知道要双向握手才加载!从 URL 到页面渲染,单向喜欢连 DNS 都解析不通
前端·javascript·面试
GISer_Jing31 分钟前
LangChain.js + LangGraph.js 前端AI开发实战指南
前端·javascript·langchain
木心术136 分钟前
TypeScript实战进阶:从基础类型到高级类型编程
javascript·ubuntu·typescript
码界奇点1 小时前
基于Spring Boot的前后端分离商城系统设计与实现
java·spring boot·后端·java-ee·毕业设计·源代码管理
Hello--_--World1 小时前
浏览器同源策略与跨域问题
javascript
零瓶水Herwt1 小时前
JavaScript对象继承常用详解
javascript