Nacos配置管理
官方Nacos集群图:
其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。
在生产环境中,所有的微服务都需要被注册发现到注册中心去。 同时还需要读取配置, 所以都需要去找Nacos。
就像下图一样 :
统一配置管理
1.新建配置
DataID: 就是配置开发环境 xxx.yaml
- 配置格式就是YAML
- 配置内容:
内容就是做热更新配置是需要变的那种开关类型的配置(有热更新需求的)。 而不是数据库等没有什么需要做的那种配置。
配置获取
Spring项目的启动顺序
- 项目启动
- 读取本地的配置文件yml
- 创建Spring容器
- 加载Bean
- ….
在nacos的配置管理中,在步骤2之前 需要将nacos的配置文件和本地配置文件做一个合并, 然后再去做后续的动作。但是问题来了 。nacos的地址是在application.yml文件中的,那这样就无法先将nacos的配置加载之后再读取本地配置文件application.yml了。
所以就需要将nacos的地址放在本地配置文件读取之前来操作。 在Spring中, bootstrap.yml配置文件在本地配置文件之前被读取。
bootstrap.yml的优先级比Application高很多。
操作步骤
1.引入依赖
<!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
1.添加bootstrap.yaml
然后,在user-service中添加一个bootstrap.yaml文件,内容如下:
spring: application: name: userservice # 服务名称 profiles: active: dev #开发环境,这里是dev cloud: nacos: server-addr: localhost:8848 # Nacos地址 config: file-extension: yaml # 文件后缀名
这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据
**${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}**作为文件id,来读取配置。
本例中,就是去读取userservice-dev.yaml:
1.读取nacos配置
在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:
这里可以将@value注解换成@NacosValue
1.最后访问即可看到效果。
提示:
可能会出错。 出错的继续看看视频的弹幕提示吧
依赖错误是最熬人的。
配置热更新
方法一:@RefreshScope
在@Value注入的变量所在类上添加注解@RefreshScope:
方法二(推荐): 使用@ConfigurationProperties注解代替@Value注解
使用@ConfigurationProperties注解代替@Value注解。
在user-service服务中,添加一个类,读取patterrn.dateformat属性:
package cn.itcast.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:
通过@ConfigurationProperties注入可以实现自动刷新。
而通过@Value 注解注入, 需要结合 @RefreshScope来刷新。
配置共享
其实微服务启动时,会去nacos读取多个配置文件,例如:
- [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
- [spring.application.name].yaml,例如:userservice.yaml
而[spring.application.name].yaml不包含环境,因此可以被多个环境共享。
下面通过heima的一个案例来试配置共享
1)添加一个环境共享配置
我们在nacos中添加一个userservice.yaml文件:
2)在user-service中读取共享配置
在user-service服务中,修改PatternProperties类,读取新添加的属性:
在user-service服务中,修改UserController,添加一个方法:
3)运行两个UserApplication,使用不同的profile
修改UserApplication2这个启动项,改变其profile值:
这样,UserApplication(8081)使用的profile是dev,UserApplication2(8082)使用的profile是test。
启动UserApplication和UserApplication2
访问http://localhost:8081/user/prop,结果:
访问http://localhost:8082/user/prop,结果:
可以看出来,不管是dev,还是test环境,都读取到了envSharedValue这个属性的值。
4)配置共享的优先级
当nacos、服务本地同时出现相同属性时,优先级有高低之分:
微服务会从nacos中读取的配置文件
搭建Nacos集群
spring: cloud: gateway: # 。。。 globalcors: # 全局的跨域处理 add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题 corsConfigurations: '[/**]': allowedOrigins: # 允许哪些网站的跨域请求 - "http://localhost:8090" allowedMethods: # 允许的跨域ajax的请求方式 - "GET" - "POST" - "DELETE" - "PUT" - "OPTIONS" allowedHeaders: "*" # 允许在请求中携带的头信息 allowCredentials: true # 是否允许携带cookie maxAge: 360000 # 这次跨域检测的有效期