Spring Cloud 本身并不是一个拿来即可用的框架,它是一套微服务规范,这套规范共有两代实现。
  • 第一代实现: Spring Cloud Netflix
  • 第二代实现: Spring Cloud Alibaba

2018 年 12 月12 日,Netflix 公司宣布 Spring Cloud Netflix 系列大部分组件都进入维护模式,不再添加新特性。这严重地限制了 Spring Cloud 的高速发展,于是各大互联网公司和组织开始把目光转向 Spring Cloud 的第二代实现:Spring Cloud Alibaba。

Spring Cloud Alibaba 是阿里巴巴结合自身丰富的微服务实践而推出的微服务开发的一站式解决方案,是 Spring Cloud 第二代实现的主要组成部分。吸收了 Spring Cloud Netflix 的核心架构思想,并进行了高性能改进。自 Spring Cloud Netflix 进入停更维护后,Spring Cloud Alibaba 逐渐代替它成为主流的微服务框架。

组件

Sentinel:阿里巴巴开源产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Nacos:阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 RocketMQ:Apache RocketMQ 基于 Java 的高性能、高吞吐量的分布式消息和流计算平台。 Dubbo:Apache Dubbo 是一款高性能 Java RPC 框架。 Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。 Alibaba Cloud OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。 Alibaba Cloud SchedulerX:阿里中间件团队开发的一款分布式任务调度产品,支持周期性的任务与固定时间点触发任务。 Alibaba Cloud SMS:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
通过 Spring Cloud Alibaba 的这些组件,我们只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

Nacos

Nacos 英文全称为 Dynamic Naming and Configuration Service 由阿里巴巴团队使用 Java 语言开发的开源项目。根据英文可以看出 Nacos 由 3 部分组成:
组成部分 全称 描述
Na Naming/NameServer 即服务注册中心,与 Spring Cloud Eureka 的功能类似。
co Configuration 即配置中心,与 Spring Cloud Config+Spring Cloud Bus 的功能类似。
s Service 即服务,表示 Nacos 实现的服务注册中心和配置中心都是以服务为核心的。
Nacos是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台。

Nacos是注册中心 + 配置中心的组合, Nacos = Eureka + Config + Bus

主要作用:替代Eureka做服务注册中心;替代Config做服务配置中心 # Nacos 两大组件&服务注册中心 ## 两大组件 与 Eureka 类似,Nacos 也采用 CS(Client/Server,客户端/服务器)架构,它包含两大组件,如下表
组件 描述 功能
Nacos Server Nacos 服务端,与 Eureka Server 不同,Nacos Server 由阿里巴巴团队使用 Java 语言编写,用户只需要直接下载并运行即可。 Nacos Server 可以作为服务注册中心,帮助 Nacos Client 实现服务的注册与发现。
Nacos Server 可以作为配置中心,帮助 Nacos Client 在不重启的情况下,实现配置的动态刷新。
Nacos Client Nacos 客户端,通常指的是微服务架构中的各个服务,由用户自己搭建,可以使用多种语言编写。 Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-discovery,在服务注册中心(Nacos Server)中实现服务的注册与发现。
Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-config,在配置中心(Nacos Server)中实现配置的动态刷新。

服务注册中心

Nacos 作为服务注册中心可以实现服务的注册与发现,流程如下图

画板

  • 服务注册中心(Register Service):它是一个 Nacos Server,可以为服务提供者和服务消费者提供服务注册和发现功能
  • 服务提供者(Provider Service):它是一个 Nacos Client,用于对外服务。它将自己提供的服务注册到服务注册中心,以供服务消费者发现和调用
  • 服务消费者(Consumer Service):它是一个 Nacos Client,用于消费服务。它可以从服务注册中心获取服务列表,调用所需的服务
Nacos 实现服务注册与发现的流程如下:
  1. 从 Nacos 官方提供的下载页面中,下载 Nacos Server 并运行。
  2. 服务提供者 Nacos Client 启动时,会把服务以服务名(spring.application.name)的方式注册到服务注册中心(Nacos Server);
  3. 服务消费者 Nacos Client 启动时,也会将自己的服务注册到服务注册中心;
  4. 服务消费者在注册服务的同时,它还会从服务注册中心获取一份服务注册列表信息,该列表中包含了所有注册到服务注册中心上的服务的信息(包括服务提供者和自身的信息);
  5. 在获取了服务提供者的信息后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。

