Spring Cloud之负载均衡与服务调用(Ribbon)

目录

Ribbon

简介

负载均衡

简介

负载均衡方式

服务端负载均衡

工作原理

特点

客户端负载均衡

工作原理

特点

对比

实现

负载均衡策略

切换负载均衡策略

定制负载均衡策略

超时与重试

单个服务配置

全局配置

服务调用

示例


Ribbon

简介

        Ribbon 是 Netflix 公司发布的开源组件,其主要功能是提供客户端的负载均衡算法和服务调用;通过它,我们可以将面向服务的 REST 模板请求转换为客户端负载均衡的服务调用。微服务之间的调用,API 网关的请求转发等内容,实际上都是通过 Ribbon 来实现的。

负载均衡

简介

        在任何一个系统中,负载均衡都是一个十分重要且不得不去实施的内容,它是系统处理高并发、缓解网络压力和服务端扩容的重要手段之一。

        负载均衡,简单点说就是将用户的请求平摊分配到多个服务器上运行,以达到扩展服务器带宽、增强数据处理能力、增加吞吐量、提高网络的可用性和灵活性的目的。

负载均衡方式

常见的负载均衡方式有两种:服务端负载均衡、客户端负载均衡

服务端负载均衡
工作原理

        服务端负载均衡是在客户端和服务端之间建立一个独立的负载均衡服务器,该服务器既可以是硬件设备(例如 F5),也可以是软件(例如 Nginx)。这个负载均衡服务器维护了一份可用服务端清单,然后通过心跳机制来删除故障的服务端节点,以保证清单中的所有服务节点都是可以正常访问的。

        当客户端发送请求时,该请求不会直接发送到服务端进行处理,而是全部交给负载均衡服务器,由负载均衡服务器按照某种算法(例如轮询、随机等),从其维护的可用服务清单中选择一个服务端,然后进行转发。

特点

        1.需要建立一个独立的负载均衡服务器

        2.负载均衡是在客户端发送请求后进行的,因此客户端并不知道到底是哪个服务端提供的服务

        3.可用服务端清单存储在负载均衡服务器上

客户端负载均衡

相较于服务端负载均衡,客户端服务在均衡则是一个比较小众的概念

工作原理

        客户端负载均衡是将负载均衡逻辑以代码的形式封装到客户端上,即负载均衡器位于客户端。客户端通过服务注册中心(例如 Eureka Server)获取到一份服务端提供的可用服务清单。有了服务清单后,负载均衡器会在客户端发送请求前通过负载均衡算法选择一个服务端实例再进行访问,以达到负载均衡的目的;

        客户端负载均衡也需要心跳机制去维护服务端清单的有效性,这个过程需要配合服务注册中心一起完成 

特点

        1.负载均衡器位于客户端,不需要单独搭建一个负载均衡服务器

        2.负载均衡是在客户端发送请求前进行的,因此客户端清楚地知道是哪个服务端提供的服务

        3.客户端都维护了一份可用服务清单,而这份清单都是从服务注册中心获取的

        Ribbon 就是一个基于 HTTP 和 TCP 的客户端负载均衡器,当我们将 Ribbon 和 Eureka 一起使用时,Ribbon 会从 Eureka Server(服务注册中心)中获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的

对比

实现

        Ribbon 是一个客户端的负载均衡器,它可以与 Eureka 配合使用轻松地实现客户端的负载均衡。Ribbon 会先从 Eureka Server(服务注册中心)去获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务端,从而达到负载均衡的目的

负载均衡策略
序号实现类负载均衡策略
1RoundRobinRule轮询策略,即按照一定的顺序依次选取服务实例
2RandomRule随机选取一个服务实例
3RetryRule按照轮询的策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试,如果超过指定时间依然没获取到服务实例则返回 null 
4WeightedResponseTimeRule根据平均响应时间,来计算所有服务实例的权重,响应时间越短的服务实例权重越高,被选中的概率越大
5BestAvailableRule先过滤点故障或失效的服务实例,然后再选择并发量最小的服务实例
6AvailabilityFilteringRule先过滤掉故障或失效的服务实例,然后再选择并发量较小的服务实例
7ZoneAvoidanceRule默认的负载均衡策略,综合判断服务所在区域的性能和服务的可用性,来选择服务实例
切换负载均衡策略

