目录
十二、SpringCloud Alibaba入门简介
1. 基本介绍
2.作用
3.版本选型
十三、 SpringCloud Alibaba Nacos服务注册和配置中心
1.简介
2.各种注册中心比较
3.下载安装
4.Nacos Discovery服务注册中心
(1) 基于 Nacos 的服务提供者
(2)基于 Nacos 的服务消费者
(3)负载均衡
5.Nacos Config服务配置中心
(1)准备工作
(2)在 Nacos 中添加配置信息(重点)
(3)动态刷新
(4)历史配置
6.Nacos 数据模型之 Namespace-Group-DataId
(1)多环境多项目管理
(2)三种方案加载配置
Ⅰ. DataID 方案
Ⅱ. Group 方案
Ⅲ. Namespace方案
7. 配置共享
(1)同服务内配置共享
(2)不同微服务共享配置
(3)配置共享的优先级
十二、SpringCloud Alibaba入门简介
1. 基本介绍
诞生:2018.10.31,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,并在 Maven 中央库发布了第一个版本。
2.作用
3.版本选型
有关详细说明,请看下方,这里不再过多赘述
SpringCloud框架学习(第一部分:初始项目搭建)_idea2024创建springcloud项目-CSDN博客https://blog.csdn.net/xpy2428507302/article/details/143419140?spm=1001.2014.3001.5502
十三、 SpringCloud Alibaba Nacos服务注册和配置中心
1.简介
命名由来:前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 Service
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
(Nacos就是注册中心 + 配置中心的组合,等价于 Spring Cloud Consul)
作用:
- 替代 Eureka / Consul 做服务注册中心
- 替代 (Config+Bus) / Consul 做服务配置中心和满足动态刷新广播通知
2.各种注册中心比较
注:CAP原则又称 CAP 定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
据说 Nacos 在阿里巴巴内部有超过 10 万的实例运行,已经过了类似双十一等各种大型流量的考验,Nacos 默认是 AP 模式,
但也可以调整切换为 CP,我们一般用默认AP即可。
3.下载安装
官网:Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网
解压安装包,在 bin 目录下的打开 cmd 运行:startup.cmd -m standalone
命令运行成功后,直接访问:http://localhost:8848/nacos
注意:
① 如果需要登录, 默认账号密码都是 nacos
② 关闭 cmd 窗口,nacos服务器也就自动关闭了
4.Nacos Discovery服务注册中心
SpringCloud Alibaba参考中文文档:快速开始 | Spring Cloud Alibabahttps://spring-cloud-alibaba-group.github.io/zh-cn/docs/2023.0.0.0-RC1/user-guide/nacos/quick-start
为了和之前的做区分,我们这里重新创建 服务提供者 和 服务消费者模块!!!
(1) 基于 Nacos 的服务提供者
步骤:
① 新建 Module(cloudalibaba-provider-payment9001)
② 导入依赖
<dependencies><!--nacos-discovery--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 引入自己定义的api通用包 --><dependency><groupId>com.mihoyo.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>
③ 修改 application.yml
javascript">server:port: 9001spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: localhost:8848 #配置Nacos地址
④ 修改主启动类
java">@SpringBootApplication
@EnableDiscoveryClient
public class Main9001
{public static void main(String[] args){SpringApplication.run(Main9001.class,args);}
}
⑤ 编写业务类(PayAlibabaController)
java">@RestController
public class PayAlibabaController
{@Value("${server.port}")private String serverPort;@GetMapping(value = "/pay/nacos/{id}")public String getPayInfo(@PathVariable("id") Integer id){return "nacos registry, serverPort: "+ serverPort+"\t id"+id;}
}
⑥ 打开 nacos 服务器,启动 9001,访问地址:http://localhost:8848/nacos
我们发现,9001 已成功入驻 nacos 服务器!
同时,访问地址:http://localhost:9001/pay/nacos/11,检测 9001 是否正常
(2)基于 Nacos 的服务消费者
步骤:
① 新建 Module(cloudalibaba-consumer-nacos-order83)
② 导入依赖
<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>
注意:
服务消费者作为客户端,要调用服务提供者,所以必然涉及到负载均衡,要导入 loaderBalancer 的依赖。
③ 修改 application.yml
javascript">server:port: 83spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: localhost:8848#消费者将要去访问的微服务名称(nacos微服务提供者叫什么你写什么)
service-url:nacos-user-service: http://nacos-payment-provider
④ 修改主启动类
java">@EnableDiscoveryClient
@SpringBootApplication
public class Main83
{public static void main(String[] args){SpringApplication.run(Main83.class,args);}
}
⑤ 编写业务类(OrderNacosController)
注意:
我们现在讲的,仍然是通过 RestTemplate 进行服务的调用,并结合 LoadBalancer 实现负载均衡。当然它也支持 openfeign,具体操作我们后面再说。
所以,服务消费者需要配置 RestTemplate:
java">@Configuration
public class RestTemplateConfig
{@Bean@LoadBalanced //赋予RestTemplate负载均衡的能力public RestTemplate restTemplate(){return new RestTemplate();}
}
OrderNacosController:
java">@RestController
public class OrderNacosController
{@Resourceprivate RestTemplate restTemplate;@Value("${service-url.nacos-user-service}")private String serverURL;@GetMapping("/consumer/pay/nacos/{id}")public String paymentInfo(@PathVariable("id") Integer id){String result = restTemplate.getForObject(serverURL + "/pay/nacos/" + id, String.class);return result+"\t"+" 我是OrderNacosController83调用者。。。。。。";}
}
⑥ 打开 nacos 服务器,启动 83,访问地址:http://localhost:8848/nacos
我们发现,83 已成功入驻 nacos 服务器!
同时,访问地址:http://localhost:83/consumer/pay/nacos/14,检测 83 是否正常
(3)负载均衡
在过去,我们参照 9001 重新创建了一个同样的模块 9002,来检测负载均衡,但过于麻烦。
现在,我们采用一种新的办法:直接拷贝虚拟端口映射
同时启动 9001、9002 和 83
打开 nacos,我们发现服务提供者的实例已经变成了 2 个,说明 9002 入驻成功!
测试,访问地址: http://localhost:83/consumer/pay/nacos/11
我们发现,9001 和 9002 交替轮询出现,负载均衡实现成功!
5.Nacos Config服务配置中心
之前案例 Consul8500 服务配置动态变更功能可以被 Nacos 取代
通过 Nacos 和 spring-cloud-starter-alibaba-nacos-config 实现中心化全局配置的动态变更!
(1)准备工作
步骤:
① 新建 Module(cloudalibaba-config-nacos-client3377)
② 导入依赖
<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>
③ 修改 aplication.yml 和 bootstrap.yml
Question:为什么要配置两个 yml ?
Nacos 同 Consul 一样,在项目初始化时,要保证先从配置中心进行配置拉取。
拉取配置之后,才能保证项目的正常启动,为了满足动态刷新和全局广播通知
bootstrap.yml:
javascript"># nacos配置
spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址config:server-addr: localhost:8848 #Nacos作为配置中心地址file-extension: yaml #指定yaml格式的配置# nacos端配置文件DataId的命名规则是:
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 本案例的DataID是:nacos-config-client-dev.yaml
application.yml:
javascript">server:port: 3377spring:profiles:active: dev # 表示开发环境#active: prod # 表示生产环境#active: test # 表示测试环境
④ 修改主启动类
java">@EnableDiscoveryClient
@SpringBootApplication
public class Main3377
{public static void main(String[] args){SpringApplication.run(NacosConfigClient3377.class,args);}
}
⑤ 编写业务类(NacosConfigClientController)
java">@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class NacosConfigClientController
{@Value("${config.info}")private String configInfo;@GetMapping("/config/info")public String getConfigInfo() {return configInfo;}
}
细节:通过 SpringCloud 原生注解 @RefreshScope 实现配置自动更新
(2)在 Nacos 中添加配置信息(重点)
我们注意到,在 nacos 配置管理中,有一个 Data Id,它代表什么呢?怎么取值呢?
最后公式: ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} |
联系说明:
所以,本案例的 Data ID 是:nacos-config-client-dev.yaml
它就代表 3377 服务在 nacos 上的进行配置管理时的配置信息的名称!
Question:如何在 nacos 上进行配置管理?
发布后,配置列表中可以看到:
测试:启动 3377,访问地址: http://localhost:3377/config/info
说明,已经成功获取到 nacos 中编写的配置信息!
(3)动态刷新
我们还可以通过编辑,修改 nacos 中的配置信息。
再次访问地址:http://localhost:3377/config/info,无需重启服务,即可实现动态刷新!
(4)历史配置
Nacos 会记录配置文件的历史版本,默认保留30天。
此外还有一键回滚功能,回滚操作将会触发配置更新!
6.Nacos 数据模型之 Namespace-Group-DataId
(1)多环境多项目管理
Question1:
实际开发中,通常一个系统会准备
- dev开发环境
- test测试环境
- prod生产环境
如何保证指定环境启动时服务能正确读取到 Nacos上相应环境的配置文件呢?
Question2:
一个大型分布式微服务系统会有很多微服务子项目,
每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境......
那怎么对这些微服务配置进行分组和命名空间管理呢?
为此,nacos 设计了其独特的数据模型,可以通过 namespace,group,Data Id 定位到唯一 一个配置集,三者关系如下:
1 是什么 | 类似 Java 里面的 package 名和类名,最外层的 Namespace 是可以用于区分部署环境的, Group 和 DataID 逻辑上区分两个目标对象 |
2 默认值 | 默认情况:Namespace=public,Group=DEFAULT_GROUP Nacos 默认的命名空间是 public,Namespace 主要用来实现隔离。比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个 Namespace, 不同的 Namespace 之间是隔离的。Group默认是DEFAULT_GROUP, Group可以把不同的微服务划分到同一个分组里面去 |
Service就是微服务 | 一个Service可以包含一个或者多个Cluster(集群),一个 Cluster 包含一个或多个 instance(实例) Nacos 默认 Cluster 是 DEFAULT,Cluste r是对指定微服务的一个虚拟划分。 |
namespace,group,Data Id 在 nacos 的图形化管理界面具体体现如下:
(2)三种方案加载配置
通过 namespace,group,Data Id 可以定位到唯一 一个配置集,接下来我们将通过三种方式来进行不同环境下读取不同的配置:
Ⅰ. DataID 方案
通过 DataID 实现环境区分:默认空间public + 默认分组DEFAULT_GROUP + 新建DataID
nacos 中新建 DataID 表示 test 环境配置
修改 application.yml:
通过spring.profile.active属性就能进行多环境下配置文件的读取
基于第一种方式,只修改 Data Id,不修改 namespace 和 group,所以不需要修改 bootstrap.yml
测试:启动 3377,访问地址:http://localhost:3377/config/info
Ⅱ. Group 方案
通过Group实现环境区分:默认空间 public + 新建GROUP + 新建DataID
nacos 中新建 group 和 DataID 表示 prod 环境配置
修改 application.yml:
修改 bootstrap.yml:
在 config 下增加一条 group 的配置,为 PROD_GROUP(group 默认值是 DEFAULT_GROUP)
# nacos配置
spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址config:server-addr: localhost:8848 #Nacos作为配置中心地址file-extension: yaml #指定yaml格式的配置group: PROD_GROUP
测试:启动 3377,访问地址:http://localhost:3377/config/info
Ⅲ. Namespace方案
通过Namespace实现命名空间环境区分:新建空间Namespace + 新建GROUP + 新建DataID
nacos 中新建 namespace 表示 prod 环境配置
注意:如果第一行命名空间ID不填,则会自动生成一串ID,这个ID 后续要配置进 bootstrap.yml 中
在 Prod_Namespace 下新建 GROUP 和 DataID
修改 application.yml:
修改 bootstrap.yml:
在 config 下增加一条 namespace 的配置,为 Prod_Namespace(namespace 默认值是 public)
# nacos配置
spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址config:server-addr: localhost:8848 #Nacos作为配置中心地址file-extension: yaml #指定yaml格式的配置group: PROD_GROUPnamespace: Prod_Namespace #命名空间的 ID
测试:启动 3377,访问地址:http://localhost:3377/config/info
7. 配置共享
当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就考虑可不可以将公共配置⽂件提取出来
(1)同服务内配置共享
步骤:
新建⼀个以 spring.application.name 命名的配置文件,然后将其所有环境的公共配置放在里面
这里就不测试了,感兴趣的可以自己测试一下。(注意 group 和 namespace 两边应该相吻合)
可以新建一个 3377 的副本 module,检测两个实例是否都能连接数据库。
我这里只是配置了一下端口号,显示可以获取到
(2)不同微服务共享配置
不同服务之间实现配置共享的原理类似于文件引入,就是定义⼀个公共配置,然后在当前配置中引入。
步骤:
① 在 nacos 中定义⼀个 DataID 为 datasource.yaml 的配置,用于所有微服务共享
② 修改 bootstrap.yaml
# nacos配置
spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址config:server-addr: localhost:8848 #Nacos作为配置中心地址file-extension: yaml #指定yaml格式的配置
shared-dataids: datasource.yaml # 配置要引入的配置refreshable-dataids: datasource.yaml # 配置要实现动态配置刷新的配置
这里也不做测试了,感兴趣的可以自己测试一下(注意 group 和 namespace 两边应该相吻合)。
可以将不同微服务配置进 nacos,修改它们的 bootstrap.yaml,看看都是否能连接上数据库。
同样,我这里只是配置了一下端口号,显示可以获取到
(如果你也想这样,注意先把 nacos 中 nacos-config-client.yaml 的内容修改掉,因为它的优先级更高,会覆盖)
(3)配置共享的优先级
当nacos 、nacos服务器、本地同时出现相同属性时,优先级有高低之分:
服务名-环境.yaml > 服务名.yaml > datasource.yaml > bootstrap.yaml > application.yaml