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

news/2024/11/16 16:29:05/文章来源:https://www.cnblogs.com/duanxiaobiao/p/18549451

一、前言

​ 我们经常会在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:8060bootstrap:enabled: trueeagerLoad:enabled: trueserver: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 {@ResourceApplicationContext applicationContext;@Overridepublic 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834655.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JUC---ThreadLocal原理详解

什么是ThreadLocal? 通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK 中自带的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类…

一文讲透 FPGA CDC 多bit跨时钟域同步-hand-shanking机制

一、背景 数据的跨时钟域处理是FPGA开发过程中的常见问题,存在两种情况慢时钟向快时钟同步:只需在快时钟域打两拍即可。其RTL如下:打拍同步的原理:大家在初学FPGA时,经常听过FPGA中对信号打拍可以有效得避免亚稳态,而且一般要打两拍,其数学本质是如果打一拍发生错误得概…

KBPC3510-ASEMI整流桥KBPC3510参数、封装、尺寸

KBPC3510-ASEMI整流桥KBPC3510参数、封装、尺寸编辑:ll KBPC3510-ASEMI整流桥KBPC3510参数、封装、尺寸 型号:KBPC3510 品牌:ASEMI 封装:KBPC-4 正向电流:35A 反向电压:1000V 引脚数量:4 芯片个数:4 芯片尺寸:50MIL 漏电流:>10ua 恢复时间:>2000ns 浪涌电流:…

IDEA中操作表

Navicat中创建的表,同时也可以在IDEA中打开。 IDEA中侧边可以创建架构 可以选择相应排序规则以及创建新的表,但不如navicat方便

使用while循环分别对两个vector进行赋值,该怎么做

问题 在写程序的时候遇到了这样一个问题,见代码 #include <iostream> #include <vector>using namespace std;bool isequal(vector<int> vshort, vector<int> vlong) {for (int index = 0; index != vshort.size(); index++)if (vshort[index] != vlo…

合并具有文本框的Word文档:VBA代码批量操作

本文介绍基于VBA语言,对大量含有图片、文本框与表格的Word文档加以批量自动合并,并在每一次合并时添加分页符的方法~本文介绍基于VBA语言,对大量含有图片、文本框与表格的Word文档加以批量自动合并,并在每一次合并时添加分页符的方法。在我们之前的文章中,介绍过基于Pytho…

streamstring类介绍

std::stringstream 是 C++ 标准库中提供的一个类,定义在头文件 <sstream> 中。它是基于字符串的流(stream),允许像操作输入流(std::cin)或输出流(std::cout)那样,操作字符串内容。 std::stringstream 是 std::iostream 的派生类,支持同时进行字符串解析(输入)…

爬虫

程序示例: import java.util.regex.Matcher; import java.util.regex.Pattern;public class RegexDemo6 {public static void main(String[] args) {/** 有如下文本, 请按照要求爬取数据. * Java 自从 95 年问世以来, 经历了很多版本, 目前企业中用的最多的是 Java8 和 Java11,…

将数值转换为字符串的函数

在 C++ 中,itoa 和 sprintf 是用于将数值转换为字符串的经典函数。然而,它们有一定的局限性或者安全性问题,现代 C++ 更倾向于使用标准库的解决方案,如 std::to_string 和 std::stringstream,来代替这些函数。 1. itoa 的替代 itoa 是一种将整数转换为字符串的函数,但它不…

20222406 2024-2025-1 《网络与系统攻防技术》实验五实验报告

20222406 2024-2025-1 《网络与系统攻防技术》实验五实验报告 1.实验内容对网站进行 DNS 域名查询,包括注册人、IP 地址等信息,还通过相关命令查询 IP 地址注册人及地理位置。尝试获取 QQ 好友 IP 地址并查询其地理位置。使用 nmap 对靶机环境扫描,获取靶机 IP 活跃状态、开…

delphi 新版内存表 FDMemTable

c++builder XE 官方demo最全60多个 http://community.embarcadero.com/blogs?view=entry&id=8761FireDAC.Comp.Client用好FDMemTable代替之前的ClientDataSet,以前ClientDataSet内存表转换太繁琐了步骤。TClientDataSet *cds = new TClientDataSet(this); DataSetProvid…

理想雪 - 翠鸟协会

写在前面3844 字 | 小说 | 热爱 | 思考 | 表达 | 坚定 | 证明 | 坚守《理想雪》系列故事均为架空世界观,所有人名、地名等与现实世界无任何关联。该系列只且仅只为了说明,小说作者在该情境下会诞生的想法和采取的行动,以及背后的世界观、价值观和人生观。因此将具有强烈的个…