SpringCloud Alibaba——Nacos服务注册和配置中心
一、总体介绍
二、Nacos 简介
(1)为什么叫 Nacos 这个名字
- Nacos: Dynamic Naming and Configuration Service
- 前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 Service
(2)是什么
- Redirecting to: https://nacos.io/
- 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
- 一句话
- Nacos 就是注册中心 + 配置中心的组合
- 等价于
- Nacos = Eureka+Config +Bus
- Nacos = Spring Cloud Consul
(3)能干嘛
- 替代 Eureka/Consul 做服务注册中心
- 替代(Config+Bus)/Consul 做服务配置中心和满足动态刷新广播通知
(4)去哪下
Redirecting to: https://nacos.io/
(5)各种注册中心比较
- 据说 Nacos 在阿里巴巴内部有超过 10 万的实例运行,已经过了类似双十一等各种大型流量的考验,Nacos默认是AP模式
- 但也可以调整切换为CP,我们一般用默认AP即可
三、Nacos 下载安装
(1)本地 Java17+Maven 环境已经 OK
注意Nacos版本!!!
(2)先从官网下载 Nacos
- Redirecting to: https://nacos.io/
- Nacos 快速开始 | Nacos 官网
- https://github.com/alibaba/nacos/releases
(3)解压安装包,直接运行 bin 目录下的 startup.cmd
(4)命令运行成功后直接访问
- http://localhost:8848/nacos
- 默认账号密码都是 nacos
(5)结果页面
(6)关闭服务器
shutdown.cmd
四、Nacos Discovery 服务注册中心
(1)概述
Nacos 融合 Spring Cloud,成为注册配置中心
(2)SpringCloud Alibaba 参考中文文档
Spring Cloud Alibaba 参考文档
(3)基于 Nacos 的服务提供者
4.3.1新建 Module
cloudalibaba-provider-payment9001
4.3.2POM
<?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>
<parent>
<groupId>com.atguigu.cloud</groupId>
<artifactId>mscloudV5</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>cloudalibaba-provider-payment9001</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入自己定义的api通用包 -->
<dependency>
<groupId>com.atguigu.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--SpringBoot通用依赖模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<scope>provided</scope>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.3.3YML
4.3.4主启动
4.3.5业务类
4.3.6测试
- localhost:9001/pay/nacos/11
- nacos控制台
- nacos8848 注册中心 + 服务提供者 pay9001 都 OK 了
(4)基于 Nacos 的服务消费者
4.4.1新建 Module
cloudalibaba-consumer-nacos-order83
4.4.2POM
<?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>
<parent>
<groupId>com.atguigu.cloud</groupId>
<artifactId>mscloudV5</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>cloudalibaba-consumer-nacos-order83</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--loadbalancer-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--web + actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意:它比服务提供者多了一个负载均衡的依赖
4.4.3YML
4.4.4主启动
4.4.5业务类
- 配置 config
- OrderNacosController
4.4.6测试
- nacos 控制台
- http://localhost:83/consumer/pay/nacos/14
(5)负载均衡
4.5.1参照 9001 新建 9002
- 要么老实新建,cloudalibaba-provider-payment9002。要么取巧不想新建重复体力劳动,直接拷贝虚拟端口映射
- 步骤
4.5.2测试
- http://localhost:83/consumer/pay/nacos/14
- 看到端口号 9001/9002 交替出现,负载均衡达到
五、Nacos Config 服务配置中心
(1)概述
- 之前案例 Consul8500 服务配置动态变更功能可以被 Nacos 取代
- 通过 Nacos 和 spring-cloud-starter-alibaba-nacos-config 实现中心化全局配置的动态变更
(2)官网文档
- Nacos 融合 Spring Cloud,成为注册配置中心
- SpringCloud Alibaba 参考中文文档:Spring Cloud Alibaba 参考文档
(3)Nacos 作为配置中心配置步骤
5.3.1建 Module
cloudalibaba-config-nacos-client3377
5.3.2POM
<?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">
<parent>
<artifactId>mscloudV5</artifactId>
<groupId>com.atguigu.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-config-nacos-client3377</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!--bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</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>
<!--web + actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
5.3.3YML
(1)why 配置两个
- Nacos同Consul一样,在项目初始化时,要保证先从配置中心进行配置拉取
- 拉取配置之后,才能保证项目的正常启动,为了满足动态刷新和全局广播通知
- springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
(2)YML2024
- bootstrap.yml
- application
5.3.4主启动
5.3.5业务类
5.3.6在 Nacos 中添加配置信息(重点)
(1)Nacos 中的匹配规则
- 设置 DataId 理论
- Nacos 中的 dataid 的组成格式及与 SpringBoot 配置文件中的匹配规则
- 官网:Nacos 融合 Spring Cloud,成为注册配置中心
- 配置 DataId 实操
- 公式:
- prefix 默认为 spring.application.name 的值
- spring.profile.active 即为当前环境对应的 profile,可以通过配置项 spring.profile.active 来配置
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置
- 小总结说明
- 公式:
(2)案例步骤
- 查看 YML
- 创建配置
- 配置 DataId 和对应文件
- Data ID:nacos-config-client-dev.yaml
- 三码合一
5.3.7测试
- 启动 Nacos 且在 nacos 后台管理 - 配置列表下已经存在对应的 yaml 配置文件
- 运行 cloud-config-nacos-client3377 的主启动类
- 调用接口查看配置信息:http://localhost:3377/config/info
5.3.8自带动态刷新
修改下 Nacos 中的 yaml 配置文件,再次调用查看配置的接口,就会发现配置已经刷新
5.3.9历史配置
- Nacos 会记录配置文件的历史版本默认保留 30 天,此外还有一键回滚功能,回滚操作将会触发配置更新
- 回滚
六、Nacos 数据模型之 Namespace-Group-DataId
(1)问题
多环境多项目管理
- 问题1:
- dev开发环境
- test测试环境
- prod生产环境
- 如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
- 问题2:
- 一个大型分布式微服务系统会有很多微服务子项目
- 每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境......
- 那怎么对这些微服务配置进行分组和命名空间管理呢?
(2)官网
Nacos 架构
(3)Namespace+Group+DataId 三者关系?为什么这么设计?
(4)Nacos 的图形化管理界面
- 命名空间 Namespace
- 配置管理
(5)三种方案加载配置
6.5.1DataID 方案
(1)指定 spring.profile.active 和配置文件的 DataID 来使不同环境下读取不同的配置
(2)默认空间 public + 默认分组 DEFAULT_GROUP + 新建 DataID
- 新建 test 配置 DataID:nacos-config-client-test.yaml
- nacos 后台
(3)修改 YML
- 通过 spring.profile.active 属性就能进行多环境下配置文件的读取
- bootstrap.yml
- application.yml
(4)测试
- http://localhost:3377/config/info
- 配置是什么就加载什么
6.5.2Group 方案
(1)通过 Group 实现环境区分
(2)默认空间 public + 新建 PROD_GROUP + 新建 DataID
- 新建 prod 配置 DataID:nacos-config-client-prod.yaml
- 新建 Group
- nacos 后台
(3)修改 YML
- 在 config 下增加一条 group 的配置即可。可配置为 PROD_GROUP
- bootstrap.yml
- application.yml
(4)测试
- http://localhost:3377/config/info
- 配置是什么就加载什么
6.5.3Namespace 方案
(1)通过 Namespace 实现命名空间环境区分
- 新建 Namespace:Prod_Namespace
- 新建 Namespace (但命名空间 ID 不填 (系统自动生成)):Prod2_Namespace
- 后台
(2)Prod_Namespace+PROD_GROUP+DataID(nacos-config-client-prod.yaml)
- 选定 Prod_Namespace 后新建
- 命名空间 - Prod_Namespace
- Data ID - nacos-config-client-prod.yaml
- GROUP - PROD_GROUP
- 后台
(3)修改 YML
- 在 config 下增加一条 namespace: Prod_Namespace
- bootstrap.yml
- application.yml
(4)测试
- http://localhost:3377/config/info
- 配置是什么就加载什么