SpringCloud-配置中心
一、配置中心简介
配置中心是一种用于集中管理微服务的配置信息的工具。它可以帮助开发团队在不同环境中轻松地管理和更新配置信息,如数据库连接信息、服务端口、日志级别等。通过配置中心,开发团队可以实现配置的集中管理、动态更新和版本控制,从而提高微服务的灵活性和可维护性
1. 微服务的配置问题
首先我们来看一下,微服务架构下关于配置文件的一些问题:
-
配置文件相对分散,不利于维护。
在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
-
配置文件不方便区分环境。
微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
-
配置文件无法实时更新。
我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。
基于上面这些问题,我们就需要配置中心的加入来解决这些问题。
-
可以统一管理配置文件
-
配置文件可以区分环境。给每个微服务设置多个配置文件,在启动微服务时,可以设置拉取指定的配置文件
比如:一个微服务,在配置中心提供多个配置文件。一个开发环境的配置文件,一个测试环境的配置文件,一个生产环境的配置文件
然后:在启动微服务时,可以指定要拉取哪个环境的配置文件
-
配置文件可以实时更新,不需要重启微服务
2. 配置中心的思路是
- 首先把项目中各种配置全部都放到一个集中的地方进行统一管理。
- 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
- 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。
SpringCloudAlibaba Nacos本身就可以管理配置文件。
我们只要把配置文件放到nacos上,微服务就可以从nacos里拉取配置、实现配置的动态刷新了
二、配置中心Nacos入门
SpringCloud本身提供了一种配置中心:SpringCloudConfig,使用相对麻烦
SpringCloudAlibaba提供了配置中心:Nacos,使用更简单
1. 使用步骤
把配置文件托管到配置中心Nacos
修改微服务
添加依赖坐标nacos-config 删除application.yaml,创建bootstrap.yaml, 在bootstrap.yaml里,配置 从哪拉取配置文件
启动微服务,测试功能是否正常
2.示例
把配置文件托管到nacos
- 新增配置
- 设置配置信息
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。
基本不会变更的一些配置还是保存在微服务本地比较好。
从nacos上拉取配置
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
但如果尚未读取application.yml,又如何得知nacos地址呢?
因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
添加依赖坐标
- 在用户服务的pom.xml中,添加nacos配置中心的坐标
- 注意:一旦引入了nacos配置中心的坐标,就必须有
bootstrap.yaml
配置文件
<!--nacos配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
添加bootstrap.yaml
- 先把用户服务的application.yaml删除掉(配置文件的所有内容,都已经托管到nacos上了)
- 再给用户服务创建
bootstrap.yaml
。注意:名称必须是bootstrap
spring:
cloud:
nacos:
config:
server-addr: localhost:8848 #配置中心nacos的地址
prefix: user-service # 要加载的配置文件,{application}部分
file-extension: yaml # 要加载的配置文件,{extension}后缀名部分
profiles:
active: dev # 激活的环境名称,配置文件中{profile}部分
3) 测试
打开浏览器,所有功能都可以正常使用,说明已经成功拉取到了配置参数
打开浏览器,访问 http://localhost:8080/user/company,可以看到公司名称,也说明成功拉取到了配置参数
三、配置参数的动态刷新
Nacos支持动态刷新配置,也叫热更新:只要在nacos里修改了配置,微服务不需要重启,就会自动拉取最新的配置参数。
有两种实现方案:
- 方案1:使用@Value获取参数值,并在bean对象上添加注解@RefreshScope
- 方案2【推荐】:使用@ConfigurationProperties封装配置参数,会自动拉取最新配置
方案1: @Value和@RefreshScope
- 在UserController里读取参数
- 在UserController里使用@Value读取了company.name配置参数
- 在UserController上添加注解
@RefreshScope
@RestController
@RefreshScope
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Value("${company.name}")
private String companyName;
@GetMapping("/{id}")
public User findById(@PathVariable("id") Long id) {
return userService.findById(id);
}
@GetMapping("/company")
public String company(){
return companyName;
}
}
-
打开浏览器访问 http://localhost:7070/user/company,先查看一下company.name原始值
-
在nacos里修改
company.name
的值把
company.name
的值修改为“传智教育”
方案2: @ConfigurationProperties
- 创建Company类,用于封装配置参数
@Data
@ConfigurationProperties(prefix = "company")
public class Company {
private String name;
}
- 在引导类上添加
@EnableConfigurationProperties
,启动Company类
@EnableConfigurationProperties(Company.class)
@EnableDiscoveryClient
@SpringBootApplication
@MapperScan("com.itheima.user.mapper")
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
-
修改UserController
去掉
@RefreshScope
注解注入
Company
对象添加方法,浏览器访问时,把Company对象返回给客户端 显示到页面上
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Value("${company.name}")
private String companyName;
@Autowired
private Company company;
@GetMapping("/{id}")
public User findById(@PathVariable("id") Long id) {
return userService.findById(id);
}
@GetMapping("/company")
public String companyStr(){
return companyName;
}
@GetMapping("/companyObj")
public Company companyObj(){
return company;
}
}
-
功能测试
先打开浏览器访问 http://localhost:8080/user/companyObj,查看原始参数值
在Nacos里修改company.name的值
再打开浏览器,直接刷新页面,可以看到参数值已经变成最新的了
四、配置共享
在实际开发中,一个服务通常有多个配置文件。在不同环境中,只要激活对应的配置文件即可。例如:
- user-service-dev.yaml:作为用户服务的开发环境配置
- user-service-test.yaml:作为用户服务的测试环境配置
- user-service-prod.yaml:作为用户服务的生产环境配置
但是这多个环境的配置文件中,可能有大部分配置参数都是完全相同的,如果在每个文件里都复制一份的话,修改维护起来会比较麻烦,这时候可以使用共享的配置文件的:
- 再创建一个user-service.yaml:不带环境标识的配置文件,会被所有环境共享
1. 准备多环境配置
准备dev和test两个配置文件
在Nacos配置中心里已经有了user-service-dev.yaml
。
我们再增加一个配置文件 user-service-test.yaml
,内容如下:
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///cloud_user?useSSL=false
username: root
password: mysql
logging:
level:
com.itheima.user: debug
pattern:
dateformat: HH:mm:ss.SSS
company:
name: test
准备多环境的启动链接
在idea里创建dev和test的启动链接,创建方式如下:
- dev环境,激活
dev
- test环境,激活
test
2. 多环境配置共享
创建共享配置文件
在Nacos的配置中心里,创建一个用户服务的共享配置文件
读取配置参数值
修改UserController,读取共享配置项aaa
的值
@RestController
@RequestMapping("/user")
public class UserController {
...略...;
@Value("${aaa}")
private String shareValue;
@GetMapping("/share")
public String share(){
return shareValue;
}
}
启动测试
同时启动两个环境的用户服务,
打开浏览器访问:
- 开发环境dev:http://localhost:8080/user/share,页面上可以看到共享的配置项“共享配置值”
- 测试环境test:http://localhost:8081/user/share,页面上可以看到共享的配置项“共享配置值”
3. 配置共享的优先级
实际开发中,通常是:
- 在项目内使用bootstrap.yaml中配置 不变的、不需要修改的参数
- 在配置中心里配置可能变化的、可能修改的参数
当nacos、服务本地同时出现相同属性时,优先级高的生效。优先级从高到低如下:
- Nacos里的
服务名-{profile}.yaml
:Nacos里激活的某一环境的配置文件 - Nacos里的
服务名.yaml
:Nacos里的共享配置文件 - 本地的
application-{profile}.yaml
- 本地的
application.yaml
转载自:https://juejin.cn/post/7362789570217738303