【Spring Cloud Alibaba】16. 注册与配置中心Nacos组件

797 阅读4分钟

Nacos简介

image.png

Nacos基于Java开发,全名为:Name Configurations 取其中 Na,Co,s 组成 Nacos。中文翻译为"命名配置"。其中Name全称为Name Server,表示命名服务。Configurations全称为Configurations Server,表示配置服务

所以,可见Nacos主要提供了服务注册服务配置管理两大功能,其中Name Server替换了Consul,Configurations Server替换了Spring Cloud Config + Spring Cloud Bus。

Nacos安装

  1. 环境准备

    • 64位操作系统,支持Linux / Unix / Mac / Windows,推荐使用Linux。
    • JDK 1.8 以上。
    • Maven 3.2.x 以上。
  2. 下载地址:github.com/alibaba/nac…

    image.png

  3. Nacos目录

    • bin:启动Nacos目录的脚本目录
    • conf:Nacos的配置文件目录
    • target:Nacos的依赖存放目录
    • data:Nacos启动成功后保存数据的目录
  4. 启动Nacos单节点运行

    Nacos默认是cluster模式(集群)启动,在一般小项目中,可以将Nacos设置为standalone(单节点)模式运行。在命令中添加 -m standalone 即可。

    Linux/Unix/Mac OS启动:在nacos/bin目录下

    ./startup.sh -m standalone
    

    Windows启动:在nacos/bin目录下

    startup.cmd -m standalone
    
  5. Nacos默认端口:8848

  6. 访问Nacos控制台:http://localhost:8848/nacos/ (用户名和密码默认都是nacos)

    如果访问控制台显示空白,清理浏览器缓存即可。

Nacos客户端开发

  1. 在客户端pom.xml引入依赖

    <!--  Nacos注册中心客户端  -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--  Nacos配置中心客户端  -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency> 
    
  2. 客户端添加启动类注解

    @SpringBootApplication
    // Spring Cloud的原生注解,开启服务注册与发现,可加可不加
    @EnableDiscoveryClient
    public class ClientApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ClientApplication.class, args);
        }
    }
    
  3. Nacos控制台中确定存放配置文件的Namespace,如果没有需要创建(本文使用默认Namespace)。

  4. 在控制台预先创建好的的Namespace中创建配置文件client-dev.yml

    server:
      port: 9000
    
    spring:
      cloud:
        # Nacos配置   
        nacos:
          discovery:
            # 将client注册进入Nacos Server注册中心
            server-addr: ${spring.cloud.nacos.server-addr}
    
  5. 客户端bootstrap.yml配置

    本地配置的目的在于,能够在服务启动前找到远程配置中心对应的配置文件,所以本地配置了Namespace,Group,Data ID用来定位配置文件。

    在Spring Cloud Alibaba中,虽然将本地配置放在application.yml也可以,但是还是建议放在bootstrap.yml中。

    spring:
      # Data ID:前缀
      application:
        name: client
      # Data ID:环境
      profiles:
        active: dev
      cloud:
        nacos:
          # Nacos Server地址
          server-addr: localhost:8848
          # Nacos Server配置中心配置      
          config:
            # 服务启动时去Nacos Server配置中心拉取配置
            server-addr: ${spring.cloud.nacos.server-addr}
            # 默认命名空间:Public,可以省略不写,新建的命名空间,需要使用命名空间ID,不能使用名称
            namespace: Public
            # 默认组:DEFAULT_GROUP,如果是Public命名空间,则可以省略群组配置
            group: DEFAULT_GROUP
            # Data ID:后缀
            file-extension: yaml
    
  6. 成功注册服务

    image.png

    如果服务没有注册上,查看客户端的porn.xml中是否引入web依赖,或者尝试重启Nacos服务。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

Nacos配置中心功能

