目录
1.统一配置管理
当微服务实例越来越多,配置就更繁杂,我们需要一个统一配置管理方案,可以集中管理所有实例的配置。最好能及时修改更新,不重启(即热更新)。
2.创建配置
在 Nacos 中添加配置信息:
在弹出表单中填写配置信息
写一个日期格式配置
pattern: dateformat: yyyy-MM-dd HH:mm:ss:SSS
注意:项目的核心配置,需要热更新的配置才有放到 nacos 管理的必要。基本不会变更的一些配置(例如数据库连接)还是保存在微服务本地比较好。
3.拉取配置
在没加入 Nacos 配置之前,获取配置是这样:
加入 Nacos 配置之后,获取配置是这样:
需要先读取nacos中的配置文件,所以把nacos地址放在application.yml中就不合适了。我们必须找一个比application.yml优先级高的存放nacos地址,所以使用bootstrap.yml
3.1引入依赖
在需要的服务user-server引入Nacos的配置管理客户端依赖
<!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
如果控制台报错!!Param ‘serviceName‘ is illegal, serviceName is blank 说明你的版本不再默认优先加载bootstrap.yml文件,需要添加这个
bootstrap依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
3.2配置
在user-server中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml。
spring: application: name: user-server # 服务名称 profiles: active: dev # 环境 cloud: nacos: server-addr: localhost:8848 # nacos地址 config: file-extension: yaml # 后缀名
我们使用代码验证是否拉取成功:
在UserController读取日期配置并返回
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
访问http://localhost:8081/user/now
配置拉取成功
4.配置热更新
4.1@RefreshScope+@Value
在@Value
注入的变量所在类上添加注解@RefreshScope
如UserController:
4.2@ConfigurationProperties
使用@ConfigurationProperties
注解读取配置文件内容进行属性绑定
新建一个配置类
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
//配置属性
private String dateformat;
}
在controller曾调用
@Autowired
private PatternProperties properties;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
}
5.多环境配置共享
微服务启动时会从nacos读取多个配置文件:
- [spring.application.name]-[spring.profiles.active].yaml,例如:user-server-dev.yaml
- [spring.application.name].yaml,例如:user-server.yaml
无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件
5.1添加共享配置
在nacos控制台新建一个配置文件user-server.yaml:
5.2在user-server中读取配置
在配置类添加新属性envSharedValue:
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
private String envSharedValue;
}
修改 UserController,返回PatternProperties对象查看是否读取成功
@Autowired
private PatternProperties properties;
@GetMapping("prop")
public PatternProperties properties(){
return properties;
}
启动两个UserApplication实例,使用不同环境:
- 第一个UserApplication使用nacos的集中配置user-server-dev.yaml和共享配置user-server.yaml
- 第二个UserApplication只使用共享配置user-server.yaml
小技巧:修改实例运行环境如使用test测试环境
5.3访问
http://localhost:8081/user/prop
http://localhost:8082/user/prop
从结果看出,两个实例都读取了共享配置user-server.yaml的envSharedValue属性和各自所属的环境配置。
5.4不同微服务之间环境共享
不同微服务之间的环境共享可以通过配置文件实现,有两种方式
在nacos新建一个配置文件common.yaml
5.4.1extension-configs属性
在user-server
bootstrap.yml
spring: application: name: user-server # 服务名称 cloud: nacos: server-addr: localhost:8848 # nacos地址 config: extension-configs: # 多微服务间共享的配置列表 - dataId: common.yaml # 要共享的配置文件id
controller
@Value("${common.commonValue}")
private String commonValue;
@GetMapping("common")
public String common(){
return commonValue;
}
在order-server
bootstrap.yml
spring: application: name: order-server # 服务名称 cloud: nacos: server-addr: localhost:8848 # nacos地址 config: extension-configs: # 多微服务间共享的配置列表 - dataId: common.yaml # 要共享的配置文件id
controller
@Value("${common.commonValue}")
private String commonValue;
@GetMapping("common")
public String common(){
return commonValue;
}
访问 http://localhost:8081/user/common
访问 http://localhost:8080/order/common
可以看到order-server和use-server读取了相同配置
5.4.2shared-configs属性
将上述extension-configs属性直接修改为shared-configs属性即可
5.5配置优先级
当 nacos、服务本地同时出现相同属性时,优先级有高低之分。
在一个服务中:
在多服务中: