服务提供者 Eureka + 服务消费者(Rest + Ribbon)实战

news/2024/4/26 6:41:50/文章来源:https://blog.csdn.net/wangyongfei5000/article/details/130345795

1、Ribbon背景介绍

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单来说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

现在的很多RPC框架,向Duobbo、JSF都是采用类似思想进行实现的。

2、常见负载均衡方案

目前主流的负载均衡方案可分成两类。

2.1 集中式负载均衡

一种是集中式LB, 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx, 由该设施负责把访问请求通过某种策略转发至服务的提供方。

 

2.2 进程式负载均衡

另一种是进程内LB,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于后者,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

 

3、Ribbon的核心组件

 

Ribbon 主要有6大功能组件:LoadBalance、ServerList、Rule、Ping、ServerListFilter、ServerListUpdater。

3.1 负载均衡器 LoadBalancer

用于管理负载均衡的组件。初始化的时候通过加载 YMAL 配置文件创建出来的。

3.2 服务列表 ServerList

ServerList 主要用来获取所有服务的地址信息,并保存到本地。根据获取服务信息的方式不同,又分为静态存储和动态存储。

※静态存储

 从配置文件中获取服务节点列表并存储到本地。

※动态存储

从注册中心获取服务节点列表并存储到本地。

3.3 服务列表过滤 ServerListFilter

将获取到的服务列表按照过滤规则过滤。通过 Eureka 的分区规则对服务实例进行过滤。

比较服务实例的通信失败数和并发连接数来剔除不够健康的实例,根据所属区域过滤出同区域的服务实例。

3.4 服务列表更新 ServerListUpdater

服务列表更新就是 Ribbon 会从注册中心获取最新的注册表信息。是由这个接口 ServerListUpdater 定义的更新操作。而它有两个实现类,也就是有两种更新方式:

1) 通过定时任务进行更新。由这个实现类 PollingServerListUpdater 做到的。

2)利用 Eureka 的事件监听器来更新。由这个实现类 EurekaNotificationServerListUpdater 做到的。

3.5 心跳检测 Ping

IPing 接口类用来检测哪些服务可用。如果不可用了,就剔除这些服务。实现类主要有这几个:PingUrl、PingConstant、NoOpPing、DummyPing、NIWSDiscoveryPing。心跳检测策略对象 IPingStrategy,默认实现是轮询检测。

3.6 负载均衡策略 Rule

Ribbon 的负载均衡策略和之前讲过的负载均衡策略有部分相同,见第4节,看下Ribbon有哪些负载均衡策略。

4、Ribbon提供的主要负载均衡策略介绍

 

 

4.1 简单轮询负载均衡(RoundRobin)

以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。轮流依次请求不同的服务器。优点是无需记录当前所有连接的状态,无状态调度;

4.2 随机负载均衡 (Random)

随机选择状态为UP的Server。随机选择服务器。适合并发比较大的场景。

4.3 加权响应时间负载均衡 (WeightedResponseTime)

每个服务按响应时长自动分配权重,响应时间越长,权重越低,被选中的概率越低;

4.4 区域感知轮询负载均衡(ZoneAvoidanceRule)

更倾向于选择发出调用的服务所在的托管区域内的服务,降低延迟,节省成本。Spring Cloud Ribbon 中默认的策略;区域感知负载均衡(ZoneAvoidanceRule):更倾向于选择发出调用的服务所在的托管区域内的服务,降低延迟,节省成本。Spring Cloud Ribbon 中默认的策略;

4.5 重试负载均衡(RetryRule)

通过轮询均衡策略选择一个服务器,如果请求失败或响应超时,可以选择重试当前服务节点,也可以选择其他节点;

4.6 高可用均衡(BestAvailableRule)

忽略请求失败的服务器,尽量找并发比较低的服务器。注意:这种会给服务器集群带来成倍的压力;

5、Spring Cloud Ribbon是什么

既然有了Ribbon, 怎么又出来一个Spring Cloud Ribbon呢?

Spring Cloud是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。

通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,无需单独部署。

6、准备工作

 

6.1 创建3个服务

本次项目示例,改造第一篇文章中的项目,使用spring-cloud-eureka-service作为服务注册中心,spring-cloud-eureka-client,复制3分,项目名称依次修改:

spring-cloud-eureka-client-1;

spring-cloud-eureka-client-2;