Ribbon 默认使用轮询策略选取服务实例,我们也可以根据自身的需求切换负载均衡策略,只需要在服务消费者(客户端)的配置类中,将 IRule 的其他实现类注入到容器中即可

在配置类 ConfigBean 中添加以下代码,将负载均衡策略切换为 RandomRule(随机)

@Bean
public IRule myRule() {// RandomRule 为随机策略return  new RandomRule();
}
定制负载均衡策略

1.创建一个名为 MyRandomRule 的类

package net.biancheng.myrule;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;import java.util.List;/**
* 定制 Ribbon 负载均衡策略
*/
public class MyRandomRule extends AbstractLoadBalancerRule {private int total = 0;            // 总共被调用的次数,目前要求每台被调用5次private int currentIndex = 0;    // 当前提供服务的机器号public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {return null;}Server server = null;while (server == null) {if (Thread.interrupted()) {return null;}//获取所有有效的服务实例列表List<Server> upList = lb.getReachableServers();//获取所有的服务实例的列表List<Server> allList = lb.getAllServers();//如果没有任何的服务实例则返回 nullint serverCount = allList.size();if (serverCount == 0) {return null;}//与随机策略相似,但每个服务实例只有在调用 3 次之后,才会调用其他的服务实例if (total < 3) {server = upList.get(currentIndex);total++;} else {total = 0;currentIndex++;if (currentIndex >= upList.size()) {currentIndex = 0;}}if (server == null) {Thread.yield();continue;}if (server.isAlive()) {return (server);}server = null;Thread.yield();}return server;}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(), key);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {// TODO Auto-generated method stub}
}

2.创建一个名为 MySelfRibbonRuleConfig 的配置类,将我们定制的负载均衡策略实现类注入到容器中

/**
* 定制 Ribbon 负载均衡策略的配置类
* 该自定义 Ribbon 负载均衡策略配置类 不能在 net.biancheng.c 包及其子包下
* 否则所有的 Ribbon 客户端都会采用该策略,无法达到特殊化定制的目的
*/
@Configuration
public class MySelfRibbonRuleConfig {@Beanpublic IRule myRule() {//自定义 Ribbon 负载均衡策略return new MyRandomRule(); //自定义,随机选择某一个微服务,执行五次}
}

3.修改位于启动类,在该类上使用 @RibbonClient 注解让我们定制的负载均衡策略生效

@SpringBootApplication
@EnableEurekaClient
//自定义 Ribbon 负载均衡策略在主启动类上使用 RibbonClient 注解,在该微服务启动时,就能自动去加载我们自定义的 Ribbon 配置类,从而是配置生效
// name 为需要定制负载均衡策略的微服务名称(application name)
// configuration 为定制的负载均衡策略的配置类,
// 且官方文档中明确提出,该配置类不能在 ComponentScan 注解(SpringBootApplication 注解中包含了该注解)下的包或其子包中,即自定义负载均衡配置类不能在 net.biancheng.c 包及其子包下
@RibbonClient(name = "MICROSERVICECLOUDPROVIDERDEPT", configuration = MySelfRibbonRuleConfig.class)
public class MicroServiceCloudConsumerDept80Application {public static void main(String[] args) {SpringApplication.run(MicroServiceCloudConsumerDept80Application.class, args);}
}

超时与重试

        使用HTTP发起请求难免会发生问题,在F版开始Ribbon的重试机制默认是开启的,需要添加对超时时间与重试策略的配置;

单个服务配置
RIBBON-SERVICE-B:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRuleConnectTimeout: 3000ReadTimeout: 60000MaxAutoRetries: 3 #对第一次请求的服务的重试次数MaxAutoRetriesNextServer: 1 #要重试的下一个服务的最大数量(不包括第一个服务)OkToRetryOnAllOperations: true
全局配置
ribbon:ConnectTimeout: 3000ReadTimeout: 60000MaxAutoRetries: 3 #对第一次请求的服务的重试次数MaxAutoRetriesNextServer: 1 #要重试的下一个服务的最大数量(不包括第一个服务)OkToRetryOnAllOperations: true

服务调用

        Ribbon 可以与 RestTemplate(Rest 模板)配合使用,以实现微服务之间的调用

        RestTemplate 是 Spring 家族中的一个用于消费第三方 REST 服务的请求框架。RestTemplate 实现了对 HTTP 请求的封装,提供了一套模板化的服务调用方法。通过它,Spring 应用可以很方便地对各种类型的 HTTP 请求进行访问。

示例

1.引入依赖

