Nacos学习

引言

nacos作为配置中心以及注册和发现中心,是我们常用的一个中间件。在微服务生态中,它取代了spring-cloud-config和eureka的位置。本文,就是简单学习这个中间件。

配置中心

隔离方式

nacos中有三种方式来隔离配置:namespacegroupdataId

  • namespace:用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 groupdataId 的配置。namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
  • group:简单理解为多个配置文件的集合
  • dataId:简单理解为一个配置文件。

他们之间的关系可以简单用下图表示:

nacos隔离方式

dataId的文件扩展名方式

nacos支持properties和yaml的拓展名方式,默认是properties,如果需要修改需配置bootstrap.properties

#修改文件拓展名为yaml
spring.cloud.nacos.config.file-extension=yaml

动态刷新

nacos支持动态刷新配置,默认开启,需要关闭的时候请修改配置:

#关闭动态刷新
pring.cloud.nacos.config.refresh.enabled=false 

支持profile粒度的配置

nacos在加载配置的时候不仅仅加载了以 dataId 为 ${spring.application.name}.${file-extension:properties} 为前缀的基础配置,还加载了dataId为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置

自定义namespace

默认Public这个namespace,可以通过如下指定配置:

#b3404bc0-d7dc-4855-b519-570ed34b62d7 namespace id
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7

自定义group

默认使用的是 DEFAULT_GROUP,可以通过如下指定配置:

spring.cloud.nacos.config.group=DEVELOP_GROUP

自定义扩展的dataId配置

这里只是为了解决通用配置不重复创建的问题,我们通常把一个通用的配置单独列出来,因此会产生以下两种方案。

共享dataId的方式

spring.cloud.nacos.shared.dataids=global.yaml,app-common.yaml,app-local-common.yaml

#或者
# 配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml
# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1
# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
spring.cloud.nacos.config.shared-configs[0].refresh=true

为了更加清晰的在多个应用间配置共享的dataId,可以采用上面的方式。

注意:

为了尽可能的和Nacos使用方式(即dataId 是一个带有额外文件扩展名的)保持一致,这里配置的dataId是一定需要带上文件扩展名的。

通过类似面向对象方式的自定义配置

spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties

# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP

# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true

可以看到:

  • 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的配置方式来支持多个dataId的配置。
  • 通过 spring.cloud.nacos.config.extension-configs[n].group 的配置方式自定义dataId所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  • 通过 spring.cloud.nacos.config.extension-configs[n].refresh 的配置方式来控制该dataId在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。

注意:

  1. 多个dataId同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高。
  2. spring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的dataId文件扩展名没有影响。

这种方式既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件

配置优先级

Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置:

  1. 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的dataId配置
  2. 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展dataId的配置
  3. 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享dataId的配置

当三种方式共同使用时,他们的一个优先级关系是: 1>2>3

关闭配置

#完全关闭 Spring Cloud Nacos Config
spring.cloud.nacos.config.enabled = false

注册发现中心

用法

  1. 导入依赖

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
  2. 修改配置文件

    server.port=9093
    spring.application.name=nacos-discovery
    management.endpoints.web.exposure.include=*
    
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    spring.cloud.nacos.discovery.service=nacos-discovery01
    spring.cloud.nacos.discovery.group=nacos-discovery
    spring.cloud.nacos.discovery.namespace=fda084d1-c822-4e79-98da-913f4e1591a5
    
  3. 启动类加上注解

    @SpringBootApplication
    @EnableDiscoveryClient
    public class App
    {
        public static void main( String[] args )
        {
            SpringApplication.run(App.class, args);
        }
    }
    

完成,启动后就会注册到nacos上,在对应的地方可以看到服务已经注册成功了。

注册中心配置项目

配置项Key默认值说明
服务端地址spring.cloud.nacos.discovery.server-addrNacos Server 启动监听的ip地址和端口
服务名spring.cloud.nacos.discovery.service${spring.application.name}给当前的服务命名
服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP设置服务所处的分组
权重spring.cloud.nacos.discovery.weight1取值范围 1 到 100,数值越大,权重越大
网卡名spring.cloud.nacos.discovery.network-interface当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
注册的IP地址spring.cloud.nacos.discovery.ip优先级最高
注册的端口spring.cloud.nacos.discovery.port-1默认情况下不用配置,会自动探测
命名空间spring.cloud.nacos.discovery.namespace常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
AccessKeyspring.cloud.nacos.discovery.access-key当要上阿里云时,阿里云上面的一个云账号名
SecretKeyspring.cloud.nacos.discovery.secret-key当要上阿里云时,阿里云上面的一个云账号密码
Metadataspring.cloud.nacos.discovery.metadata使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
日志文件名spring.cloud.nacos.discovery.log-name
集群spring.cloud.nacos.discovery.cluster-nameDEFAULT配置成Nacos集群名称
接入点spring.cloud.nacos.discovery.enpointUTF-8地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbonribbon.nacos.enabledtrue一般都设置成true即可
是否开启Nacos Watchspring.cloud.nacos.discovery.watch.enabledtrue可以设置成false来关闭 watch
注册的IP地址类型spring.cloud.nacos.discovery.ip-typeIPv4可以配置IPv4和IPv6两种类型