spring-cloud-eureka-client-3;

分别添加各自依赖,

 <dependency>

        <groupId>org.springframework.cloud</groupId>

        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

</dependency>

 

6.2 添加启动类和Controller

在3个项目中:分别添加各自启动类和Controller类,并使用ribbon做均衡需要测试需要使用到。

代码示例(spring-cloud-eureka-client-1 为例),

//启动类package com.xintu.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication@EnableEurekaClient//代表自己是一个服务提供方public class SpringCloudEurekaClient1App { //其他两个类名为:SpringCloudEurekaClient2App 、SpringCloudEurekaClient3Apppublic static void main(String[] args) {SpringApplication.run(SpringCloudEurekaClient1App.class, args);}}
// controllerpackage com.xintu.springcloud.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/xintu")public class HelloWorldController {@RequestMapping("/hello")public String helloWorld(String s){System.out.println("传入的值为:"+s);return "传入的值为-1:"+s; //其他两个改为传入的值为-2,传入的值为-3}}

6.3 修改YML配置文件

在3个项目中,分别添加yml并修改server: port:端口依次为8711,8712,8713

#指定应用名称spring:application:name: eureka-serviceserver:port: 8711 # 服务提供方# 指定当前eureka客户端的注册地址,eureka:instance:hostname: localhostclient:service-url:defaultZone: http://${eureka.instance.hostname}:8700/eureka

7、添加Ribbon消费者

7.1 添加依赖

新建 module, 命名为springcloud-ribbon-consumer,

 

在pom文件中,添加如下依赖,

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency><dependency><groupId>com.xintu.springcloud</groupId><artifactId>springcloud-common</artifactId> //这个为7.2节的module<version>0.0.1-SNAPSHOT</version>
</dependency>

7.2 添加公共负载平衡module(提高模块的代理复用性)

新建module, 命名为springcloud-common。

