apollo使用和自动刷新

背景

配置中心作为系统中常用子系统,其功能一个是统一管理配置,其次是适应更新。目前流行的配置中心有apollo,spring config,Nacos等,这里主要说下apollo。

使用

一、安装apollo

(1)安装数据库和配置库表

数据库用mysql,我在window平台,用的免安装板5.6的。创建数据库,用的官方提供的sql。

安装apollo

(mysql免安装链接:pan.baidu.com/s/1oQvYeYeM... 提取码:vra9)

官方教程:

(2)启动apollo(需要JVM环境)

sql 复制代码
demo.sh start 

启动服务,启动之前需要设置下数据库账号、密码,数据库是上面已经创建好的。在git bash 启动服务后看到的日志,这个要等注册中心先启动,之后才会启动apollo服务和管理界面。

注意,启动需要一定的时间。启动完成可以看到日志:

对应的服务分别有:

(3)启动自定义的项目

上面启动了服务端,创建一个简单的springboot项目,maven 配置:

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-context</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>
<!-- apollo -->
<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>1.7.0</version>
</dependency>

服务配置:

yml 复制代码
server:
  port: 8123 # 修改端口,避免冲突

app:
  id: springboot-apollo
apollo:
  meta: http://127.0.0.1:8080
  bootstrap:
    enabled: true
    eagerLoad:
      enabled: true

这样就可以在springboot项目使用apollo了。

二、使用配置

1.连接apollo,读取配置

最简单的用法是使用注解@Value,普通的spring配置

java 复制代码
@Value("${xxx}")

2.对象填充

AppConfig

  • 指定前缀:@ConfigurationProperties(prefix = "user")
  • 加入配置:@Configuration
  • 属性name、id从apollo加载

3.数组填充

AppConfig

  • 指定前缀:"user"
  • 列表属性:list
  • 索引+字段 user.list[0].name = hello user.list[0].id = 1

4.map填充

AppConfig

  • 指定前缀:"user"
  • 列表属性:maps
  • 索引+字段
    user.maps.first = 张飞 user.maps.second = 李四 user.collects = {1:张三,2:李四}

5.demo

配置项如下:

java 复制代码
hello = world hhhh
user.name = admin
user.id = 123
user.list[0].name = hello
user.list[0].id = 1
user.list[1].name = world
user.list[1].id = 2
user.list[2].name = 张飞
user.list[2].id = 3

user.maps.first = 张飞
user.maps.second = 李四
test.refresh = 你大爷123456

java 接收类:

java 复制代码
@Data
@Configuration
@ConfigurationProperties(prefix = "user")
public class AppConfig {
    private String name;
    private Integer id;
    private List<User> list;
    private Map<String,String> maps;
}

三、自动更新配置

1.@Value自动刷新

@Value("${xxx}")

2.RefreshScope + @ApolloConfigChangeListener

java 复制代码
org.springframework.cloud.context.config.annotation.RefreshScope
监听器:
ApolloConfigChangeListener,可以指定命名空间和前缀
刷新属性:
refreshScope.refresh("refreshConfig");

配置类:

java 复制代码
@Configuration
@ConfigurationProperties(prefix = "test")
@RefreshScope
@Data
public class RefreshConfig {
    private String refresh;
}

刷新事件监听类:

less 复制代码
@Component
@Slf4j
public class RefreshListener {

    @Resource
    RefreshScope refreshScope;

    @ApolloConfigChangeListener(interestedKeyPrefixes = {"test"})
    private void refresh(ConfigChangeEvent changeEvent){
        refreshScope.refresh("refreshConfig");
    }
}

3.EnvironmentChangeEvent

java 复制代码
监听器:
ApolloConfigChangeListener
更新Key:
applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));

事件监听类:

java 复制代码
@Component
@Slf4j
public class UserPropertiesRefresh implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @ApolloConfigChangeListener(interestedKeyPrefixes = {"user."})
    private void refresh(ConfigChangeEvent changeEvent){
        applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
        log.info("change key: {}",changeEvent.changedKeys());
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

参考:动态刷新配置

多环境管理

使用namespace

这个的隔离级别并不友好

多节点

回滚

有个坑:apollo的回滚有问题,建议手动修改。看了官方的issue,好像是设计就是这样的,和使用习惯不同导致。未发布的是可以回滚的,已发布的会作为最新的发布点,是回滚不了的。

1.2 版本回滚bug

刷新机制

http长轮询数据,不维护长连接

认识长轮询:配置中心是如何实现推送的?

总结

以上是关于apollo使用的记录,好记性不如烂笔头~

相关推荐
几颗流星3 分钟前
Rust 像素级绘图入门:Pixels 库核心机制解析
后端·rust
乌日尼乐9 分钟前
【Java基础整理】封装、继承、抽象、接口和多态
java·后端
heartbeat..10 分钟前
JavaWeb 入门 - HttpServletResponse 响应对象 详解
java·网络·http·web·response
zs宝来了11 分钟前
Spring Boot启动流程源码深度解析:电商订单系统面试实战
java·spring boot·面试·源码分析·电商
智航GIS12 分钟前
9.1 多线程入门
java·开发语言·python
我是谁的程序员13 分钟前
不用 Instruments 而在 Windows 环境下测试 iOS App
后端
ServBay13 分钟前
PHP 8.6 新特性预览,更简洁的语法与更严谨的类型控制
后端·php
文心快码BaiduComate16 分钟前
用Comate开发我的第一个MCP——让Vibe Coding长长脑子
前端·后端·程序员
神奇小汤圆19 分钟前
Spring Boot + 执行管道:让业务流程清晰可控
后端
消失的旧时光-194320 分钟前
从 Java 接口到 Dart freezed:一文彻底理解 Dart 的数据模型设计
java·开发语言·flutter·dart