上一篇文章在spring cloud alibaba项目中安装使用了nacos,
spring cloud alibaba (1)-引入nacos进行服务管理
并实现了服务发现功能。这篇文章继续记录nacos配置中心功能。
注:实际操作中,需要热更新的配置才会放到nacos中进行配置管理, 基本不会变更的一些配置还是保存到本地中。
1.统一配置管理
随着微服务越来越多,遇到修改微服务的配置时,需要逐个修改,这样非常浪费时间,然后我们可以使用统一配置管理,这样nacos不仅可以将配置集中管理,而且可以在配置变更时,及时通知微服务,实现配置的热更新。
我们在nacos中添加一个配置文件
创建内容如下:
然后我们创建bootstrap.yml文件,初始配置如下:
spring: application: name: producer-service-dev # 服务名称 profiles: active: dev #开发环境,这里是dev cloud: nacos: config: server-addr: localhost:8848 # Nacos作为配置中心地址 file-extension: yml # 文件后缀名 group: DEFAULT_GROUP prefix: test-nacos
注意,这个地方需要说明一下,bootstrap.yml和application-dev.yml都是配置问文件,主要区别就是bootstrap.yml的加载优先于application-dev.yml,所以你可以在某些文章中看到nacos的discovery的配置也放到bootstrap.yml,这个配置影响不大。
另外就是我们把application.yml 改成了application-dev.yml。这个在实际开发中常用(如果不改也不影响本文测试,因为spring boot会一套匹配机制)。dev表示开发环境,prod表示正式环境。而我们bootstrap.yml中的profiles.activie:dev就表示启用开发环境的配置,也就是优先加载application-dev.yml,如果没有再去尝试加载application.yml这个配置。
2.使用配置信息
我们返回到我们Controller的接口部分,我通过@Value注解来读取nacos的配置信息
package site.longkui.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/user") public class userController { @Value("${student.name}") private String name; @GetMapping("/getUser") public String getUser() { return "I`m producer 1 ,return user-"+name; } }
注意,最好给nacos这些配置信息一个默认值,不然启动的时候读取不到配置,会导致启动失败。
比如改成下面这样:
@Value("${student.name:小猪佩奇}")
这样,nacos如果读取不到student.name这个值,值就变成默认的“小猪佩奇”了。
启动项目,进行测试。
如果启动项目报错,请参考下面两篇文章解决:
nacos 获取配置提示config data not exist
3.实现效果
可以看到,正确显示了nacos的配置信息。
4.实现自动刷新
我们希望我们修改nacos的配置信息后,客户端可以自动刷新配置信息,默认情况下是不刷新的。如下图:
我们在代码中需要的地方加入@RefreshScope注解就可以:
package site.longkui.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/user") @RefreshScope//自动刷新配置 public class userController { @Value("${student.name}") private String name; @GetMapping("/getUser") public String getUser() { return "I`m producer 1 ,return user-"+name; } }
效果如下:
可以看到,在不用重启的情况下,修改了配置信息。