Nacos 配置管理
- nacos不仅可以作为服务注册中心,还可以进行配置管理
1.为什么需要进行nacos进行配置管理?
- :当注册到微服务的实例很多,逐个修改微服务实例的配置,会诱发高血压心脑血管疾病,所以使用注册中心nacos来集中管理所有微服务实例配置变得十分重要。
2.Nacos服务端添加配置流程:
- 在弹出的表单中填写信息配置
2.2注意点:项目的核心配置,没必要使用nacos进行管理,热配置才有放到nacos管理的必要
3.如果尚未读取application.yml,又如何得知nacos地址,加载配置呢?
3.1spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
3.2 微服务(user-service)实例加载nacos配置步骤:
1.依赖
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- user-service 添加bootstrap.yml,内容如下:
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev(nacos服务定义的dev命名空间)
cloud:
nacos:
config:
prefix: ${spring.application.name} # 添加这项使用上面的name,不添加使用的是上面application.yml中的spring.application.name
# 从nacos服务器dev空间userservice-dev.yaml 拉取配置文件
server-addr: localhost:8848 # Nacos地址
file-extension: yaml # 文件后缀名
namespace: 92937209-6878-482c-ab7a-24de666d8985 # dev命名空间ID(一定要查看是否在对应的命名空间下的配置文件,否则拉取失败)
- 这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据,
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
作为文件id,来读取配置。
本例中,就是去读取userservice-dev.yaml
:下图的server-addr有误,要在config下,否则获取不到地址
- 获取nacos配置
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
// ...略
}
- 效果
4.nacos配置热更新(不需要重启微服务,就可以拉取配置)
方式一:在@Value注入的变量所在类上添加注解@RefreshScope:
@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
@Autowired
private UserService userService;
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
}
方式二:使用@ConfigurationProperties注解代替@Value注解。
- 在user-service服务中,添加一个类,读取patterrn.dateformat属性:
package cn.cheung.user.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
- 在UserController中使用这个类代替@Value:
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private PatternProperties patternProperties;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
}
}
5.配置共享
- 在微服务启动是,回去nacos服务端,读取多个配置:
[spring.application.name]-[spring.profiles.active].yaml
:如 userservice-dev.yaml[spring.application.name].yaml
: 如 userservice.yaml
- 而
[spring.application.name]
不包含环境配置,因此可以被多个环境共享
5.1使用步骤:
- 在nacos中添加一个userservice.yaml 文件:
- 在user-service 中读取nacos中的配置文件,修改PatternProperties类,读取新添加的属性:
- 在user-service服务中,修改UserController,添加一个方法:
- 再开启一个不同环境的user-service,测试是否共享
这样,UserApplication(8081)使用的profile是dev,UserApplication2(8082)使用的profile是test。
启动UserApplication和UserApplication2
访问http://localhost:8081/user/prop,结果:
访问http://localhost:8082/user/prop,结果:
可以看出来,不管是dev,还是test环境,都读取到了envSharedValue这个属性的值。
5.2 配置共享优先级
- 当nacos、服务本地同时出现相同属性时,优先级有高低之分: