SpringCloudAlibaba第一章(Nacos服务注册) -2024
目录
0:学习SpringCloudAlibaba(2023.x分支)
1:安装Nacos(2.3.2)
2:什么是Nacos
2.1:什么是Nacos
2.2:案例架构
4:服务提供者81、82使用案例
4.1:提供者8081和8082的pom
4.2: 提供者8081和8082的pom的controller
4.3: 提供者8081和8082的properties
4.4: 提供者8081和8082的main方法
4.5:启动查看
5:消费者80使用案例
5.1:消费者8080的pom
5.2:消费者8080的properties
5.3:消费者8080的controller
5.4:消费者8003的mian方法
5.5:启动查看
5.6:调用8080返回不同的端口号,证明8080负载调用了8001和8002
6:动态配置使用
6.1:8080的导入配置包
6.2:8080的properties
6.3:nacos服务器新建配置
6.4:8080controller方法
6.5:命名空间、分组隔离
7:Nacos的cap问题(支持AP和CP的切换)
8:nocas的集群和持久化(具体部署请查阅官网)
0:学习SpringCloudAlibaba(2023.x分支)
SpringCloud Alibaba是基于SpringCloud的一个微服务框架,它提供了对分布式服务的完整支持,包括服务注册与发现、配置中心、服务熔断保护、分布式事务处理等。SpringCloud Alibaba的目标是让分布式服务更加易用,减少开发人员的工作量。
1:springcloud官网的Eurake、Feign、Hystrix、Zuul、Config、Bus都已经停止了更新,进入维护阶段。导致后劲乏力
2:国产的SpringCloudAlibaba,兼容性能强,组件少,一个组件能代替springcloud的好几个组件,减少学习成本
3:国产的SpringCloudAlibaba在阿里中,能够应对双十一的压力,证明产品可靠性高
4:国产的SpringCloudAlibaba,学习使用更加简单方便,易于学习,页面管理也很方便。
springCloud阿里巴巴2023.0.1.0 官网地址https://sca.aliyun.com/en/
适配jdk17 、Spring Boot 3.2.*、Spring Cloud 2023.x及更高版本springboot3.2.*
本章节我们基于最新版的2023.0.1.0版本来学习
1:安装Nacos(2.3.2)
下载:官网Releases · alibaba/nacos · GitHub下载版本2.3.3
解压:解压到自己的文件夹下边
运行:Linux/Unix/Mac,启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
查看:http://localhost:8848/nacos/#/login 账户密码都是nocas
nacos支持CP和AP模式,但是默认是AP模式,也就是高可用模式。
2:什么是Nacos
官网快速开始:Nacos 快速开始 | Nacos 官网
Nacos主要功能就是服务发现和配置管理
2.1:什么是Nacos
nocas是SpringCloudAlibaba的一个组件,主要用来实现服务注册,服务发现,动态配置管理服务发现是微服务体系结构中的关键组件之一。
在这样的体系结构中,为每个客户端手动配置服务列表可能是艰巨的任务,并且使动态扩展极为困难。Nacos Discovery帮助您自动将服务注册到Nacos服务器,并且Nacos服务器会跟踪服务并动态刷新服务列表。此外,Nacos Discovery注册服务实例的一些元数据,例如主机,端口,运行状况检查URL,Nacos主页。
nocas=Eurake(服务注册服务发现)+config(配置文件统一管理,但不能统一推送)+Bus(消息队列实现配置文件统一推送)
2.2:案例架构
在案例中8081,8082,8080向nocas注册服务,然后8081、8082作为相同的服务集群,给8003调用
给8080调用负载均衡调用8081和8082,得到服务器的端口号
4:服务提供者81、82使用案例
父类项目pom配置
<!--父工程 springboot 2.1.3--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> </parent> <!--统一jar的版本管理--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version> </properties> <!--父工程管理子项目 子项目不用指定版本号 子项目需要引入具体的需求包--> <dependencyManagement> <dependencies> <!--springcloud 包Greenwich--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--springcloud阿里巴巴包 采用2.1--> <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> </dependencies> </dependencyManagement> </project>4.1:提供者8081和8082的pom
<properties> <java.version>17</java.version> <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version> </properties> <!-- nacos服务注册发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <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> </dependencies> </dependencyManagement>4.2: 提供者8081和8082的pom的controller
该controller只提供一个返回端口的方法,没有业务逻辑,专注与架构
@Value("${server.port}") String port; @GetMapping(value = "/pay/port") public String nacos_port() { System.out.println("Nacos的端口:"+port); return "端口号:"+port; }4.3: 提供者8081和8082的properties
server: port: 8081 #端口号8081和8082 spring: application: name: PayService datasource: url: jdbc:mysql://localhost:3306/SpringCloud2024?useUnicode=true&characterEncoding=utf-8&useSSL=false driver-class-name: com.mysql.cj.jdbc.Driver username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 5 minIdle: 10 #最小 max-active: 20 #最大存活连接 max-wait: 6000 #等待超时时间 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #nacos的地址4.4: 提供者8081和8082的main方法
@SpringBootApplication @EnableDiscoveryClient //nacos的服务发现注解 public class SpringCloud_Alibaba_Pay8081 { public static void main(String[] args) { SpringApplication.run(SpringCloud_Alibaba_Pay8081.class, args); } }4.5:启动查看
5:消费者8080使用案例
5.1:消费者8080的pom
<!-- 1:springCloud阿里巴巴2023.0.1.0 官网https://sca.aliyun.com/en/ 适用于Spring Boot 3.2 --> <properties> <java.version>17</java.version> <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version> <spring-cloud.version>2023.0.3</spring-cloud.version> </properties> <!-- nacos服务注册发现 消费者必须引入loadbalancer--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-openfeign-core</artifactId> </dependency> <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>5.2:消费者8080的properties
server: port: 8080 spring: application: name: SpringCloudAlibaba_Consumer1 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #nacos的地址5.3:消费者8080的controller
该controller通过resttemple调用服务,得到端口号
@RestController @RefreshScope //动态刷新获取config,config的注解 public class Controller { /** * 调用nocas上注册的服务 * 采用restTemplate1+robbin的LoadBalanced注解 * @return */ @Resource private RestTemplate restTemplate1; @RequestMapping(value = "/get") public String add (){ String url="http://huyiju-nacosservice/add"; System.out.println("进入调用"); return restTemplate1.getForObject(url,String.class); } } @Configuration public class RestConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }/** * 通过RestTemplate * 订单服务Controller的服务8080 ---> 调用远程的8081、8082的支付服务 */ @RestController public class OrderControllerRestTemplate { //Nacos的注册服务地址 地址是服务的名字 public final String payUrl = "http://PayService/pay/"; @Resource RestTemplate restTemplate; @GetMapping(value = "/consumer/pay/port") public String getPort() { String port = restTemplate.getForEntity(payUrl + "port",String.class).getBody(); return port; } } @Configuration public class RestTemplateConfig { @Bean @LoadBalanced //需要配置负载均衡 public RestTemplate restTemplate() { return new RestTemplateBuilder().build(); } }5.4:消费者8003的mian方法
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients//开启feign客户端注解 //(basePackages = "org.example.cloudapi_commoms.Apis") public class SpringCloudAlibabaConsumer1Application { public static void main(String[] args) { SpringApplication.run(SpringCloudAlibabaConsumer1Application.class, args); } }5.5:启动查看
5.6:调用8080返回不同的端口号,证明8080负载调用了8001和8002
6:动态配置使用
我们使用8080来获取nocas的动态配置
6.1:8080的导入配置包
<!-- nacos服务配置管理 依赖jar--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--开启Spring Cloud 应用程序启动时加载bootstrap配置文件--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>6.2:8080的properties
spring: application: name: SpringCloudAlibaba-Consumer1 cloud: nacos: discovery: #服务注册 server-addr: 127.0.0.1:8848 #nacos的服务注册地址 config: #配置中心 server-addr: 127.0.0.1:8848 #nacos的配置中心地址 file-extension: yaml #文件后缀 prefix: SpringCloudAlibaba-Consumer1 profiles: #默认文件名字是 SpringCloudAlibaba-Consumer1-test.yml active: test #这个是指定配置中心的上生效文件的 -test6.3:nacos服务器新建配置
6.4:8080controller方法
/** * nacos的动态配置管理测试 */ @RestController @RefreshScope //动态刷新 修改了立马可知 public class OrderControllerConfig { //配置管理,可以修改配置文件测试 @Value("${config.info}") private String config_info; @GetMapping(value = "/feign/pay/info") public String getInfo() { System.out.println("动态配置管理"); return "返回值:"+config_info; } }在测试的过程中,即使nacos挂了,消费者也能够调用服务提供者,因为消费者本地会从nacos注册中心中下载一份服务列表到本机,所以即使nacos挂了,也能调用。但是这是不能注册新的服务了。这就是注册表缓存。
6.5:命名空间、分组隔离
新建命名空间:
新建yaml:
修改配置:
spring: application: name: SpringCloudAlibaba-Consumer1 cloud: nacos: discovery: #服务注册 server-addr: 127.0.0.1:8848 #nacos的服务注册地址 config: #配置中心 server-addr: 127.0.0.1:8848 #nacos的配置中心地址 file-extension: yaml #文件后缀 prefix: SpringCloudAlibaba-Consumer1 group: dev_group #分组id namespace: c25e3f5d-f945-4617-9b9c-9070fd2b3ba9 #新建命名空间nacos生成id profiles: #默认文件名字是 SpringCloudAlibaba_Consumer1-test.yml active: dev #这个是指定配置中心的上生效文件的 -test7:Nacos的cap问题(支持AP和CP的切换)
7.1:AP模式
- Nacos AP 模式基于Distro 协议,去中心化、无 Leader
- 服务注册:客户端连任意节点 → 写内存 → 立即成功 → 异步同步(有的集群节点还没有注册上服务)
- 服务发现:客户端拉取列表连接任意一个集群节点获取服务列表 → 本地缓存服务列表 → 定时更新(一般3秒)
- 服务调用:本地负载均衡直连实例,不经过 Nacos
- 核心保证:A 可用性 + P 分区容错,数据最终一致
- 适合 99% 微服务场景:互联网、电商、中台、企业应用
7.2:CP模式
NacosCP 模式基于Raft 一致性算法实现,核心是:强一致、有 Leader、写必须过半确认、牺牲部分可用性换一致性。
Nacos的AP和CP模式切换
C:是所有节点在同一时间看到的数据是一致,数据一致行
A:是所有请求都会收到响应,Nocas高可用性
何时选用哪种模式?
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring Cloud 和 Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8S服务和DNS服务则适用于CP模式。CP模式下支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
curl -X PUT `$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
8:nocas的集群和持久化(具体部署请查阅官网)
官方推荐nocas在生产环境尽量使用集群,3台以上的nocas服务中心,一个mysql数据库用来维持数据一致性。一个niginx代理3台nocas服务,只需访问nignx地址进入nocas服务页面
