SpringCloud学习5-Nacos

112 阅读3分钟

SpringCloud学习5-Nacos

Nacos

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台

一句话:Nacos就是注册中心 + 配置中心的组合。

Nacos=Spring Cloud Consul

Nacos本地运行:

运行:在nacos的bin目录上cmd,输入:startup.cmd -m standalone,然后浏览器输入:http://localhost:8848/nacos即可

关闭服务:shutdown.cmd

Nacos服务注册中心:

实现服务的注册与发现

案例:

Nacos之服务提供者9001入驻Nacos中心:

  • 建Model:cloudalibaba-provider-payment9001

  • pom文件导入相关依赖:

    <!--nacos-discovery-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
    
  • yml:

    server:
      port: 9001
    
    spring:
      application:
        name: nacos-payment-provider
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #配置Nacos地址  
                
    //之后9001以nacos-payment-provider名称入驻进8848
    
  • 业务类:

    
    @RestController
    @Slf4j
    public class PayAlibabaController {
        @Value("${server.port}")
        private String serverPort;
    
        @GetMapping(value = "/pay/nacos/{id}")
        public String getPayInfo(@PathVariable("id") Integer id) {
            return "nacos registry, serverPort: " + serverPort + "\t id" + id;
        }
    }
    

Nacos之服务消费者83入驻Nacos中心:

  • 建Model:cloudalibaba-consumer-nacos-order83

  • 在pom文件中导入Nacos的相关依赖(两个)

    注意:Nacos也支持客户端的负载均衡

     <!--nacos-discovery-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <!--loadbalancer-->
            //因为服务消费者调用服务时是按照名字进行调用的,认名不认死地址,如果一个名字后面有多个服务提供者,就需要负载均衡所           以需要导入loadbalancer依赖
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            </dependency>
    
  • yml:

    server:
      port: 83
    
    spring:
      application:
        name: nacos-order-consumer
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848  #服务提供者以nacos-order-consumer(83)名称入驻进8848注册中心
    #消费者将要去访问的微服务名称(nacos微服务提供者叫什么你写什么)
    service-url:
      nacos-user-service: http://nacos-payment-provider
    
  • 实体类:使用RestTemplate或者OpenFeign都可

Nacos服务配置中心:

实现配置的动态变更

就是原来是在Consul上进行配置,现在变成在Nacos上配置

Nacos同Consul一样,在项目初始化时,要保证先从配置中心进行配置拉取

拉取配置之后,才能保证项目的正常启动,为了满足动态刷新和全局广播通知

springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

步骤:

  • 建Model:cloudalibaba-config-nacos-client3377作为Nacos配置中心

  • 在pom文件中导入相关依赖:

    
        <dependencies>
            <!--bootstrap bootstrap.yml-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-bootstrap</artifactId>
            </dependency>
            <!--nacos-config 配置服务的中心化管理功能-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            </dependency>
            <!--nacos-discovery入驻进Nacos-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <!--web + actuator-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
        </dependencies>
    
  • yml文件:

    1. bootstrp.application

      # nacos配置
      spring:
        application:
          name: nacos-config-client #Nacos的配置中心将以nacos-config-client名称入驻Nacos注册中心
        cloud:
          nacos:
            discovery:
              server-addr: localhost:8848 #Nacos服务注册中心地址
            config:
              server-addr: localhost:8848 #Nacos作为配置中心地址
              file-extension: yaml #指定yaml格式的配置(只认yml配置方式)
      
      # nacos端配置文件DataId的命名规则是:
      # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
      # 本案例的DataID是:nacos-config-client-dev.yaml
      
    2. application.yml

      server:
        port: 3377
      
      spring:
        profiles:
          active: dev # 表示开发环境
          #active: prod # 表示生产环境
          #active: test # 表示测试环境
      
  • 业务类controller:

    @RefreshScope实现配置的自动更新

    
    @RestController
    //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
    @RefreshScope
    public class NacosConfigClientController
    {
        @Value("${config.info}") //从Nocas上的yml中读取信息:(根据application和boootstrp.yml中配置的环境、分组来确定读取							  Nacos上谁的配置信息!!!
        private String configInfo;
    
        @GetMapping("/config/info")
        public String getConfigInfo() {
            return configInfo;
        }
    }
    
  • 在Nacos中添加配置信息(重点)

    //nacos端配置文件DataId的命名规则是:
       ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
           1.配置中心的名字               2.环境                 3.支持什么格式
          nacos-config-client      -       dev                .   yaml
          //prefix默认为spring.application.name
         //spring.profiles.active默认为当前环境对应的profile,可以通过配置项spring.profiles.active来配置
        //spring.cloud.nacos.config.file-extension为配置内容的数据格式
    # 所以本案例的DataID是:nacos-config-client-dev.yaml
    

Nacos配置中心添加配置信息.png

在Nacos上的配置管理--配置列表--创建配置--写入正确的Data ID + 配置内容

注意:

  • 因为我们使用了@RefreshScope注解,所以在Nacos上更新配置内容时,它会自己进行动态刷新

  • Nacos会记录配置文件的历史版本默认保留30天,此外还有一键回滚功能,回滚操作将会触发配置更新

Nacos数据模型之Namespace-Group-DataId

问题1:

实际开发中,通常一个系统会准备

dev开发环境

test测试环境

prod生产环境。

如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?

问题2:

一个大型分布式微服务系统会有很多微服务子项目,

每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境......

那怎么对这些微服务配置进行分组和命名空间管理呢?

Nacos数据模型Key由三元组唯一确定,Namespace命名空间默认是空串,默认为(public),Group默认分组是DEFAULT_GROUP

  • Namespace主要用来实现隔离。比如我们现在有3个环境:开发、测试、生产环境,我们就可以创建3个Namespace,不同的Namespace之间是隔离的
  • Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到一个分组里去。

通过命名空间Namespace + Group +DataId 就形成了唯一的配置信息(类似于Java中的包名 类名 )

注意:

如果需要读取Nacos上不同环境、分组下的配置,需要更改yml文件(application.ymlh和bootstarp.yml中配置的要求读取哪个里面的配置文件)

eg: 上面在application.yml文件中代表读取的是Nacos默认命名空间、默认命名分组中的yml文件,bootstrap.yml文件中代表:读取的是Nocasdev环境的配置信息内容。之后controller中的configInfo属性到对应上述命名空间、环境、分组、DataId中去读取对应的配置信息。