IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Boot 的配置 -> 正文阅读

[Java知识库]Spring Boot 的配置

前言

对于微服务而言配置本地化是个很大的鸡肋,不可能每次需要改个配置都要重新把服务重新启动一遍,因此最终的解决方案都是将配置外部化,托管在一个平台上达到不用重启服务即可一次修改多处生效的目的。

但是对于单体应用的Spring Boot项目而言,动态刷新显然是有点多余,反正就一个服务,改下重启不就行了?

然而在某些特殊的场景下还是必须用到动态刷新的,如下:

  1. 添加数据源:对接某个第三方平台的时候,你不可能每次添加一个数据源都要重启下服务

  2. 固化的对接:大量的固定对接方式,只是其中的某个固定的代码段不同,比如提供视图中的字段不同,接口服务中字段不同等情况。

当然以上列举的两种场景每个公司都有不同的解决方案,这里不做深究。

微服务下有哪几种主流的方案?

微服务下的动态配置中心有三种主流的方式,如下图:

上图中的三种配置中心方案可以说是现在企业中使用率最高的,分别是:

  1. Nacos:阿里巴巴的最近开源的项目,这个家伙很牛逼,一个干掉了Eureka(停更)和Config+Bus,既能作为配置中心也能作为注册中心,并且有自己的独立的 管理平台,可以说是现在最主流的一种。

  2. Config+Bus:早期在用的微服务配置中心,可以依托GitHub管理微服务的配置文件,这种现在也是有不少企业在用,但是需要自己独立部署一个微服务,和Nacos相比逊色了不少。

  3. Apollo:携程开源项目Apollo,这个也是不少企业在用,陈某了解的不多,有兴趣的可以深入研究下。

针对Spring Boot 适用的几种方案?

其实上述三种都可以在Spring Boot项目中适配,但是作为单体应用有些重了,下面作者简单的介绍两种可用的方案。

Spring Boot+Nacos(不推荐)

不得不说阿里巴巴确实挺有野心,阿里要做的其实是一个微服务生态,Nacos不仅仅可以作为Spring Cloud的配置和注册中心,也适配了Dubbo、K8s,官方文档中对于如何适配都做了详细的介绍,作者 这里就不再详细介绍了,如下图:

当然Nacos对Spring、Spring Boot 项目同样适用。

如何使用呢?这里作者只提供下思路,不做过多的深究,这篇在作者下个专栏Spring Cloud 进阶会详细介绍:

  1. 下载对应版本的Nacos,启动项目,访问http://localhost:8848进入Nacos的管理界面;

  2. Spring Boot 项目引入Nacos的配置依赖nacos-config-spring-boot-starter,配置Nacos管理中心的地址。

  3. @NacosPropertySource@NacosValue两个注解结合完成。

  • @NacosPropertySource:指定配置中心的dataId,和是否自动刷新

  • @NacosValue替代@Value注解完成属性的自动装配

  1. 如果公司项目做了后台管理,则可以直接调用Nacos开放的API修改对应配置的值(替代了Nacos管理界面的手动操作),API的地址:https://nacos.io/zh-cn/docs/open-api.html

此种方案虽说可以实现配置的动态刷新,但是还要集成Nacos,启动一个Nacos的服务,完全是有点大材小用了,实际项目中不推荐使用。

Spring Boot+Config+actuator(推荐)

此种方案实际使用的是Config配置中心,但是不像Nacos那般重,完全适用于单体应用的SpringBoot项目,只需要做小部分的更改即可达到效果。

方案一(不推荐)

  1. 添加Config的依赖,如下:

<!--?springCloud的依赖-->
<dependencyManagement>
????<dependencies>
????????<dependency>
????????????????<groupId>org.springframework.cloud</groupId>
????????????????<artifactId>spring-cloud-dependencies</artifactId>
????????????????<version>Hoxton.SR3</version>
????????????????<type>pom</type>
????????????????<scope>import</scope>
????????????</dependency>
????</dependencies>
</dependencyManagement>

<!--?config的依赖-->
<dependency>
??????<groupId>org.springframework.cloud</groupId>
??????<artifactId>spring-cloud-starter-config</artifactId>
????</dependency>

??<!--?actuator的依赖-->
????<dependency>
??????<groupId>org.springframework.boot</groupId>
??????<artifactId>spring-boot-starter-actuator</artifactId>
????</dependency>
  1. 配置文件中暴露Spring Boot的端点,如下:

management.endpoints.web.exposure.include=*
  1. 配置文件中新增三个属性配置:

config.version=22
config.app.name=dynamic-project
config.platform=mysql
  1. 结合@RefreshScope注解动态刷新,写个Controller,如下:

@RestController
//@RefreshScope该注解必须标注,否则无法完成动态更新
@RefreshScope
public?class?DynamicConfigController?{
????@Value("${config.version}")
????private?String?version;

????@Value("${config.app.name}")
????private?String?appName;

????@Value("${config.platform}")
????private?String?platform;


????@GetMapping("/show/version")
????public?String?test(){
????????return?"version="+version+"-appName="+appName+"-platform="+platform;
????}
  1. 启动项目测试,浏览器访问http://localhost:8080/show/version,返回信息如下图:

  1. 修改target目录下的配置文件,如下:

config.version=33
config.app.name=dynamic-project
config.platform=ORACLE
  1. POST请求http://localhost:8080/actuator/refresh接口,手动刷新下配置(必须,否则不能自动刷新)

  2. 浏览器再次输入http://localhost:8080/show/version,结果如下图:

可以看到,配置已经自动修改了,结束。

方案二(推荐)

看到了方案一觉得如何?是不是有点鸡肋了

第一个问题:为什么还要调用一次手动刷新呢?

第二个问题:只能手动的在配置文件中改吗?如果想在后台管理系统改怎么办?

想要解决上述两个问题还是要看下Config的源码,代码关键部分在org.springframework.cloud.context.refresh.ContextRefresher#refresh()方法中,如下图:

因此只需要在修改属性之后调用下ContextRefresher#refresh()(异步,避免一直阻塞等待)方法即可。

为了方便测试,我们自己手动写一个refresh接口,如下:

@GetMapping("/show/refresh")
????public?String?refresh(){
????????//修改配置文件中属性
????????HashMap<String,?Object>?map?=?new?HashMap<>();
????????map.put("config.version",99);
????????map.put("config.app.name","appName");
????????map.put("config.platform","ORACLE");
????????MapPropertySource?propertySource=new?MapPropertySource("dynamic",map);
????????//将修改后的配置设置到environment中
????????environment.getPropertySources().addFirst(propertySource);
????????//异步调用refresh方法,避免阻塞一直等待无响应
????????new?Thread(()?->?contextRefresher.refresh()).start();
????????return?"success";
????}

上述代码中作者只是手动设置了配置文件中的值,实际项目中可以通过持久化的方式从数据库中读取配置刷新。

下面我们测试看看,启动项目,访问http://localhost:8080/show/version,发现是之前配置在application.properties中的值,如下图:

调用refresh接口:http://localhost:8080/show/refresh重新设置属性值;

再次调用http://localhost:8080/show/version查看下配置是否修改了,如下图:

从上图可以发现,配置果然修改了,达到了动态刷新的效果。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:33:33  更:2022-05-01 15:35:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:44:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码