安装和运行Nacos

当前时间版本最新是 2.1.1 ,那我们就以这个为列来安装和运行

Spring Cloud Alibaba Nacos - 图2

:::info

  1. 进入下载页面,GitHub下载地址

:::

Spring Cloud Alibaba Nacos - 图3

:::info

  1. 下载后解压,目录结构如下、各目录说明如下:
  • bin:用于存放 Nacos 的可执行命令
  • conf:用于存放 Nacos 配置文件
  • target:用于存放 Nacos 应用的 jar 包

:::

Spring Cloud Alibaba Nacos - 图4

:::info

  1. 打开命令行窗口,进入到 Nacos 安装目录的 bin 下,执行以下命令以单机模式启动 Nacos Server。

:::

  1. startup.cmd -m standalone

启动日志如下

Spring Cloud Alibaba Nacos - 图5

Nacos Server启动后,在浏览器输入http://ip:8848查看控制台:
  • 默认账号/密码:nacos/nacos

Spring Cloud Alibaba Nacos - 图6

Spring Cloud Alibaba Nacos - 图7

自此,我们就完成了 Nacos Server 的下载、安装和运行工作。

Nacos 注册中心使用案例

以下示例说明了如何向 Nacos Nacos项目搭建的对应版本,可以参考官方GitHub仓库的WiKi说明:版本说明 · alibaba/spring-cloud-alibaba Wiki :::warning 说明:我们创建两个服务提供者和一个服务消费者,来展示注册中心的使用方法和步骤,整体的大纲如下 结构如下 + spring-cloud-alibaba-demo:父项目,下面三个子项目全部引用这个 - spring-cloud-alibaba-nacos-provider-8001:服务提供者 8001 端口 - spring-cloud-alibaba-nacos-provider-8002:服务提供者 8002 端口(后续验证Nacos注册中心负载均衡操作) - spring-cloud-alibaba-nacos-consumer-8801:服务消费者 8801 端口,用来消费提供者接口 Spring Cloud Alibaba Nacos - 图8 ::: ## 搭建服务提供者 首选要创建父项目,很简单创建一个空项目,修改 pom 文件即可。 xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 一定要加 --> <packaging>pom</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.chen</groupId> <artifactId>spring-cloud-alibaba-demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <spring.cloud.alibaba.version>2021.0.1.0</spring.cloud.alibaba.version> <spring.cloud.version>2021.0.1</spring.cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring.cloud.alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring.cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project> ### 1. 创建Moudlle(SpringBoot项目) spring-cloud-alibaba-nacos-provider-8001 Spring Cloud Alibaba Nacos - 图9 ### 2. 调整 pom文件 xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--父工程--> <parent> <groupId>com.chen</groupId> <artifactId>spring-cloud-alibaba-demo</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.chen</groupId> <artifactId>spring-cloud-alibaba-nacos-provider-8001</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-cloud-alibaba-nacos-provider-8001</name> <description>spring-cloud-alibaba-nacos-provider-8001</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ### 3. 修改配置文件 *.yml&*.<font style="color:rgb(0, 0, 0);">properties</font> yaml server: port: 8002 spring: application: name: chen-nacos-provider cloud: nacos: discovery: server-addr: 127.0.0.1:8848 ### 4. 启动类调整 java package com.chen.springcloudalibabanacosprovider8001; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient//开启服务注册与发现功能 public class SpringCloudAlibabaNacosProvider8001Application { public static void main(String[] args) { SpringApplication.run(SpringCloudAlibabaNacosProvider8001Application.class, args); } } ### 5. controller层 java package com.chen.springcloudalibabanacosprovider8001.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class NacosProviderApplication { @Value("${server.port}") private String serverPort = null; @GetMapping("/provider/nacos/{id}") public String getResult(@PathVariable("id") Integer id) { String rspBody = "<h2>小陈童鞋您好,本次数据查询成功!</h2>服务名:spring-cloud-alibaba-provider<br /> 端口号: " + serverPort + "<br /> 传入的参数:" + id; return rspBody; } } :::info 最终浏览器调用结果如下: Spring Cloud Alibaba Nacos - 图10 启动后会发现我们的Nacos服务服务注册中心多了条记录: Spring Cloud Alibaba Nacos - 图11 ::: ## 搭建服务消费者 ### 1. 创建Moudlle(SpringBoot项目) spring-cloud-alibaba-nacos-consumer-8801 Spring Cloud Alibaba Nacos - 图12 ### 2. 调整 pom文件 xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--父工程--> <parent> <groupId>com.chen</groupId> <artifactId>spring-cloud-alibaba-demo</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.chen</groupId> <artifactId>spring-cloud-alibaba-nacos-consumer-8801</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-cloud-alibaba-nacos-consumer-8801</name> <description>spring-cloud-alibaba-nacos-consumer-8801</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--由于 Netflix Ribbon 进入停更维护阶段,因此新版本的 Nacos discovery 都已经移除了 Ribbon ,此时我们需要引入 loadbalancer 代替 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ### 3. 修改配置文件 *.yml&*.<font style="color:rgb(0, 0, 0);">properties</font> yaml server: port: 8801 spring: application: name: chen-nacos-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #以下配置信息并不是默认配置,是我们自定义的配置,目的是不在 Controller 内硬编码服务提供者的服务名 service-url: nacos-user-service: http://chen-nacos-provider #服务提供者的服务名 ### 4. 启动类调整 java package com.chen.springcloudalibabanacosconsumer8801; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient//开启服务注册与发现功能 public class SpringCloudAlibabaNacosConsumer8801Application { public static void main(String[] args) { SpringApplication.run(SpringCloudAlibabaNacosConsumer8801Application.class, args); } } ### 5. controller层 java package com.chen.springcloudalibabanacosconsumer8801.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestController public class NacosConsumerApplication { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; //服务提供者的服务名 @GetMapping("/consumer/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id) { return restTemplate.getForObject(serverURL + "/provider/nacos/" + id, String.class); } } :::info 结果:我们访问我们消费者的Controller,发现最终会映射到我们的提供者身上 Spring Cloud Alibaba Nacos - 图13 当我们启动此服务后,再次查看服务注册中心会发现如下有两条服务,一个提供服务 一个消费服务: Spring Cloud Alibaba Nacos - 图14 ::: ### 6. 开启负载均衡 1. 参照上方服务提供搭建步骤在添加一套 spring-cloud-alibaba-nacos-provider-8002 只需修改端口即可,搭建完毕后启动注册到Nacos中 2. 添加配置类 java package com.chen.springcloudalibabanacosconsumer8801.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ApplicationContextBean { @Bean @LoadBalanced //与 Ribbon 集成,并开启负载均衡功能 public RestTemplate getRestTemplate() { return new RestTemplate(); } } 3. controller java package com.chen.springcloudalibabanacosconsumer8801.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestController public class NacosConsumerApplication { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; //服务提供者的服务名 @GetMapping("/consumer/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id) { return restTemplate.getForObject(serverURL + "/provider/nacos/" + id, String.class); } } 再次访问,同一个地址会映射到两套不通端口的服务上去: Spring Cloud Alibaba Nacos - 图15Spring Cloud Alibaba Nacos - 图16 # Nacos 配置中心使用案例 ## 配置中心基本使用配置 ### 1. 新建Moudle spring-cloud-alibaba-config-client-9001 Spring Cloud Alibaba Nacos - 图17 ### 2. 调整 pom文件 使用配置中心核心需要引入这一个依赖: xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--父工程--> <parent> <groupId>com.chen</groupId> <artifactId>spring-cloud-alibaba-demo</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.chen</groupId> <artifactId>spring-cloud-alibaba-config-client-9001</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-cloud-alibaba-config-client-9001</name> <description>spring-cloud-alibaba-config-client-9001</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--SpringCloud2020及以后的版本默认不启用 bootstrap 配置,我们需要在pom里面显式地引入:--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ### 3. 配置文件配置 这里需要配置两个,一个bootstrap和一个application。 :::info 原因:Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。 ::: springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application。 + 全局的放在:bootstrap.yml
+ 自己的放在:application.yml ** bootstrap.yml yaml server: port: 9001 spring: application: name: chen-nacos-config # 配置中心名称 cloud: nacos: config: server-addr: 127.0.0.1:8848 # 配置中心注册地址 file-extension: yaml #指定yaml配置格式 application.yml yaml spring: profiles: active: dev #激活 dev 环境配置 bootstrap + application 就表示我要去配置中心找名为chen-nacos-config-dev.yaml的文件 ### 4. 主启动类 java package com.chen.springcloudalibabaconfigclient9001; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class SpringCloudAlibabaConfigClient9001Application { public static void main(String[] args) { SpringApplication.run(SpringCloudAlibabaConfigClient9001Application.class, args); } } ### 5. 业务类 通过Spring Cloud原生注解@RefreshScope** 实现配置自动更新 java package com.chen.springcloudalibabaconfigclient9001.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope //配置自动更新 public class ConfigClientController { @Value("${config.info}") private String ConfigInfo; @GetMapping("/config/info") public String getConfigInfo() { return ConfigInfo; } } ### 6. 在Nacos控制台添加配置信息 :::info Nacos中的配置规则: 说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。 在 Nacos Spring Cloud 中,dataId 的完整格式如下: ${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档 注意:当** spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}**
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

