• Nacos配置管理


    将配置交给Nacos管理的步骤
    1、在Nacos中添加配置文件
    2、在微服务中引入nacos的config依赖
    3、在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件
     

    Nacos配置更改后,微服务可以实现热更新,方式:
    1、通过@Value注解注入,结合@RefreshScope来刷新
    2、通过@ConfigurationProperties注入,自动刷新
    注意事项:
    ·不是所有的配置都适合放到配置中心,维护起来比较麻烦
    ·建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置

    微服务会从nacos读取的配置文件:
    [服务名]-[spring.profile.active].yaml,环境配置

    [服务名].yaml,默认配置,多环境共享
    优先级:[服务名]-[环境].yaml >[服务名].yaml >本地配置
     

    Nacos实现配置管理

    点击配置管理

    点击加号

    设置好这些属性:

    Data ID:一般不能重复,建议写服务名称

    描述:描述是用来写这个配置作用的

    配置格式用yaml

    配置内容:这里我写的是时间格式,在后面java中可以使用这个配置

     发布完成后:可以得到一个配置

    微服务配置拉取

    引入Nacos的配置管理客户端依赖:


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-config 

    这里我用userservice的pom文件 

    1. "1.0" encoding="UTF-8"?>
    2. "http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. cloud-demo
    6. cn.itcast.demo
    7. 1.0
    8. 4.0.0
    9. user-service
    10. org.springframework.boot
    11. spring-boot-starter-web
    12. mysql
    13. mysql-connector-java
    14. org.mybatis.spring.boot
    15. mybatis-spring-boot-starter
    16. com.alibaba.cloud
    17. spring-cloud-starter-alibaba-nacos-discovery
    18. com.alibaba.cloud
    19. spring-cloud-starter-alibaba-nacos-config
    20. app
    21. org.springframework.boot
    22. spring-boot-maven-plugin

    在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml;

    spring:
        application:
            name: userservice #服务名称

        profiles:
            active: dev#开发环境,这里是dev

        cloud:
            nacos:
                server-addr: localhost:8848 #Nacos地址

                config:
                    file-extension: yaml #文件后缀名

    1. spring:
    2. application:
    3. name: userservice #服务名称
    4. profiles:
    5. active: dev #开发环境,这里是dev
    6. cloud:
    7. nacos:
    8. server-addr: localhost:8848 #nacos地址
    9. config:
    10. file-extension: yaml #文件后缀名

    把application的一些重复配置注释掉

    1. server:
    2. port: 8081
    3. spring:
    4. datasource:
    5. url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    6. username: root
    7. password: 1234
    8. driver-class-name: com.mysql.jdbc.Driver
    9. # application:
    10. # name: userservice #user的微服务名称
    11. # cloud:
    12. # nacos:
    13. # server-addr: localhost:8848 #nacos服务地址
    14. # discovery:
    15. # cluster-name: SH #集群名称
    16. mybatis:
    17. type-aliases-package: cn.itcast.user.pojo
    18. configuration:
    19. map-underscore-to-camel-case: true
    20. logging:
    21. level:
    22. cn.itcast: debug
    23. pattern:
    24. dateformat: MM-dd HH:mm:ss:SSS
    25. #eureka:
    26. # client:
    27. # service-url: #eureka地址信息
    28. # defaultZone: http://127.0.0.1:10086/eureka

    在controller中写新的代码,判断前面配的配置文件是否有效

    @Value("${pattern.dateformat}")
    //注解读取该配置
    private String dateformat;
    
    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));//通过该配置改变时间格式
    }
    1. package cn.itcast.user.web;
    2. import cn.itcast.user.pojo.User;
    3. import cn.itcast.user.service.UserService;
    4. import lombok.extern.slf4j.Slf4j;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.beans.factory.annotation.Value;
    7. import org.springframework.web.bind.annotation.*;
    8. import java.text.DateFormat;
    9. import java.time.LocalDateTime;
    10. import java.time.format.DateTimeFormatter;
    11. @Slf4j
    12. @RestController
    13. @RequestMapping("/user")
    14. public class UserController {
    15. @Autowired
    16. private UserService userService;
    17. @Value("${pattern.dateformat}")
    18. //注解读取该配置
    19. private String dateformat;
    20. @GetMapping("now")
    21. public String now(){
    22. return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));//通过该配置改变时间格式
    23. }
    24. /**
    25. * 路径: /user/110
    26. *
    27. * @param id 用户id
    28. * @return 用户
    29. */
    30. @GetMapping("/{id}")
    31. public User queryById(@PathVariable("id") Long id) {
    32. return userService.queryById(id);
    33. }
    34. }

     重启服务后,访问,可以看到我们设置好的时间格式

    配置热更新

    每次更新配置后,都需要重启服务才能生效。配置热更新后,不需要重启服务也能使用新配置

    Nacos中的配置文件变更后,微服务无需重启就可以感知。不过需要通过下面两种配置实现:

    ●方式一:在@Value注入的变量所在类上添加注解@RefreshScope

    @RefreshScope
    
    1. package cn.itcast.user.web;
    2. import cn.itcast.user.pojo.User;
    3. import cn.itcast.user.service.UserService;
    4. import lombok.extern.slf4j.Slf4j;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.beans.factory.annotation.Value;
    7. import org.springframework.cloud.context.config.annotation.RefreshScope;
    8. import org.springframework.web.bind.annotation.*;
    9. import java.text.DateFormat;
    10. import java.time.LocalDateTime;
    11. import java.time.format.DateTimeFormatter;
    12. @Slf4j
    13. @RestController
    14. @RequestMapping("/user")
    15. @RefreshScope
    16. public class UserController {
    17. @Autowired
    18. private UserService userService;
    19. @Value("${pattern.dateformat}")
    20. //注解读取该配置
    21. private String dateformat;
    22. @GetMapping("now")
    23. public String now(){
    24. return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));//通过该配置改变时间格式
    25. }
    26. /**
    27. * 路径: /user/110
    28. *
    29. * @param id 用户id
    30. * @return 用户
    31. */
    32. @GetMapping("/{id}")
    33. public User queryById(@PathVariable("id") Long id) {
    34. return userService.queryById(id);
    35. }
    36. }

     重启服务后,访问网页

    把配置文件修改:

    不重启,再次访问

    可以发现,/变成了年月日了,但我们并没有重启服务。所以完成了热更新

    ●方式二:使用@ConfigurationProperties注解

    我们把上个方法的注解注释掉,并注入新的类,并改变时间格式的参数

    1. package cn.itcast.user.web;
    2. import cn.itcast.user.config.PatternProperties;
    3. import cn.itcast.user.pojo.User;
    4. import cn.itcast.user.service.UserService;
    5. import lombok.extern.slf4j.Slf4j;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.beans.factory.annotation.Value;
    8. import org.springframework.cloud.context.config.annotation.RefreshScope;
    9. import org.springframework.web.bind.annotation.*;
    10. import java.text.DateFormat;
    11. import java.time.LocalDateTime;
    12. import java.time.format.DateTimeFormatter;
    13. @Slf4j
    14. @RestController
    15. @RequestMapping("/user")
    16. //@RefreshScope
    17. public class UserController {
    18. @Autowired
    19. private UserService userService;
    20. // @Value("${pattern.dateformat}")
    21. // //注解读取该配置
    22. // private String dateformat;
    23. @Autowired
    24. private PatternProperties properties;//注入新的java类
    25. @GetMapping("now")
    26. public String now(){
    27. return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));//通过该配置改变时间格式
    28. }
    29. /**
    30. * 路径: /user/110
    31. *
    32. * @param id 用户id
    33. * @return 用户
    34. */
    35. @GetMapping("/{id}")
    36. public User queryById(@PathVariable("id") Long id) {
    37. return userService.queryById(id);
    38. }
    39. }

    新建一个包,并新建一个PatternProperties.java

    1. package cn.itcast.user.web;
    2. import cn.itcast.user.pojo.User;
    3. import cn.itcast.user.service.UserService;
    4. import lombok.extern.slf4j.Slf4j;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.beans.factory.annotation.Value;
    7. import org.springframework.cloud.context.config.annotation.RefreshScope;
    8. import org.springframework.web.bind.annotation.*;
    9. import java.text.DateFormat;
    10. import java.time.LocalDateTime;
    11. import java.time.format.DateTimeFormatter;
    12. @Slf4j
    13. @RestController
    14. @RequestMapping("/user")
    15. //@RefreshScope
    16. public class UserController {
    17. @Autowired
    18. private UserService userService;
    19. @Value("${pattern.dateformat}")
    20. //注解读取该配置
    21. private String dateformat;
    22. @GetMapping("now")
    23. public String now(){
    24. return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));//通过该配置改变时间格式
    25. }
    26. /**
    27. * 路径: /user/110
    28. *
    29. * @param id 用户id
    30. * @return 用户
    31. */
    32. @GetMapping("/{id}")
    33. public User queryById(@PathVariable("id") Long id) {
    34. return userService.queryById(id);
    35. }
    36. }

    访问网页:

    改变配置文件:

    再次访问:发现没有重启服务也能发生改变

    多环境配置共享

    再新建一个配置文件

     可以看到:上面的是dev环境的,下面是多环境共享的

    修改PatternProperties.java,多读取一个变量

    1. package cn.itcast.user.config;
    2. import lombok.Data;
    3. import org.springframework.boot.context.properties.ConfigurationProperties;
    4. import org.springframework.stereotype.Component;
    5. @Data
    6. @Component
    7. @ConfigurationProperties(prefix = "pattern")//前缀名后下面的dateformat拼接,和配置一样就可以使用配置
    8. public class PatternProperties {
    9. private String dateformat;
    10. private String envSharedValue;
    11. }

     在controller.java中新增一个getmapping

    1. package cn.itcast.user.web;
    2. import cn.itcast.user.config.PatternProperties;
    3. import cn.itcast.user.pojo.User;
    4. import cn.itcast.user.service.UserService;
    5. import lombok.extern.slf4j.Slf4j;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.beans.factory.annotation.Value;
    8. import org.springframework.cloud.context.config.annotation.RefreshScope;
    9. import org.springframework.web.bind.annotation.*;
    10. import java.text.DateFormat;
    11. import java.time.LocalDateTime;
    12. import java.time.format.DateTimeFormatter;
    13. @Slf4j
    14. @RestController
    15. @RequestMapping("/user")
    16. //@RefreshScope
    17. public class UserController {
    18. @Autowired
    19. private UserService userService;
    20. // @Value("${pattern.dateformat}")
    21. // //注解读取该配置
    22. // private String dateformat;
    23. @Autowired
    24. private PatternProperties properties;//注入新的java类
    25. @GetMapping("prop")
    26. public PatternProperties properties(){
    27. return properties;
    28. }
    29. @GetMapping("now")
    30. public String now(){
    31. return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));//通过该配置改变时间格式
    32. }
    33. /**
    34. * 路径: /user/110
    35. *
    36. * @param id 用户id
    37. * @return 用户
    38. */
    39. @GetMapping("/{id}")
    40. public User queryById(@PathVariable("id") Long id) {
    41. return userService.queryById(id);
    42. }
    43. }

    重启服务:注意userservice的bootstrap.yml文件配置的环境是dev,所以访问页面是dev环境的

    在userservice2中,设置环境,让他跟userservice1不是同一个环境

       

    使用test环境,表示测试环境

    重启userservice2

    观察两个userservice

    可以发现:userservice1可以读到时间,而userservice2无法读到时间。因为时间是dev环境的,而envSharedValue是共享环境

    配置的优先级

    在application.yml配置pattern

    pattern:
      name: 本地环境local
    1. server:
    2. port: 8081
    3. spring:
    4. datasource:
    5. url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    6. username: root
    7. password: 1234
    8. driver-class-name: com.mysql.jdbc.Driver
    9. # application:
    10. # name: userservice #user的微服务名称
    11. # cloud:
    12. # nacos:
    13. # server-addr: localhost:8848 #nacos服务地址
    14. # discovery:
    15. # cluster-name: SH #集群名称
    16. mybatis:
    17. type-aliases-package: cn.itcast.user.pojo
    18. configuration:
    19. map-underscore-to-camel-case: true
    20. logging:
    21. level:
    22. cn.itcast: debug
    23. pattern:
    24. dateformat: MM-dd HH:mm:ss:SSS
    25. #eureka:
    26. # client:
    27. # service-url: #eureka地址信息
    28. # defaultZone: http://127.0.0.1:10086/eureka
    29. pattern:
    30. name: 本地环境local

     在PatternProperties.java加上name属性

    1. package cn.itcast.user.config;
    2. import lombok.Data;
    3. import org.springframework.boot.context.properties.ConfigurationProperties;
    4. import org.springframework.stereotype.Component;
    5. @Data
    6. @Component
    7. @ConfigurationProperties(prefix = "pattern")//前缀名后下面的dateformat拼接,和配置一样就可以使用配置
    8. public class PatternProperties {
    9. private String dateformat;
    10. private String envSharedValue;
    11. private String name;
    12. }

    重启服务:name一定是:本地环境local,因为此时只有本地配置了该属性

    在userservice.yml配置name属性:

    访问:name为:环境共享属性default,可以看出userservice的配置环境比本地的高 

    在userservice-dev.yml配置中添加属性name 

    访问:name为环境配置dev,可以看出dev环境配置文件是优先级最高的

     得出结论:优先级:[服务名]-[环境].yaml >[服务名].yaml >本地配置

    代码文件点击下载icon-default.png?t=N7T8https://pan.baidu.com/s/1E1QHRnmoGYkUFNI7VXjflQ?pwd=wdf3 上一篇:Nacos和Eureka的区别

  • 相关阅读:
    面试中经常问到的几个问题,快来看看能答对几道吧
    基因组 组装教程 (T2T)
    自动控制原理5.5---闭环系统的频域性能指标
    Wireshark抓包分析TCP协议:三次握手和四次挥手
    详解Avast Driver Updater:电脑驱动更新工具的利器还是多余的软件?
    flex:1详解,以及flex:1和flex:auto的区别
    【JavaEE】_前端使用GET请求的queryString向后端传参
    【从测试小白到管理】这几点让我终身受益,没有人永远18岁,但永远有人18岁......
    【原创】xenomai+linux双内核下的时钟管理机制
    VUE-----生命周期
  • 原文地址:https://blog.csdn.net/qq_63610563/article/details/134539971