微服务注册中⼼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、服务本地同时出现相同属性时,优先级有⾼低之分:

相关推荐
小猿姐2 小时前
# KubeBlocks for MSSQL 高可用实现
数据库·架构·sql server
pshdhx_albert7 小时前
AI agent实现打字机效果
java·http·ai编程
古译汉书7 小时前
【IoT死磕系列】Day 9:架构一台“自动驾驶物流车”,看8种协议如何协同作战
网络·arm开发·单片机·物联网·tcp/ip·架构·自动驾驶
沉鱼.447 小时前
第十二届题目
java·前端·算法
KaneLogger8 小时前
从传统笔记到 LLM 驱动的结构化 Wiki
人工智能·程序员·架构
斯外戈的小白8 小时前
【Agent】LangChain 1.0架构
架构·langchain
赫瑞8 小时前
数据结构中的排列组合 —— Java实现
java·开发语言·数据结构
小橘子8319 小时前
(学习)Claude Code 源码架构深度解析
学习·程序人生·架构
周末也要写八哥9 小时前
多进程和多线程的特点和区别
java·开发语言·jvm
C'ᴇsᴛ.小琳 ℡10 小时前
架构技术演进的方向
架构