:::

注意nacos只识别yaml,不支持yml。

最终公式:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

结果: chen-nacos-config<font style="color:rgb(51, 51, 51);background-color:rgb(248, 248, 248);">-dev.yaml</font>

Spring Cloud Alibaba Nacos - 图18


配置新增

Spring Cloud Alibaba Nacos - 图19

Data Id:配置规则如上

Spring Cloud Alibaba Nacos - 图20

7. 测试

启动9001访问地址:http://localhost:9001/config/info 结果如下:

Spring Cloud Alibaba Nacos - 图21

自带动态刷新:修改nacos中的yaml配置文件,再次调用查看配置,发现配置刷新了。

Spring Cloud Alibaba Nacos - 图22

Spring Cloud Alibaba Nacos - 图23

Nacos配置中心分类配置

:::info 分布式开发中的多环境多项目管理问题

实际开发中,通常一个系统会准备dev开发环境、test测试环境、prod生产环境。如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?

:::

Spring Cloud Alibaba Nacos - 图24

Nacos实现方式有三种:

  • Namespace
  • Group
  • Data ID

Namespace+Group+Data ID三者关系类似Java里面的package名和类名,最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。

用于进行租户粒度的配置隔离。不同的命名空间(Namespace)下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

默认情况:

Namespace=public,Group=DEFAULT_GROUP, 默认Cluster是DEFAULT

