引言
nacos作为配置中心以及注册和发现中心,是我们常用的一个中间件。在微服务生态中,它取代了spring-cloud-config和eureka的位置。本文,就是简单学习这个中间件。
配置中心
隔离方式
nacos中有三种方式来隔离配置:namespace、group和dataId
- namespace:用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 group 或 dataId 的配置。namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
- group:简单理解为多个配置文件的集合
- dataId:简单理解为一个配置文件。
他们之间的关系可以简单用下图表示:
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在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
注意:
- 多个dataId同时配置时,他的优先级关系是
spring.cloud.nacos.config.extension-configs[n].data-id
其中 n 的值越大,优先级越高。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 拉取相关的配置:
- 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的dataId配置
- 通过
spring.cloud.nacos.config.extension-configs[n].data-id
的方式支持多个扩展dataId的配置 - 通过
spring.cloud.nacos.config.shared-configs[n].data-id
支持多个共享dataId的配置
当三种方式共同使用时,他们的一个优先级关系是: 1>2>3
关闭配置
#完全关闭 Spring Cloud Nacos Config
spring.cloud.nacos.config.enabled = false
注册发现中心
用法
导入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
修改配置文件
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
启动类加上注解
@SpringBootApplication @EnableDiscoveryClient public class App { public static void main( String[] args ) { SpringApplication.run(App.class, args); } }
完成,启动后就会注册到nacos上,在对应的地方可以看到服务已经注册成功了。
注册中心配置项目
配置项 | Key | 默认值 | 说明 |
---|---|---|---|
服务端地址 | spring.cloud.nacos.discovery.server-addr | 无 | Nacos Server 启动监听的ip地址和端口 |
服务名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 给当前的服务命名 |
服务分组 | spring.cloud.nacos.discovery.group | DEFAULT_GROUP | 设置服务所处的分组 |
权重 | spring.cloud.nacos.discovery.weight | 1 | 取值范围 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 | 无 | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。 |
AccessKey | spring.cloud.nacos.discovery.access-key | 无 | 当要上阿里云时,阿里云上面的一个云账号名 |
SecretKey | spring.cloud.nacos.discovery.secret-key | 无 | 当要上阿里云时,阿里云上面的一个云账号密码 |
Metadata | spring.cloud.nacos.discovery.metadata | 无 | 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息 |
日志文件名 | spring.cloud.nacos.discovery.log-name | 无 | |
集群 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | 配置成Nacos集群名称 |
接入点 | spring.cloud.nacos.discovery.enpoint | UTF-8 | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 |
是否集成Ribbon | ribbon.nacos.enabled | true | 一般都设置成true即可 |
是否开启Nacos Watch | spring.cloud.nacos.discovery.watch.enabled | true | 可以设置成false来关闭 watch |
注册的IP地址类型 | spring.cloud.nacos.discovery.ip-type | IPv4 | 可以配置IPv4和IPv6两种类型 |