当前位置: 首页 > news >正文

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 #这个是指定配置中心的上生效文件的 -test

6.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 #这个是指定配置中心的上生效文件的 -test

7: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服务页面

​​

http://www.jsqmd.com/news/475429/

相关文章:

  • RAG动态切片策略与重叠机制
  • 什么是 Java 中的指令重排?
  • psd文件解析
  • java毕业设计——基于JSP+sqlserver的房产中介系统设计与实现(毕业论文+程序源码)——房产中介系统
  • 01 「梅花七月香」嵌入式 Linux 应用秋招经验分享 - 个人背景与学习经历
  • java毕业设计——基于JSP+sqlserver的房屋租赁管理系统设计与实现(毕业论文+程序源码)——房屋租赁管理系统
  • Flutter 三方库 connectme 鸿蒙适配指南 - 实现高性能全双工 WebSocket 通讯、在 OpenHarmony 上打造极低时延实时防线实战
  • Management By Objectives (MBO) - 目标管理
  • 教师必备!告别手忙脚乱,这些软件一键批量发成绩
  • Flutter 三方库 flutter_data_generator 鸿蒙适配指南 - 实现自动化测试数据生产、在 OpenHarmony 上打造极致高效的研发脚手架实战
  • java毕业设计——基于JSP+sqlserver的高校学生考勤管理系统设计与实现(毕业论文+程序源码)——考勤管理系统
  • 第十章 微积分:贯穿多领域的统一思维与落地价值
  • 车流量计数、不同车型统计算法
  • SimpleBar终极指南:5分钟学会自定义滚动条设计
  • 吃透数据库范式!从 1NF 到 BCNF,零基础也能秒懂的核心笔记
  • Ground Rules
  • Synergy服务端显示异常解决办法
  • JVM学习笔记(2) 第一部分 走近java 第1章 走近java
  • PowerLine
  • gRPC协议在TOMs中的应用:跨平台服务通信的高性能实现
  • java毕业设计——基于JSP+sqlserver的高校智能排课系统设计与实现(毕业论文+程序源码)——高校智能排课系统
  • java毕业设计——基于JSP+sqlserver的公司办公信息管理系统设计与实现(毕业论文+程序源码)——办公信息管理系统
  • Visual Studio 2015 - Start Without Debugging 快捷图标
  • pdfminer.six扩展开发:如何自定义布局分析规则
  • 推荐一款开源利器:Linux Router
  • java毕业设计——基于JSP+sqlserver的环境美容服务公司网站设计与实现(毕业论文+程序源码)——公司网站
  • 掌握Linux路由器:一键设置的强大工具Linux-router
  • Visual Studio 2015 - _CRT_SECURE_NO_WARNINGS
  • U8g2常见问题解答:解决OLED/LCD显示开发中的痛点难题
  • Visual Studio 2015 - Compile as C Code / C++ Code