day12_SpringCloud(网关、Nacos 配置中心、哨兵组件)-2 Nacos 配置中心
Nacos除了可以做注册中心,同样可以做配置管理来使用。
2.1 统一配置管理
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
2.2 Nacos入门
2.2.1 Nacos中添加配置
在Nacos服务端创建一个配置,如下所示:
然后在弹出的表单中,填写配置信息:
2.2.2 微服务集成配置中心
微服务需要进行改造,从Nacos配置中心中获取配置信息进行使用。
步骤:
1、在spzx-cloud-user微服务中,引入spring-cloud-starter-alibaba-nacos-config依赖
<!-- nacos作为配置中心时所对应的依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、在spzx-cloud-user项目的 /src/main/resources/application.yml 配置文件中配置 Nacos Config 地址并引入服务配置
# 配置数据库的连接信息
spring:
cloud:
nacos:
config:
server-addr: 192.168.136.142:8848
config:
import:
- nacos:spzx-cloud-user-dev.yml
2.2.3 读取自定义配置
@Value
通过@Value注解读取自定义配置,如下所示:
@RestController
@RequestMapping(value = "/api/user")
@Slf4j
public class UserController {
@Autowired
private UserService userService ;
@Value("${pattern.dateformat}")
private String pattern ;
@GetMapping(value = "/findUserByUserId/{userId}")
public User findUserByUserId(@PathVariable(value = "userId") Long userId , @RequestHeader(name = "Truth")String header) {
log.info("UserController...findUserByUserId方法执行了... ,header: {} , dateformat: {} " , header , pattern);
return userService.findUserByUserId(userId) ;
}
}
@ConfigurationProperties
也可以通过实体类,配合@ConfigurationProperties注解读取自定义配置,代码如下所示:
1、定义一个实体类,代码如下所示:
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat ;
}
2、在启动类上添加@EnableConfigurationProperties注解,如下所示:
@SpringBootApplication
@EnableConfigurationProperties(value = { PatternProperties.class })
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class , args) ;
}
}
3、使用该实体类,代码如下所示:
@RestController
@RequestMapping(value = "/api/user")
@Slf4j
public class UserController {
@Autowired
private UserService userService ;
@Value("${pattern.dateformat}")
private String pattern ;
@Autowired // 注入实体类
private PatternProperties patternProperties ;
@GetMapping(value = "/findUserByUserId/{userId}")
public User findUserByUserId(@PathVariable(value = "userId") Long userId , @RequestHeader(name = "Truth")String header) {
log.info("UserController...findUserByUserId方法执行了... ,header: {} , dateformat: {} " , header , patternProperties.getDateformat());
return userService.findUserByUserId(userId) ;
}
}
2.3 配置热更新
我们最终的目的,是修改Nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。实现配置的热更新有两种方式:
方式一:在@Value注入的变量所在类上添加注解 @RefreshScope
方式二:通过实体类,配合@ConfigurationProperties注解读取配置信息,自动支持热更新
2.4 配置内容共享
如果多个环境存在相同的配置,那么此时就可以将相同的配置抽取到一个新的配置中,然后在微服务中再次导入新的配置。那么此时就实现了多环境配置共享。
案例演示:
1、在Nacos上创建一个不带环境的配置
2、微服务读取共享配置,在实体类中添加对应的属性
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat ;
private String envSharedValue ; // 读取共享配置属性
}
3、在微服务的配置文件中,通过spring.config.import导入最新的配置
spring:
config:
import:
- nacos:spzx-cloud-user-dev.yml
- nacos:spzx-cloud-user.yml # 导入共享配置
# 项目中的配置提取时,所有的环境都相同的配置我们会抽取到一个公共配置中
# 其他的不同值的配置 会创建不同命名空间、分组、环境后缀的配置文件编写配置
# 项目中可以引入公共配置&当前环境需要的配置文件
2.5 配置优先级
思考问题:如果在application.yml文件中和Nacos配置中心中都定义了相同的配置内容,那么哪一个配置的优先级较高呢?
优先级顺序:Nacos配置中心的配置(后导入的配置 > 先导入的配置) > application.yml