        <!--Spring Cloud Ribbon 依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency>

2.创建请求,调用服务端提供的服务

@RestController
public class DeptController_Consumer {//private static final String REST_URL_PROVIDER_PREFIX = "http://localhost:8001/"; 这种方式是直调用服务方的方法,根本没有用到 Spring Cloud//面向微服务编程,即通过微服务的名称来获取调用地址private static final String REST_URL_PROVIDER_PREFIX = "http://MICROSERVICECLOUDPROVIDERDEPT"; // 使用注册到 Spring Cloud Eureka 服务注册中心中的服务,即 application.name@Autowiredprivate RestTemplate restTemplate; //RestTemplate 是一种简单便捷的访问 restful 服务模板类,是 Spring 提供的用于访问 Rest 服务的客户端模板工具集,提供了多种便捷访问远程 HTTP 服务的方法//获取指定部门信息@RequestMapping(value = "/consumer/dept/get/{id}")public Dept get(@PathVariable("id") Integer id) {return restTemplate.getForObject(REST_URL_PROVIDER_PREFIX + "/dept/get/" + id, Dept.class);}//获取部门列表@RequestMapping(value = "/consumer/dept/list")public List<Dept> list() {return restTemplate.getForObject(REST_URL_PROVIDER_PREFIX + "/dept/list", List.class);}
}

3.访问

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

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

相关文章

WEB使用百度地图展示某地地址

第一步 进入百度地图开发平台 百度地图开放平台 | 百度地图API SDK | 地图开发 第二步注册 获取AK秘钥&#xff0c;点击【创建应用】进入AK申请页面&#xff0c;填写应用名称&#xff0c;务必选择AK类型为“浏览器端”&#xff0c;JS API只支持浏览器端AK进行请求与访问 下面…

最小二乘法,可视化UI界面

import tkinter as tk import numpy as np import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from pylab import mplmpl.rcParams[font.sans-serif] [FangSong] # 指定默认字体 mpl.rcParams[axes.unicode_minus] False …

雪糕冰淇淋经营配送小程序商城效果如何

雪糕冰淇淋是很多年轻人喜欢的食品之一&#xff0c;市面上的雪糕品牌类型众多&#xff0c;销售模式主要为厂家批发、经销商零售等&#xff0c;由于雪糕冰淇淋的易化性&#xff0c;很多用户会选择就近购买&#xff0c;但制作技术升级和长途冷藏技术下&#xff0c;网购成为另一种…

VB.NET 三层登录系统实战:从设计到部署全流程详解

目录 前言&#xff1a; 什么是三层 为什么要用到三层: 饭店→软件 理解: 过程: 1.三层包图: 2.数据库 3.三层项目 4.用户界面 5.添加引用 代码实现: Entity层 BLL层 DAL层 UI层 总结: 前言&#xff1a; 什么是三层 三层就是把各个功能模块划分为表示层&#…

【从瀑布模式到水母模式】ChatGPT如何赋能软件研发全流程

文章目录 &#x1f384;前言&#x1f354;本书概要&#x1f33a;内容简介&#x1f33a;作者简介&#x1f33a;专家推荐&#x1f6f8;读者对象&#x1f354;彩蛋 &#x1f384;前言 计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地…

安全和便捷:如何将运营商二要素API应用于实名制管理中

引言 随着互联网的快速发展&#xff0c;数字化身份验证和实名制管理变得越来越重要。在金融、电子商务、社交媒体等领域&#xff0c;确保用户身份的安全和准确性至关重要。运营商二要素核验API成为了实名制管理的有力工具&#xff0c;它不仅能够提供高水平的安全性&#xff0c…

JVM进阶(2)

一)方法区: java虚拟机中有一个方法区&#xff0c;该区域被所有的java线程都是共享&#xff0c;虚拟机一启动&#xff0c;运行时数据区就被开辟好了&#xff0c;官网上说了方法区可以不压缩还可以不进行GC&#xff0c;JAVA虚拟机就相当于是接口&#xff0c;具体的HotSpot就是虚…

虹科案例 | 使用虹科MSR147WD测试自行车背包的热生理舒适性

使用虹科MSR147WD测试自行车背包的热生理舒适性 在进行运动活动时&#xff0c;佩戴背包会对穿戴者的舒适度产生影响&#xff0c;并且也会对热调节产生影响&#xff0c;类似于一件服装的作用。为了优化背包的材料和设计属性&#xff0c;我们利用MSR Electronics GmbH的微型数据记…

