栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot整合apollo实现配置实时更新

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot整合apollo实现配置实时更新

springboot整合apollo实现配置实时更新
首先导入apollo客户端依赖:


    com.ctrip.framework.apollo
    apollo-client
    1.3.0

然后在配置文件中编写apollo配置:

apollo:
  meta: 你的apollo配置中心地址
  bootstrap:
    enabled: true    #apollo.bootstrap.enabled官方解释为注入默认application namespace的配置示例
    namespaces: common,${biz.app.lower-code}-main-config.yml    #命名空间,默认是application
  autoUpdateInjectedSpringProperties: true    # 自动更新注入的spring属性
app:
  id: calendar      #appid,唯一标识,要与apollo配置中心的项目id一致

普通字段实时更新:直接在要更新的字段上加上Value注解即可(注意:该字段在apollo配置中心中要有配置)然后在apollo配置中心修改name的值这边就可以实时更新了。

@RestController
@RequestMapping("/test")
public class IndexController {
    @Value("${name}")
    String name;

    @GetMapping("/hello")
    public String test(){
        return "hello: " + name;
    }
}

然后测试一下:
apollo配置文件中做如下修改:

然后可以看到

更新一个bean的属性(实时更新)

  1. 首先在bean类上加上两个注解,prefix=“jobinfo”表示键为jobinfo对应的值的变动都可以实时更新,比如jobinfo.jobName
@ConfigurationProperties(prefix = "jobinfo")
@Component
public class JobInfoVo {
    //任务名称
    private String jobName;
    //任务组
    private String jobGroup;
    //触发器名称
    private String triggerName;
    //触发器组
    private String triggerGroup;
    //cron表达式
    private String cron;
    //配置信息(data)
    private String config;
}
  1. 在启动类上加上@EnableApolloConfig注解,查看EnableApolloConfig配置可以发现,默认值是Application,这里我们指定命名空间value = {“calendar-main-config.yml”
@EnableApolloConfig(value = {"calendar-main-config.yml"})
  1. 然后编写apollo监听类
@Slf4j
@Component
public class ApolloConfigChanged implements ApplicationContextAware {
    private ApplicationContext applicationContext;

    @Resource
    private JobInfoVo jobInfoVo;

    
    @ApolloConfigChangeListener(value = {"calendar-main-config.yml"})
    public void onChange(ConfigChangeEvent changeEvent) {

        boolean propertiesChanged = false;

        for (String changedKey : changeEvent.changedKeys()) {
            ConfigChange change = changeEvent.getChange(changedKey);
            log.info("Change-key: {}, oldValue: {}, newValue: {}, changeType: {}",
                    change.getPropertyName(),change.getOldValue(),
                    change.getNewValue(), change.getChangeType());

            //jobinfo的key发生了改变
            if (changedKey.startsWith("jobinfo.")) {
                propertiesChanged = true;
//                break;
            }
        }
        //更新jobinfo的值
        if (propertiesChanged) {
            refreshProperties(changeEvent);
        }
    }

    private void refreshProperties(ConfigChangeEvent changeEvent){
        long startTime = System.currentTimeMillis();
        // 更新配置
        this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
        long finishTime = System.currentTimeMillis() - startTime;
        log.info("更新数据完成!耗时:" + finishTime + "ms");
        // 这里可以获取jobinfoVo的属性值,查看其更新情况。
        log.info(jobinfoVo.getCron())
        //........
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}
  1. 最后就可以进行测试啦
    首先对apollo中的配置文件进行修改

    然后可以发现:配置实时更新过来了

另外:我们上面实现的实时更新是当配置中心的配置发生改变时,配置中心主动向客户端推送最新配置,而apollo客户端也会主动拉取配置中心的配置,默认5分钟拉取一次,这里我们可以添加一个配置,通过设置系统参数apollo.refreshInterval来覆盖这个默认值,单位:分钟。

可以在启动类的main方法中加上如下代码:时间间隔为1分钟,客户端主动拉取配置。

System.setProperty("apollo.refreshInterval","1");
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/671782.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号