Nacos使用

  1. 使用注册中心

    1. 本地直接启动nacos

    2. 引入nacos注册中心依赖

      <!--nacos-->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
          <version>${spring-cloud-alibaba.version}</version>
      </dependency>
      
    3. 创建一个模块,yml文件中添加nacos配置

      spring:
        application:
          name: Microservice_User
        cloud:
          nacos:
            server-addr: localhost:8848 #配置Nacos地址
            discovery:
              namespace: ccx  #配置命名空间
      
    4. 这样即可把User服务注册到nacos中

  2. 使用配置中心

    1. 添加配置中心依赖

      <!--nacos配置中心-->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
          <version>${spring-cloud-alibaba.version}</version>
      </dependency>
      
    2. @RefreshScope注解 配置动态刷新

      在controller类上添加这个注解之后就可以动态感知到nacos配置中的变化而不用重启服务。

      此注解是通过对标注的该类的Bean对象创建代理类+事件驱动机制实现的配置自动刷新。集成Spring集成Nacos后会注册一个监听器来监控nacos中配置文件的变化,如果nacos中的配置发生变化监听器会收到通知,监听器收到通知后会发布一个更新事件,监听这个更新事件的监听器会将丢弃标记了这个注解的实例,重新走创建Bean的流程(其中就有依赖注入),这样就做到了配置动态刷新。

    3. 在配置文件中添加nacos配置

      bootstrap.yml内容如下:

      spring:
        application:
          name: Microservice_User
        cloud:
          nacos:
            server-addr: localhost:8848 # 配置nacos地址
            config:
              file-extension: yml # 指定配置文件格式
      #        extension-configs[0]: # 扩展配置,支持配置多个配置文件。如果不配置这个也会有一个默认的配置文件。名字为:${spring.application.name)}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
      #          data-id: user.yml
      #          group: ccx
      #          refresh: true # 是否支持应用中可动态刷新,默认不支持
      #        extension-configs[1]:
      #          data-id: user1.yml
      #          group: ccx
      #          refresh: true
      #        group: ccx
            discovery:
              namespace: ccx  # 配置命名空间
      

      application.yml内容如下:

      server:
        port: 9090
      
      spring:
        profiles:
          active: dev
      

      这样配置之后nacos就会监听如下3个配置文件

      2024-06-25 22:49:42.736  INFO 43128 --- [           main] c.a.c.n.refresh.NacosContextRefresher    : listening config: dataId=Microservice_User, group=DEFAULT_GROUP
      2024-06-25 22:49:42.736  INFO 43128 --- [           main] c.a.c.n.refresh.NacosContextRefresher    : listening config: dataId=Microservice_User.yml, group=DEFAULT_GROUP
      2024-06-25 22:49:42.736  INFO 43128 --- [           main] c.a.c.n.refresh.NacosContextRefresher    : listening config: dataId=Microservice_User-dev.yml, group=DEFAULT_GROUP
      

      打印这3行监听配置文件信息的类实现了Spring的事件监听接口ApplicationListener,spring在启动完成后会发布ApplicationReadyEvent事件,当前类的onApplicationEvent()方法会监听这个事件,这个类收到这个事件后打印了监听的nacos的配置文件名,以及做了其他一些动作

      他们被构造的源代码如下:

      其中传进来的dataIdPrefix是先获取配置文件中的prefix属性值,如果就会获取spring.application.name属性的值

    4. 在controller类中读取这个test.userId配置

      @RefreshScope
      @RestController
      public class TestController {
      
          @Value("${server.port}")
          int port;
      
          @Value("${test.userId}")
          String userId;
      
          @GetMapping("/nacos/test")
          public AjaxResult getPort(){
              return AjaxResult.success("nacos registry, userId of user.yml: " + userId);
          }
      }
      

      在进行Bean的属性注入时spring会从所有配置文件(包括nacos)中寻找test.userId属性,只要上边监听的3个配置文件中任意有值就会被注入。如果这三个配置文件在nacos中都存在,会优先使用名字最全的那个配置文件中的属性,比如按照现在bootstrap.yml中的配置,nacos中最全的配置文件名应为:Microservice_User-dev.yml,所以即使Microservice_User.yml中也有test.userId属性也不会被使用。

posted @ 2024-06-25 23:30  程长新  阅读(13)  评论(0编辑  收藏  举报