微服务注册中⼼2

5.Nacos配置管理

Nacos除了可以做注册中⼼,同样可以做配置管理来使⽤

5.1 统⼀配置管理

当微服务部署的实例越来越多,达到数⼗、数百时,逐个修改微服务配置就会让⼈抓狂,⽽且很容易出错。我们需要⼀种统⼀配置管理⽅案,可以集中管理所有实例的配置。

Nacos⼀⽅⾯可以将配置集中管理,另⼀⽅可以在配置变更时,及时通知微服务,实现配置的热更新。

在业界常⻅的服务配置中⼼,有下⾯这些:

  • Apollo是由携程开源的分布式配置中⼼。特点有很多,⽐如:配置更新之后可以实时⽣效,⽀持灰度发布功能,并且能对所有的配置进⾏版本管理、操作审计等功能,提供开放平台API。并且资料也写的很详细
  • Disconf是由百度开源的分布式配置中⼼。它是基于Zookeeper来实现配置变更后实时通知和⽣效的
  • SpringCloud Config这是Spring Cloud中带的配置中⼼组件。它和Spring是⽆缝集成,使⽤起来⾮常⽅便,并且它的配 置存储⽀持Git。不过它没有可视化的操作界⾯,配置的⽣效也不是实时的,需要重启或去刷新。
  • Nacos这是SpingCloud alibaba技术栈中的⼀个组件,前⾯我们已经使⽤它做过服务注册中⼼。其实它也集成了服务配置的功能,我们可以直接使⽤它作为服务配置中⼼。
5.1.1 在nacos中添加配置⽂件

​​​​​​​

注意:项⽬的核⼼配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的⼀些配置还是保存在微服务本地⽐较好。

5.1.2 从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项⽬启动。

但如果尚未读取application.yml,⼜如何得知nacos地址呢?

因此spring引⼊了⼀种新的配置⽂件: bootstrap.yaml⽂件,会在application.yml之前被读取,流程如下:

配置实现步骤:

1)引⼊nacos-config依赖

复制代码
<dependency> 
 <groupId>com.alibaba.cloud</groupId> 
 <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> 
</dependency>

2)添加bootstrap.yaml

不能使⽤原来的application.yml作为配置⽂件,⽽是新建⼀个bootstrap.yml作为配置⽂件配置⽂件优先级(由⾼到低):

bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

复制代码
spring:
 application:
   name: service-product
 cloud:
   nacos:
     config:
       server-addr: 127.0.0.1:8848 #nacos中⼼地址
       file-extension: yaml # 配置⽂件格式
 profiles:
   active: dev # 环境标识,开发环境

4) 在nacos中添加配置

5.2 配置热更新

我们最终的⽬的,是修改nacos中的配置后,微服务中⽆需重启即可让配置⽣效,也就是配置热更新。要实现配置热更新,可以使⽤两种⽅式:

配置中⼼添加配置

复制代码
config:
 appName: product
5.2.1.⽅式⼀

在@Value注⼊的变量所在类上添加注解@RefreshScope:

复制代码
@RestController
@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController {
 @Value("${config.appName}")
 private String appName; 
 @GetMapping("/nacos-config-test1") 
 public String nacosConfingTest1() {
 return appName;
 } 
}
5.2.2.⽅式⼆

硬编码⽅式

复制代码
@RestController 
public class NacosConfigController {
 @Autowired 
 private ConfigurableApplicationContext applicationContext; 
 
 @GetMapping("/nacos-config-test2") 
 public String nacosConfingTest2() { 
 return applicationContext.getEnvironment().getProperty("config.app
Name"); 
 }
}
5.3 配置共享

当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就考虑可不可以将公共配置⽂件提取出来

5.3.1 同服务内配置共享

现步骤:

1.新建⼀个以 spring.application.name 命名的配置⽂件,然后将其所有环境的公共配置放在⾥

2.新建⼀个名为service-product-test.yaml配置存放测试环境的配置

3.新建⼀个名为service-product-dev.yaml配置存放开发环境的配置

4.在两个环境⽂件中配置独有信息

复制代码
#多配置⼀段
config:
  env: test
#多配置⼀段
config:
  env: dev

5.添加测试⽅法

复制代码
@RestController 
@RefreshScope
public class NacosConfigController {
 @Value("${config.env}")
 private String env; 
 
 //3 同⼀微服务的不同环境下共享配置
 @GetMapping("/nacos-config-test3") 
 public String nacosConfingTest3() { 
 return env; 
 }
}
5.3.2 不同微服务共享配置

不同服务之间实现配置共享的原理类似于⽂件引⼊,就是定义⼀个公共配置,然后在当前配置中引⼊

1.在nacos中定义⼀个DataID为all-service.yaml的配置,⽤于所有微服务共享

复制代码
spring: 
datasource: 
driver-class-name: com.mysql.jdbc.Driver 
url: jdbc:mysql:///shopserverTimezone=UTC
username: root 
password: root 
cloud:
 nacos: 
 discovery: 
 server-addr: 127.0.0.1:8848

2.修改bootstrap.yaml

复制代码
spring: 
application: 
name: service-product 
cloud: 
nacos: 
config: 
server-addr: 127.0.0.1:8848 #nacos中⼼地址 
file-extension: yaml # 配置⽂件格式 
shared-dataids: all-service.yaml # 配置要引⼊的配置
refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置 
profiles: 
active: dev # 环境标识

3.启动商品微服务进⾏测试

配置共享的优先级

当nacos、服务本地同时出现相同属性时,优先级有⾼低之分:

相关推荐
mqiqe1 天前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
伍一511 天前
03-文件管理模块-一个看似简单的模块藏着多少细节
java·ruoyi·若依
gugucoding1 天前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
Nebula_g1 天前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
AC赳赳老秦1 天前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
段一凡-华北理工大学1 天前
AI推动工业智能化转型~系列文章20:工业 AI 平台架构:云-边-端协同的技术体系
人工智能·python·架构·工业平台·云-边协同
CodeBlog-star1 天前
Harness Engineering:Pi Agent 架构深度解析
人工智能·python·架构·harness工程
IT大白鼠1 天前
OpenBao开源密钥管理系统:技术架构、核心功能与行业应用研究
架构·开源·aiops·openbao
小强库计算机毕业设计1 天前
SpringBoot+Vue3 学生宿舍管理系统实战
java·spring boot·后端·vue·学生宿舍管理系统
CC大煊1 天前
从夯到拉:锐评国内向量模型选型
人工智能·ai·架构·langchain