package com.xintu.springcloud.configuration;import com.netflix.loadbalancer.BestAvailableRule;import com.netflix.loadbalancer.IRule;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.client.ClientHttpRequestFactory;import org.springframework.http.client.SimpleClientHttpRequestFactory;import org.springframework.web.client.RestTemplate;/*** 配置负载均衡模板*/@Configurationpublic class RestTemplateConfiguration {/*** 公共负载均衡* @return*/@LoadBalanced //b表示开启负载均衡@Beanpublic RestTemplate restTemplate(){return new RestTemplate(simpleClientHttpRequestFactory());}/*** 自定义配置ribbon负载均衡算法* @return*/@Beanpublic IRule myRule(){//return new RoundRobinRule();//轮询//return new RetryRule();//重试return new BestAvailableRule();}@Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory() {SimpleClientHttpRequestFactory factory= new SimpleClientHttpRequestFactory();//设置超时时间factory.setReadTimeout(5000);//msfactory.setConnectTimeout(15000);//msreturn factory;}}

7.3 创建启动类和controller类

// 启动类package com.xintu.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** @author XinTu* @classname SpringCloudRibbonConsumerApp* @description TODO* @date 2023年03月25日 14:30*/@SpringBootApplication@EnableDiscoveryClient //向服务注册中心注册public class SpringCloudRibbonConsumerApp {public static void main(String[] args) {SpringApplication.run(SpringCloudRibbonConsumerApp.class, args);}}
// controller类package com.xintu.springcloud.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;@RestController@RequestMapping("/xintu")public class RibbonConsumerController {@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/hello")public String helloWorld(){return restTemplate.getForEntity("http://eureka-service/xintu/hello?s=123", String.class).getBody(); //eureka-service 这个为前面三个服务名,无需加ip和端口}}

7.4 添加YML配置完整配置 application.yml如下,

#指定应用名称spring:application:name: ribbon-consumerserver:port: 8866 # 消费方端口# 指定当前eureka客户端的注册地址,eureka:instance:hostname: localhostclient:service-url:defaultZone: http://${eureka.instance.hostname}:8700/eureka

7.5 测试服务

项目启动顺序:

1、springcloud-config-server

2、spring-cloud-eureka-client-1

3、spring-cloud-eureka-client-2

4、spring-cloud-eureka-client-3

5、springcloud-ribbon-consumer

启动该工程后,先访问服务注册中心,查看服务是否都已注册成功:

 

确认没问题后,开始验证,http://localhost:8866/xintu/hello。可以在浏览器频繁刷新这个地址,会发先返回内容有所不同。说明负载均衡是生效的。

 

 

8、各种负载均衡对比

Nginx与Ribbon负载均衡的区别

8.1 服务器端负载均衡Nginx

nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡请求转发,属于服务器端负载均衡。

既请求有nginx服务器端进行转发。

8.3 客户端负载均衡Ribbon

Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地,让后在本地实现轮训负载均衡策略。

既在客户端实现负载均衡。

应用场景的区别:

Nginx适合于服务器端实现负载均衡 比如Tomcat ,Ribbon适合与在微服务中RPC远程调用实现本地服务负载均衡,比如Dubbo、SpringCloud中都是采用本地负载均衡。

以上! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102855.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【手把手做ROS2机器人系统开发二】熟悉ROS2基本命令

【手把手做ROS2机器人系统开发二】熟悉ROS2基本命令 一、上讲回顾 在上一讲开发环境搭建中&#xff0c;我们讲解了如何搭建Ubuntu系统环境和ROS2开发运行环境。 1.Ubuntu系统安装 2.ROS2系统环境安装 二、ROS2核心命令讲解 1、daemon-各种守护进程相关的子命令 查看帮助&am…

【计算机网络】网络命令的使用

文章目录 一、实验目的二、实验工具三、实验要求四、实验过程01 ping 命令的使用应用1&#xff1a;验证本地计算机上是否正确安装了 TCP/IP 协议应用2&#xff1a;测试某个目的主机可达性应用3&#xff1a;键入 ping&#xff0c;查看 ping 的其他参数含义 02 netstat 命令的典型…

可能是最强的Python可视化神器,建议一试

数据分析离不开数据可视化&#xff0c;我们最常用的就是Pandas&#xff0c;Matplotlib&#xff0c;Pyecharts当然还有Tableau&#xff0c;看到一篇文章介绍Plotly制图后我也跃跃欲试&#xff0c;查看了相关资料开始尝试用它制图。 Plotly Plotly是一款用来做数据分析和可视化的…

关于GeoServer发布的wfs服务的精度问题

本周基于arcgis/core组件&#xff0c;利用arcgis api for js 4.22版本加载GeoServer发布的同一数据源的wms和wfs服务&#xff0c;出现了偏移的问题。 分析&#xff1a;同一数据源不同的访问方式&#xff0c;出现了偏移&#xff0c;这是很严重的问题。初步判断为js api加载方式的…

HTB-SecNotes

HTB-SecNotes 信息收集8808端口80端口通过CSRF获取通过二次注入 立足tyler -> administrator 信息收集 8808端口 Windows IIS 10.0 可以从官方文档查看10.0版本可能的操作系统。 80端口 通过CSRF获取 目录扫描发现需要登陆后继续进一步操作啊。 对其进行简单的SQL注入测…

Ubuntu20.04安装CUDA和CUDNN

CUDA是GPU深度学习的运行库&#xff0c;那么cuDNN就是训练加速工具&#xff0c;两者要相互配合使用&#xff0c;所以一般机器学习需要训练引擎(tensorflow-gpu) CUDA cuDNN使用。想不安装cuDNN是不可以的&#xff0c;而且cuDNN版本要和CUDA版本相互搭配。 1、前置工作 查看…

MinIO快速入门

一、MinIO概述 官网地址&#xff1a;http://www.minio.org.cn/ 文档地址&#xff1a;http://docs.minio.org.cn/docs/ MinIO是一款基于Apache License v2.0开源协议的分布式文件系统&#xff08;或者叫对象存储服务&#xff09;&#xff0c;可以做为云存储的解决方案用来保存海…

uniapp + vue3开发中组合式函数必须是一个同步函数

目录 vue3中的组合式函数用法&#xff1a; 官网示例异步组合式函数&#xff1a;同步函数写法 改造成导出async组合式函数时&#xff1a; uniapp无法使用async组合式函数的原因&#xff1a; vue3中的组合式函数使用时&#xff0c;导出的组合式函数必须是一个同步函数。 vue3…

推荐一个开源的区块链开发者工具网站

开源区块链开发者工具箱 https://ChainTool.tech 今天可以正式上线了。ChainTool 使用完全开源的方式编写一些开发者日常经常使用的工具。 关于 ChainToolDAO 大约在两个月前&#xff0c; ChainToolDAO 成立了&#xff0c;成立 ChainToolDAO 的来由是这样的&#xff1a;我是一…

【14】SCI易中期刊推荐——计算机 | 人工智能(中科院2区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

QMS-云质说质量 - 10 我和我的客户投诉(2) - 客户逐利 驱除良币

云质QMS原创 转载请注明来源 作者&#xff1a;王洪石 上策伐谋 中策伐交 前面发过一篇关于客户投诉的文章“逢年过节要祈祷”&#xff0c;引起了很多质量人的共鸣&#xff0c;特别是汽车零部件行业曾经和正在负责客诉的质量同行们。 真实的产品质量问题&#xff0c;是否发生只…

【GoodERP专题】第一章 GoodERP应用专题之good_expense 费用报销 的使用

文章目录 一、模块设计二、模块1.主数据2.费用申请单3.借款单【付款】4.费用报销单【挂账/付款】5.出差申请单6.出差借款单【付款】7.差旅费报销单【挂账/付款】 总结 一、模块设计 费用报销模块是基于GoodERP框架设计的&#xff0c;该模块是为了解决企业内外费用相关报销任务处…

idea 2023版本创建maven管理的Scala项目教程

目录 1、创建项目1.1、创建项目名及简单配置1、2 刚开始创建好后的项目是这样的1、3 进行相关设置1&#xff09;增加maven管理2&#xff09;增加scala目录&#xff0c;并设置成resource目录 注意&#xff1a; 本项目写得教程是基于您得Java jdk、Scala jdk、maven这些都是安装配…

我们都被 ChatGPT 给骗了?

引言&#xff1a; 用过 ChatGPT 的人都知道&#xff0c;当你与 chatgpt 对话的时候&#xff0c;它是“逐字输出”的&#xff0c;就像真的有个人在跟你打字一样。其实&#xff0c;这种技术并没有那么神奇&#xff0c;这种技术叫做“实时文本生成”或“逐字输出”技术&#xff0…

软件测试好学习吗?

软件测试好不好学习其实各自的认知都不同&#xff0c;想要知道自己能不能学会&#xff0c;对于自己怎么样&#xff0c;最简单的方法就是找个基础教程先去学习一下了~ 其实软件测试这个行业与其他岗位相比&#xff0c;对零基础的学习者更加友好。即使你不懂互联网&#xff0c;不…

蔡春久:主数据标准化如何建设

亿信华辰「2023数字赋能季」主数据管理专场第一期成功举办。我们邀请到了中国数据标准化及治理专家蔡春久为大家带来主数据管理从理论到工具层面的分享&#xff0c;全程干货&#xff0c;深度解读&#xff0c;以下是演讲全文。 蔡春久&#xff1a;中国大数据技术标准推进委员会…

这些美国名校的AI人工智能大牛,你知道几个?

CS专业被US News评为就业TOP 100职业第一名、STEM职业第一名、技术类职业第一名。 AI人工智能&#xff0c;随着GPT的横空出世已成为最热门的CS专业。“深度学习”和“神经网络”等是新一代人工智能的重要代表&#xff0c;如今在面部识别、语音输入、基因医疗等重要领域被广泛应…

轻量级服务器nginx:配置虚拟主机的两种方式

虚拟主机是指&#xff0c;在一台服务器中&#xff0c;通过nginx的代理&#xff0c;我们可以访问多个网站。区分不同的网站&#xff0c;可以通过端口、域名两种方式 这里写目录标题 一 端口不同区分不同的虚拟主机二 通过域名区分不同的主机名1.配置域名映射2.显示登录效果 一 …

如何写好学位论文

昨天刚提交了学位论文&#xff0c;今天准备来总结一下一些常用的Word写作技巧。 样式与多级列表 论文一般都会对章节条目的标题、参考文献、表格内容、题注的字体字号、行间距、段落间距等作出规定。为每一类文字设置一种样式&#xff0c;在写的时候直接应用样式可以方便地对全…

访问者模式解读

目录 问题引进 访问者模式基本介绍 基本介绍 访问者模式的原理类图 对原理类图的说明 访问者模式应用实例 思路分析和图解(类图) 代码实战 应用案例的小结 访问者模式的注意事项和细节 优点 问题引进 测评系统的需求 1) 将观众分为男人和女人&#xff0c;对歌手进行…