SptingCloud版协作流程 | 学习笔记

简介: 快速学习SptingCloud版协作流程。

开发者学堂课程【Spring Cloud Alibaba Nacos 详解(下)SptingCloud版协作流程】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/725/detail/12933


Spring Cloud 服务协作流程 

 

内容介绍:

一、Spring Cloud 服务协作流程

二、总结

 

通过一些原生的 Spring Cloud 注解,可以快速来实现 Spring Cloud 微服务的服务发现机制,并使用 Nacos Server 作为服务发现中心,统一管理所有微服务。

 

一、Spring Cloud 服务协作流程

Spring Cloud 常见的集成方式是使用 Feign+Ribbon 技术来完成服务间远程调用及负载均衡的,

如下图:

图片.png

 

在微服务启动时,会向服务发现中心上报自身实例信息,这里 Service B 包含多个实例。      

每个实例包括:

IP 地址、端口号信息。

微服务会定期从 Nacos Server (服务发现中心)获取服务实例列表。

Service A 调用Service B 时,ribbon 组件从本地服务实例列表中查找Service B 的实例,如获取了多个实例如 Instance1Instance2。这时 ribbon 会通过用户所配置的负载均衡策略从中选择一个实例。

最终,Feign 组件会通过ribbon 选取的实例发送 http 请求。

采用 Feign+Ribbon 的整合方式,是由Feign 完成远程调用的整个流程。

Feign 集成了RibbonFeign 使用 Ribbon完成调用实例的负载均衡。

1、负载均衡的概念

Spring Cloud 服务协议流程中,Service A 通过负载均衡调用 Service B,下边来了解一下负载均衡:

负载均衡就是将用户请求(流量)通过一定的策略,分摊在多个服务实例上执行,它是系统处理高并发、缓解网络压力和进行服务端扩容的重要手段之一。它分为服务端负载均衡和客户端负载均衡。

服务器端负载均衡:

 

图片.png

 

在负载均衡器中维护一个可用的服务实例清单,当客户端请求来临时,负载均衡服务器按照某种配置好的规则(负载均衡算法)从可用服务实例清单中选取其一去处理客户端的请求,这就是服务端负载均衡。

例如 Nginx,通过 Nginx 进行负载均衡,客户端发送请求至 NginxNginx 通过负载均衡算法,在多个服务器之间选择一个进行访问。即在服务器端再进行负载均衡算法分配。

客户端服务负载均衡:

图片.png

 

Ribbon 就属于客户端负载均衡。在 ribbon 客户端会有一个服务实例地址列表,在发送请求前通过负载均衡算法选择一个服务实例,然后进行访问,这是客户端负载均衡。即在客户端就进行负载均衡算法分配。

Ribbon 是客户端负载均衡器,它的责任是从一组实例列表中挑选合适的实例,如何挑选取决于负载均衡策略。

Ribbon 核心组件 IRule 是负载均衡策略接口,它有如下实现,仅做了解:

·RoundRobinRule (默认):轮询,即按一定的顺序轮换获取实例的地址。

·RandomRule:随机,即以随机的方式获取实例的地址。

·AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;

·WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越大,被选中的机率越高;

刚启动时,如果统计信息不足,则使用 RoundRobinRule策略,等统计信息足够时,会切换到 WeightedResponseTimeRule

·RetryRule:先按照RoundRobinRule 的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用的服务;

·BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;

·ZoneAvoidanceRule:默认规则,复合判断 server 所在区域的性能和 server 的可用性选择服务器;

可通过下面方式在 spring boot 配置文件中修改默认的负载均衡策略:

account-service 是调用的服务的名称,后面的组成部分是固定的。

2、Feign 介绍

Feign Netflix 开发的声明式、模板化的 HTTP 客户端,Feign 可以帮助我们更快捷、优雅地调用 HTTP APIFeign 的英文表意为“假装,伪装,变形”,可以理解为将 HTTP 报文请求方式伪装为简单的 java 接口调用方式。

参考第1章节的 Service A 调用 Service B 的例子,我们使用

Feign 实现这个过程,代码如下:

Service B 暴露“/service”服务端点

Feign 调用方式如下:

1)声明 Feign 客户端

2)业务调用

在业务调用时,减少了与业务无关的 http 请求相关代码的编写,使业务逻辑清晰。

分析 Feign 的优势:

·在声明 Feign 客户端之后,Feign 会根据 @FeignClient 注解使用 java 的动态代理技术生成代理类,在这里指定@FeignClient value service B,则说明这个类的远程目标为spring cloud 的服务名称为service B 的微服务。

·service B 的具体访问地址,Feign 会交由 ribbon 获取,若该服务有多个实例地址,ribbon 会采用指定的负载均衡策略选取实例。

·Feign 兼容 spring web 注解(如:@GetMapping),它会分析声明 Feign 客户端方法中的 Spring 注解,得出 Http 请求 method、参数信息以及返回信息结构。

·当业务调用 Feign 客户端方法时,会调用代理类,根据以上分析结果,由代理类完成实际的参数封装、远程 http 请求,返回结果封装等操作。

另外,若在 Spring cloud 中使用Feign,需要引入以下依赖

Feign 默认集成了 Ribbon,可以直接使用。

还需要在 spring cloud 启动类中标注 @EnableFeignClients,表明此项目开启 Feign 客户端。

 

二、总结

通过上面的学习,我们已经了解 Spring cloud 的微服务是如何协作的,通过哪些组件的配合能够完成服务间协作,我们了解了什么是负载均衡,Feign 用于服务间Http 调用,Ribbon 用于执行负载均衡算法选取访问实例,而 Ribbon 的实例列表来源是由 Spring cloud 的服务发现中心提供(当前实现为 Nacos)

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
机器学习/深度学习 存储 算法
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
332 0
|
JavaScript 前端开发
教你用vue2实现一个tabbar(2024年11月教程)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。自学前端2年半,正向全栈进发。博客分享技术心得,助你成长。关注我,获取更多优质内容,你的支持是我前进的动力!🎉🎉🎉
175 0
教你用vue2实现一个tabbar(2024年11月教程)
|
9月前
|
前端开发 JavaScript API
体育赛事即时比分 分析页面的开发技术架构与实现细节
本文基于“体育即时比分系统”开发经验总结,分享技术实现细节。系统通过后端(ThinkPHP)、前端(Vue.js)、移动端(Android/iOS)协同工作,解决实时比分更新、赔率同步及赛事分析展示等问题。前端采用 Vue.js 结合 WebSocket 实现数据推送,提升用户体验;后端提供 API 支持比赛数据调用;移动端分别使用 Java 和 Objective-C 实现跨平台功能。代码示例涵盖比赛分析页面、API 接口及移动端数据加载逻辑,为同类项目开发提供参考。
|
网络协议 测试技术 Apache
测试Netty高并发工具
测试Netty高并发工具
526 3
|
数据采集 机器学习/深度学习
港大发布智能交通大模型全家桶OpenCity!打破时空零样本预测壁垒,训练速度最多提升50倍
【10月更文挑战第15天】香港大学近日发布了智能交通大模型OpenCity,旨在通过创新技术手段解决城市交通预测和管理难题。OpenCity结合了Transformer和图神经网络(GNN)的优势,能够有效捕捉复杂时空依赖关系,实现零样本预测。该模型采用大规模异构交通数据集预训练,显著提升了泛化能力和训练速度,实验结果显示其在未见过的城市或区域的交通预测中表现出色。然而,模型的计算资源需求和数据质量仍需进一步优化。
239 1
|
编译器 Shell C++
在编译的两个.o文件中有对同一个头文件的引用,因此在链接时出现结构体重复定义的问题怎么解决
在编译的两个.o文件中有对同一个头文件的引用,因此在链接时出现结构体重复定义的问题怎么解决
436 2
|
机器学习/深度学习 传感器 算法
【MOSMA】基于粘菌算法求解多目标优化问题附matlab代码
【MOSMA】基于粘菌算法求解多目标优化问题附matlab代码
|
前端开发 JavaScript Java
Apifox:满足你对 Api 的所有幻想
Apifox:满足你对 Api 的所有幻想
|
SQL Go 数据库
TiDB Dumpling:高效数据导出解决方案
【2月更文挑战第28天】TiDB Dumpling作为TiDB生态系统中的一款逻辑备份工具,以其高效、易用和灵活的特性,在数据库数据导出领域崭露头角。本文将对TiDB Dumpling进行详细介绍,包括其原理、架构、适用场景、使用方式及与其他工具的对比,旨在帮助读者更好地理解和应用这一工具,实现高效的数据导出。
|
缓存 自然语言处理 JavaScript
Vue 3 渲染机制解密:从模板到页面的魔法
Vue 3 渲染机制解密:从模板到页面的魔法
641 0