Nacos默认的命名空间是public,Namespace主要用来实现隔离。

比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。

Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去

Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。

比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。

最后是Instance,就是微服务的实例。

DataID使用配置

指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置,如下:

Spring Cloud Alibaba Nacos - 图25通过spring.profile.active属性就能进行多环境下配置文件的读取

Spring Cloud Alibaba Nacos - 图26

如果配置dev,请求地址 http://localhost:9001/config/info 响应如下

Spring Cloud Alibaba Nacos - 图27

如果配置test,请求地址 http://localhost:9001/config/info 响应如下

Spring Cloud Alibaba Nacos - 图28

Group使用配置

默认Group是DEFAULT_GROUP,现在通过Group实现环境分区

  1. 新建一个配置文件,添加DEV_GROUP分组和TEST_GROUP分组

Spring Cloud Alibaba Nacos - 图29

  1. application.yml config下增加一条group的配置即可。可配置为DEV_GROUP或TEST_GROUP

Spring Cloud Alibaba Nacos - 图30

  1. 根据group配置请求 http://localhost:9001/config/info

Spring Cloud Alibaba Nacos - 图31

Spring Cloud Alibaba Nacos - 图32

namesapce使用配置

  1. 新建dev/test的Namesapce

Spring Cloud Alibaba Nacos - 图33

  1. 回到服务管理 — 服务列表查看

Spring Cloud Alibaba Nacos - 图34

  1. 在这两个新建的namespace中分别新建三个不同分组的配置文件

Spring Cloud Alibaba Nacos - 图35

  1. 修改9001的yml文件

Spring Cloud Alibaba Nacos - 图36

:::info DataID方案是在默认namesapce和默认Group下,创建两个不同的DataID。

Group方案是在默认namespace下,新建两个DataID相同的配置文件,通过指定不同的分组来读取不同的配置。

Namespace方案,是相同的Group,相同的DataID,创建并指定不同的namespace来读取不同配置。

:::