Java实现Csv文件导入导出

Java实现Csv文件导入导出 什么是.csv文件&#xff1f; CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔的值&#xff09;是一种简单、实用的文件格式&#xff0c;用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以 .csv 作为文件扩展名。这种文件格…

C语言编写图形化界面-创建按钮-为其指定样式

文章目录 前置章节指定窗口样式给按钮加边框扁平化按钮复选框样式按钮自动复选框 单选按钮三态按钮自动三态按钮 默认按钮样式&#xff08;对话框Enter键&#xff09; 设置按钮位置和大小封装函数 前置章节 开始之前&#xff0c;需要学习以下章节&#xff1a; 创建窗口 窗口过…

NAT技术与代理服务器

目录 一、NAT与NAPT技术 1.NAT技术 2.NAPT技术 &#xff08;1&#xff09;四元组的唯一性 &#xff08;2&#xff09;数据的传输过程 &#xff08;3&#xff09;NAPT的缺陷 二、代理服务器 1.正向代理和反向代理 2.代理服务器的应用 &#xff08;1&#xff09;游戏加…

图纸管理制度《四》

1、目的 使公司的图纸得到有效的控制&#xff0c;确保生产所用的图纸为最新有效版本&#xff0c;避免因图纸管理不当造成的损失。 2、定义 本制度所述的图纸包括产品总装图、装配图、零件图、工装图纸、检具图纸、包装图纸、工艺流程 3、范围 客户提供的图纸&#xff0c;技…

selenium+python web自动化测试框架项目实战实例教程

自动化测试对程序的回归测试更方便。 由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行... 可以运行更加繁琐的测试 自动化测试的一个明显好处就是可以在很短的时间内运行更多的测试。学习自动化测试最终目的是应用到实际项目中&…

LabVIEW应用开发——基本函数(一)

前面我们介绍了一些控件的介绍和属性的配置&#xff0c;想要完成一个软件只会拖控件肯定是不行的&#xff0c;没办法实现既有的功能。比如我们要实现从串口中读到数据&#xff0c;根据一定的协议解析&#xff0c;然后转换成各个参数的值的显示&#xff0c;包括时间、电压、电流…

796. 子矩阵的和(左上角前缀和)

题目&#xff1a; 796. 子矩阵的和 - AcWing题库 思路&#xff1a; 1.暴力搜索&#xff08;搜索时间复杂度为O(n2)&#xff0c;很多时候会超时&#xff09; 2. 前缀和&#xff08;左上角前缀和&#xff09;&#xff1a;本题特殊在不是直接求前n个数的和&#xff0c;而是求…

第1篇 目标检测概述 —(3)目标检测评价指标

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测评价指标是用来衡量目标检测算法性能的指标&#xff0c;主要包括几个指标&#xff1a;精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、交并比&#xff08;IoU&#xff09;、平均…

UI自动化测试是什么?什么项目适合做UI自动化测试

UI 测试是一种测试类型&#xff0c;也称为用户界面测试&#xff0c;通过该测试&#xff0c;我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG。了解用户将如何在用户和网站之间进行交互以执行 UI 测试至关重要&#xff0c;通过执行 UI 测试…

Flink Hive Catalog操作案例

在此对Flink读写Hive表操作进行逐步记录&#xff0c;需要指出的是&#xff0c;其中操作Hive分区表和非分区表的DDL有所不同&#xff0c;以下分别记录。 基础环境 Hive-3.1.3 Flink-1.17.1 基本操作与准备 1、上传依赖jar包到flink/lib目录下 cp flink-sql-connector-hive-…

基于springboot实现校友社交平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校友社交平台管理系统演示 摘要 校友社交系统提供给用户一个校友社交信息管理的网站&#xff0c;最新的校友社交信息让用户及时了解校友社交动向,完成校友社交的同时,还能通过论坛中心进行互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技…

Linux下的文件操作和文件管理

文章目录 应用编程文件操作文件描述符open函数write函数read函数close函数lseek函数文件操作例子 文件管理文件基本知识文件类型文件共享空洞文件错误处理退出程序原子操作fcntl和ioctl截断文件stat函数软链接和硬链接 应用编程 系统调用(system call)是Linux内核提供给应用层…