在前文实现的Spring Cloud 配置中心解决方案中,整合了Spring Cloud Config,Spring Cloud Bus,GitHub实现了配置中心和配置的自动自动刷新。其中GitHub作为一个配置远程仓库,Spring Cloud Config作为一个独立的配置管理Server管理本地配置的同时通过Webhock拉取远程仓库中的配置文件,从而实现配置的刷新,最后通过消息总线Spring Cloud Bus广播给每一个微服务实现配置的加载。

而在Spring Cloud Alibaba中提供的Nacos组件中实现了配置中心的功能,它不再依赖于类似于GitHub这样的远程仓库存储配置文件,而是直接存在Nacos Server上。也不再依赖Spring Cloud Bus结合消息中间件(RabbitMQ)更新配置,而是当Nacos Server上的配置文件被修改后,自动广播给各个微服务,从而也不需要独立的创建一个config服务。

配置的自动刷新

在Controller类上添加@RefreshScope注解

 @RestController
 // 实现配置自动刷新
 @RefreshScope
 public class TestController {

     @Value("${user.name}")
     private String username;

     @GetMapping("/test")
     public String test() {
         System.out.println(username);
         return username;
     }
 }

命名空间

因为Nacos中存储着所有微服务的配置文件,如果有两个微服务项目中都有user这个服务,那么必然会有两个user.yaml,这个时候必然会造成文件的冲突。所以Nacos提供了命名空间,给每一个项目单独设置一个命名空间,该命名空间中只存放对应项目的所有配置文件。Nacos默认提供的一个命名空间是public,该命名空间不能编辑不能删除,只能查看。所有未指定命名空间的配置文件会全部存储在public命名空间中。

命名空间的思想沿袭了在使用前文的Spring Cloud解决方案中,在GitHub上创建不同的仓库存储不同项目配置文件。

image.png

新建命名空间

image.png

每一个命名空间都会有一个唯一的ID,建议不填第一个框,自动生成ID。

命名空间名建议是英文。

添加单个配置

image.png

image.png

Data ID格式为:${prefix}-${spring.profiles.active}.${file-extension}

  • prefix:前缀,默认为服务名,默认是bootstrap.yml中的spring.application.name,也可以通过spring.cloud.nacos.config.prefix来指定前缀。
  • spring.profiles.active:环境,可以是dev,prod,test
  • file-extension:文件后缀名,目前只支持yaml,properties(必须和下面选中的配置格式对应)

如果spring.profiles.active没有配置,那么Data ID格式为:${prefix}.${file-extension}

如果file-extension是yml,文件后缀必须是yaml,配置格式也必须选yaml。Nacos1.4之后,配置文件中必须写yml。

Group:默认DEAFAULT_GROUP,一般以环境dev,prod,test来分组(如果没有该组会直接创建)。

描述:配置文件的描述,可写可不写。

配置格式:必须和上面的file-extension一致。

Namespace,Group,Data ID就可以定于任何一个配置文件,类似于Maven对于Jar包的定位。

导入导出配置

导入配置:

导入的配置必须是一个zip包。

20210624212004.png

导出配置:

正常情况下导出的是一个zip后缀的压缩包,如果导出的是不是zip后缀的文件,则将后缀改为zip即可导入(仅限Chrome浏览器)。

20210625181617.png

克隆配置

克隆配置就是拷贝配置文件到另外一个Namespace,可以选择修改Group和Data ID。

20210625181532.png

历史版本

因为配置文件会进经常修改,Nacos中也沿用了类似与Git的方式,记录每一次的版本变更,方便做版本的回滚。

image.png

监听查询

可以对配置文件进行监听。其中,MD5是作为签名最好的方式。如果两个配置文件的内容是一样的,那么MD5是一样的。只要配置文件之间有一个字符不一样,MD5都不同。因此,Nacos判断配置文件有无更新就是判断两次修改后的MD5是否一致。当Nacos判断该配置文件发生内容上的变更,会立刻推向对应的微服务。

image.png