Spring Cloud Alibaba Nacos-服务注册与配置中心
官网:https://github.com/alibaba/nacos,Nacos官方中文手册
1.什么是Nacos
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 主要功能包括:
- 服务发现和注册
- 配置管理
- DNS 服务
- 消息服务
Nacos的架构:
Nacos:架构理论基础: CAP 理论 (支持 AP 和 CP, 可以切换)
1.1Nacos两大组件
与 Eureka 类似,Nacos 也采用 CS(Client/Server,客户端/服务器)架构,它包含两大组件,如下表:
组件 | 描述 | 功能 |
---|---|---|
Nacos Server | Nacos 服务端,与 Eureka Server 不同,Nacos Server 由阿里巴巴团队使用 Java 语言编写并将 Nacos Server 的下载地址给用户,用户只需要直接下载并运行即可。 | 1. Nacos Server 可以作为服务注册中心,帮助 Nacos Client 实现服务的注册与发现。2. Nacos Server 可以作为配置中心,帮助 Nacos Client 在不重启的情况下,实现配置的动态刷新。 |
Nacos Client | Nacos 客户端,通常指的是微服务架构中的各个服务,由用户自己搭建,可以使用多种语言编写。 | 1. Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-discovery,在服务注册中心(Nacos Server)中实现服务的注册与发现。2. Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-config,在配置中心(Nacos Server)中实现配置的动态刷新。 |
1.2Nacos服务注册中心
Nacos 作为服务注册中心可以实现服务的注册与发现,流程如下图。
在图中共涉及到以下 3 个角色:
- 服务注册中心(Register Service):它是一个 Nacos Server,可以为服务提供者和服务消费者提供服务注册和发现功能。
- 服务提供者(Provider Service):它是一个 Nacos Client,用于对外服务。它将自己提供的服务注册到服务注册中心,以供服务消费者发现和调用。
- 服务消费者(Consumer Service):它是一个 Nacos Client,用于消费服务。它可以从服务注册中心获取服务列表,调用所需的服务。
Nacos 实现服务注册与发现的流程如下:
- 从 Nacos 官方提供的下载页面中,下载 Nacos Server 并运行。
- 服务提供者 Nacos Client 启动时,会把服务以服务名(spring.application.name)的方式注册到服务注册中心(Nacos Server);
- 服务消费者 Nacos Client 启动时,也会将自己的服务注册到服务注册中心;
- 服务消费者在注册服务的同时,它还会从服务注册中心获取一份服务注册列表信息,该列表中包含了所有注册到服务注册中心上的服务的信息(包括服务提供者和自身的信息);
- 在获取了服务提供者的信息后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。
2.Nacos服务注册中心
2.1Nacos Server使用
(1)下载Nacos Server
环境: Java8/Maven 3.2.x+
地址:Release 1.2.1(Mar 31th, 2020) · alibaba/nacos (github.com)
![image-20230604132250256](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604132250256.png)
(2)解压后,目录如下
![image-20230604133500391](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604133500391.png)
- bin:用于存放 Nacos 的可执行命令。
- conf:用于存放 Nacos 配置文件。
- target:用于存放 Nacos 应用的 jar 包。
(3)点击运行bin目录的 startup.cmd
![image-20230604133636648](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604133636648.png)
(4)运行成功后的窗口:
![image-20230604133721794](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604133721794.png)
(5)使用浏览器访问 http://localhost:8848/nacos,跳转到 Nacos Server 登陆页面,如下图。
默认账号密码都是nacos
![image-20230604134203850](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604134203850.png)
2.2创建服务提供者-集群
![image-20230604134406524](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604134406524.png)
如下,先创建一个服务提供者的集群:member-service-nacos-provider-10004 和 member-service-nacos-provider-10006
2.2.1创建member-service-nacos-provider-10004
创建 member-service-nacos-provider-10004 并注册到 NacosServer8848
(1)创建子module:member-service-nacos-provider-10004
![image-20230604135040422](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604135040422.png)
(2)父工程的pom文件需要引入spring-cloud-alibaba-dependencies
<!--SpringCloud Alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
在该工程的 pom.xml 中,我们通过 dependencyManagement 对 Spring Cloud Alibaba 的版本信息进行管理,该工程下的各个子模块在引入 Spring Cloud Alibaba 的各个组件时就不要单独指定版本号了。
(3)修改member-service-nacos-provider-10004的pom.xml
<!--引入相关的依赖,版本都使用父项目声明的版本-->
<dependencies>
<!--Spring Cloud Alibaba Nacos discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--actuator-starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--引入mybatis-starter,整合到springboot中-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--druid-starter-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--jdbc-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--test-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.li.springcloud</groupId>
<artifactId>e_commerce_center_common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
(4)在 member-service-nacos-provider-10004 的配置文件 application.properties 中添加以下配置
server:
port: 10004
spring:
application:
name: member-service-nacos-provider #配置应用的名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos Server的地址
#暴露所有的监控点
management:
endpoints:
web:
exposure:
include: '*'
(5)创建一个Controller类
package com.li.springcloud.controller;
import ...
/**
* @author 李
* @version 1.0
*/
@Controller
@Slf4j
public class MemberController {
@Resource
private MemberService memberService;
@PostMapping("/member/save")
@ResponseBody
public Result save(@RequestBody Member member) {
log.info("service-provider member={}", member);
int affected = memberService.save(member);
if (affected > 0) {
return Result.success("添加会员成功-member-service-nacos-provider-10004", affected);
} else {
return Result.error("401", "添加会员失败");
}
}
@GetMapping("/member/get/{id}")
@ResponseBody
public Result getMemberById(@PathVariable("id") Long id) {
Member member = memberService.queryMemberById(id);
if (member != null) {
return Result.success("查询会员成功,member-service-nacos-provider-10004", member);
} else {
return Result.error("402", "Id=" + id + "用户不存在!");
}
}
}
(6)创建主启动类,使用 @EnableDiscoveryClient 注解开启服务发现功能
package com.li.springcloud;
import ...
/**
* @author 李
* @version 1.0
*/
@SpringBootApplication
//引入Nacos发现注解
@EnableDiscoveryClient
public class MemberNacosProviderApplication10004 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosProviderApplication10004.class, args);
}
}
(7)使用浏览器访问 http://localhost:8848/nacos,查看“服务管理”下的“服务列表”,如下图
![image-20230604142327148](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604142327148.png)
从上图可以看到,我们搭建的服务提供者 member-service-nacos-provider-10004 所提供的服务已经被注册到了 Nacos Server 上了。
(8)浏览器访问 localhost:10004/member/get/1,结果如下
![image-20230604142521474](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604142521474.png)
2.2.2创建 member-service-nacos-provider-10006
创建过程略,参考member-service-nacos-provider-10004
- 创建新模块member-service-nacos-provider-10006
- 修改member-service-nacos-provider-10006 的pom.xml
- 在 member-service-nacos-provider-10006 的配置文件 application.properties 中添加配置
- 创建一个Controller类
- 创建主启动类
创建完毕之后,再使用浏览器访问 http://localhost:8848/nacos,查看“服务管理”下的“服务列表”,可以看到消费者的实例数变为2
![image-20230604143456689](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604143456689.png)
访问 localhost:10006/member/get/1,结果如下
![image-20230604143801023](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604143801023.png)
2.3创建服务消费者
![image-20230604144058084](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604144058084.png)
创建 member-service-nacos-consumer-80 并注册到 NacosServer8848
(1)创建子模块 member-service-nacos-consumer-80
(2)修改子模块的pom文件
<!--引入相关的依赖,版本都使用父项目声明的版本-->
<dependencies>
<!--引入alibaba-nacos,使用版本仲裁-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--actuator-starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.li.springcloud</groupId>
<artifactId>e_commerce_center_common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
(3)配置application.yml
server:
port: 80
spring:
application:
name: member-service-nacos-consumer-80
#配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos server地址
(4)创建主启动类,使用 @EnableDiscoveryClient 注解开启服务发现功能
package com.li.springcloud;
import ...
/**
* @author 李
* @version 1.0
*/
@SpringBootApplication
@EnableDiscoveryClient
public class MemberNacosConsumerApplication80 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosConsumerApplication80.class, args);
}
}
(5)创建一个名为 CustomizationBean 的配置类,并使用 @LoadBalanced 注解与 Ribbon 进行集成开启负载均衡功能
package com.li.springcloud.config;
import ...
/**
* @author 李
* @version 1.0
*/
@Configuration
public class CustomizationBean {
//nacos 本身就集成了 Ribbon, 直接支持 Ribbon+RestTemplate 调用
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
(6)创建一个名为 MemberNacosConsumerController 的 Controller 类
package com.li.springcloud.controller;
import ...
/**
* @author 李
* @version 1.0
*/
@RestController
@Slf4j
public class MemberNacosConsumerController {
//要求这里的服务名要小写,和服务 Nacos Server中注册名保持一致
public static final String MEMBER_SERVICE_NACOS_PROVIDER_URL =
"http://member-service-nacos-provider";
@Resource
private RestTemplate restTemplate;
@PostMapping("/member/nacos/consumer/save")
public Result<Member> save(Member member) {
return restTemplate.postForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL
+ "/member/save", member, Result.class);
}
@GetMapping("/member/nacos/consumer/get/{id}")
public Result<Member> getMemberById(@PathVariable("id") Long id) {
return restTemplate.getForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL
+ "/member/get/" + id, Result.class);
}
}
(7)启动member-service-nacos-consumer-80,访问 查看 Nacos Server 的服务列表
![image-20230604152844899](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604152844899.png)
(8)浏览器访问:http://localhost/member/nacos/consumer/get/1,成功访问,并且可以看到消费者调用服务提供方的负载均衡算法是轮询(默认)
![image-20230604153041435](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604153041435.png)
![image-20230604153059088](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604153059088.png)
(9)如果要修改负载均衡算法,可以创建配置类指定:
package com.li.springcloud.config;
import ...
/**
* @author 李
* @version 1.0
* 配置自己的负载均衡算法
*/
@Configuration
public class RibbonRule {
//注入指定的均衡算法
@Bean
public IRule myRibbonRule(){
//这里指定RandomRule
return new RandomRule();
}
}
3.Nacos AP和CP切换
- 各种注册中心对比
对比项目 | Nacos | Eureka | Consul | CoreDNS | Zookeeper |
---|---|---|---|---|---|
一致性协议 | CP+AP | AP | CP | — | CP |
健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | — | Keep Alive |
负载均衡策略 | 权重/metadata/Selector | Ribbon | Fabio | RoundRobin | — |
雪崩保护 | 有 | 有 | 无 | 无 | 无 |
自动注销实例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
K8S集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
-
AP 还是 CP ?
-
CP:服务可以不能用,但必须要保证数据的一致性。
-
AP:数据可以短暂不一致,但最终是需要一致的,无论如何都要保证服务的可用。
-
取舍:只能在 CP 和 AP 选择一个平衡点, 大多数都是选择 AP 模式
CAP原则又称CAP定理,指的是在一个分布式系统中的,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)
-
-
Nacos 的 AP 和 CP 切换
Nacos 集群默认支持的是CAP原则中的AP原则,但是也可切换为CP原则(一般不切换)
- CURL切换命令:curl -X PUT
$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP
- URL指令:
$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP
- CURL切换命令:curl -X PUT
4.Nacos配置中心
4.1什么是配置中心
在分布式微服务系统中,几乎所有服务的运行都离不开配置文件的支持,这些配置文件通常由各个服务自行管理,以 properties 或 yml 格式保存在各个微服务的类路径下,例如 application.properties 或 application.yml 等。
这种将配置文件散落在各个服务中的管理方式,存在以下问题:
- 管理难度大:配置文件散落在各个微服务中,难以管理。
- 安全性低:配置跟随源代码保存在代码库中,容易造成配置泄漏。
- 时效性差:微服务中的配置修改后,必须重启服务,否则无法生效。
- 局限性明显:无法支持动态调整,例如日志开关、功能开关。
为了解决这些问题,通常我们都会使用配置中心对配置进行统一管理。市面上开源的配置中心有很多,例如百度的 Disconf、淘宝的 diamond、360 的 QConf、携程的 Apollo 等都是解决这类问题的。Spring Cloud 也有自己的分布式配置中心,那就是 Spring Cloud Config。这里以Nacos为例。
4.2Nacos作为配置中心
Nacos Server 还可以作为配置中心,对 Spring Cloud 应用的外部配置进行统一地集中化管理。而我们只需要在应用的 POM 文件中引入 spring-cloud-starter-alibaba-nacos-config 即可实现配置的获取与动态刷新。
从配置管理的角度看,Nacos 可以说是 Spring Cloud Config 的替代方案,但相比后者 Nacos 的使用更简单,操作步骤也更少。
例子
![image-20230604160954834](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604160954834.png)
4.2.1在NacosServer中加入配置
(1)启动 Nacos Server,并在 Nacos Server 控制台的“配置管理”下的“配置列表”中,点击“+”按钮
![image-20230604161526862](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604161526862.png)
(2)新建如下配置
![image-20230604161934656](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604161934656.png)
(3)然后点击”发布“
![image-20230604162050022](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604162050022.png)
4.2.2创建Nacos配置客户端模块
(1)创建子模块e-commerce-nacos-config-client5000
(2)修改子模块的pom.xml,加入nacos-config
<!--引入相关的依赖,版本都使用父项目声明的版本-->
<dependencies>
<!--Spring Cloud Alibaba Config 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--SpringCloud ailibaba nacos 服务注册与发现模块 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Spring Boot 监控模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.li.springcloud</groupId>
<artifactId>e_commerce_center_common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
(3)创建 application.yml
spring:
profiles:
active: dev #指定环境,常见的环境有dev开发/test测试/prod生产环境
(4)创建 bootstrap.yml(还是在resources文件下)
server:
port: 5000 #端口号
spring:
application:
#需要参考nacos server的Data Id
name: e-commerce-nacos-config-client #服务名
#配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
#解释:nacos 配置客户端,会根据配置,找到资源获取配置文件
#1) config-server-addr: localhost:8848
#2) spring.application.name 对应 DataId: e-commerce-nacos-config-client
#3) spring.profiles.active dev
#4) spring.cloud.nacos.config.file-extension 文件扩展名) .yaml
#也是就到 localhost:8848 下的 e-commerce-nacos-config-client-dev.yaml获取配置信息
#规则总结:
#${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
在 Nacos Server 中,配置的 dataId(即 Data ID)的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
dataId 格式中各参数说明如下:
- ${prefix}:默认取值为微服务的服务名,即配置文件中 spring.application.name 的值,我们可以在配置文件中通过配置 spring.cloud.nacos.config.prefix 来指定。
- ${spring.profiles.active}:表示当前环境对应的 Profile,例如 dev、test、prod 等。当没有指定环境的 Profile 时,其对应的连接符也将不存在, dataId 的格式变成 \({prefix}.\){file-extension}。
- ${file-extension}:表示配置内容的数据格式,我们可以在配置文件中通过配置项 spring.cloud.nacos.config.file-extension 来配置,例如 properties 和 yaml。
(5)添加主启动类
package com.li.springcloud;
import ...
/**
* @author 李
* @version 1.0
*/
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientApplication5000 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientApplication5000.class, args);
}
}
(6)添加一个业务类
package com.li.springcloud.controller;
import ...
/**
* @author 李
* @version 1.0
*/
@RestController
@Slf4j
public class NacosConfigClientController {
/**
* 1. client 会拉取 Nacos Server 的 e-commerce-nacos-config-client-dev.yaml
* 2. @Value("${config.ip}") 会将 config.ip 赋给 configIp
*/
@Value("${config.ip}")
private String configIp;
@Value("${config.name}")
private String configName;
@GetMapping("/nacos/config/ip")
public String getConfigIp() {
return configIp;
}
@GetMapping("/nacos/config/name")
public String getConfigName() {
return configName;
}
}
(7)顺序启动 Nacos Server,e-commerce-nacos-config-client5000,在浏览器访问: http://localhost:5000/nacos/config/ip 和 localhost:5000/nacos/config/name,结果如下
访问成功,说明 e-commerce-nacos-config-client5000 成功从Nacos中获取了配置数据。
4.2.3注意事项
- 配置文件 application.yml 和 bootstrap.yml 结合会得到配置文件/资源的地址
- 参考文档: https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
- 注意在 Nacos Server 的配置文件的后缀是 .yaml , 而不是 .yml
- 在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动, 也就是说如果项目不能正确的获取到 Nacos Server 的配置数据,项目是启动不了的
- springboot 中 配置文件的加载是存 在优先级顺序的,bootstrap.yml 优先级高于application.yml
- @RefreshScope 是 springcloud 原生注解,实现配置信息自动刷新, 如果在 Nacos Server 修改了配置数据,Client 端就会得到最新配置
例子
-
在业务类添加@RefreshScope注解,并重启
-
在 Nacos Server 修改配置数据
-
Nacos Server 修改配置数据后不重启 e-commerce-nacos-config-client5000,直接访问 http://localhost:5000/nacos/config/name ,可以看到获取的配置数据自动更新了
5.Nacos分类配置(实现配置隔离)
参考:https://blog.csdn.net/cxkjntm123/article/details/129547730
在微服务体系中,一个系统往往被拆分为多个服务,每个服务都有自己的配置文件,然后每个系统往往还会准备开发环境、测试环境、正式环境。
假设某系统有10个微服务,那么至少有10个配置文件,三个环境(dev\test\prod),那就有30个配置文件需要进行管理。这么多的配置文件,要修改一个或者多个的时候,稍有不慎可能就会出现改错了、不生效…等等问题。
引入Nacos作为配置中心后,如何有效的进行配置文件的管理和不同环境间的隔离区分呢?
5.1DataID方案
需求:
![image-20230604175752717](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604175752717.png)
(1)在 nacos server 创建新的配置:e-commerce-nacos-config-client-test.yaml
![image-20230604180121411](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604180121411.png)
![image-20230604180223982](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604180223982.png)
(2)修改 application.yml文件,将原来的dev修改为test,就可以获取到不同的配置文件数据
spring:
profiles:
active: test #指定环境,常见的环境有dev开发/test测试/prod生产环境
(3)重启 e-commerce-nacos-config-client5000,访问 http://localhost:5000/nacos/config/name
![image-20230604180529711](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604180529711.png)
5.2Group方案
需求:
![image-20230604180725038](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604180725038.png)
(1)在 nacos server 创建两个新的配置:e-commerce-nacos-config-client-dev.yaml,组名分别为 order和seckill
![image-20230604184605369](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604184605369.png)
(2)修改application.yml文件,指定开发环境
spring:
profiles:
active: dev #指定环境,常见的环境有dev开发/test测试/prod生产环境
(3)修改bootstrap.yml文件,指定group的名称
server:
port: 5000 #端口号
spring:
application:
#需要参考nacos server的Data Id
name: e-commerce-nacos-config-client #服务名
#配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
group: order #指定组名称,默认为”DEFAULT_GROUP“
(4)重启 e-commerce-nacos-config-client5000,访问 http://localhost:5000/nacos/config/name
![image-20230604190137911](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604190137911.png)
5.3Namespace方案
例子:
![image-20230604190309823](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604190309823.png)
(1)在 Nacos Server 中创建两个不同的命名空间
![image-20230604190930205](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604190930205.png)
![image-20230604190615638](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604190615638.png)
![image-20230604190815559](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604190815559.png)
这时在配置列表中可以看到多了两个命名空间:
![image-20230604191107478](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604191107478.png)
(2)分别在两个命名空间下创建新的配置
alibaba命名空间:
![image-20230604191619588](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604191619588.png)
![image-20230604191544602](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604191544602.png)
baidu命名空间:
![image-20230604191953273](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604191953273.png)
![image-20230604191924066](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604191924066.png)
(3)修改 application.yml,指定环境
spring:
profiles:
active: dev #指定环境,常见的环境有dev开发/test测试/prod生产环境
(4)修改bootstrap.yml文件,指定group,namespace的名称
server:
port: 5000 #端口号
spring:
application:
#需要参考nacos server的Data Id
name: e-commerce-nacos-config-client #服务名
#配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
group: seckill # 指定组名,默认为 DEFAULT_GROUP
namespace: 96bfb0c9-54e1-4a94-bd2c-6cde5a114d35 # namespace id
![image-20230604192453911](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604192453911.png)
(5)重启 e-commerce-nacos-config-client5000,访问 http://localhost:5000/nacos/config/name
![image-20230604192745292](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20230604192745292.png)
5.4Namespace/Group/Data ID关系
![img](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/2a2aa83a1e767cff951c247d0deaf86b.png)
![在这里插入图片描述](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/202105311539240.png)
- Nacos 默认的命名空间是 public,Namespace 主要用来实现配置隔离,隔离范围大
- Group 默认是 DEFAULT GROUP,Group 可以把不同的微服务划分到同一个分组里面去
- Service 就是微服务,相同的 Service 可以是一个 Cluster(簇/集群),Instance 就是微服务的实例