返回顶部
首页 > 资讯 > 后端开发 > Python >深入理解Java SpringCloud Ribbon 负载均衡
  • 492
分享到

深入理解Java SpringCloud Ribbon 负载均衡

2024-04-02 19:04:59 492人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言1、抛出问题2、源码解析2.1、LoadBalancerIntercepor2.2、LoadBalancerClient2.3、负载均衡策略IRule2.4、总结3、负载均衡

前言

该技术博客是关于黑马视频教程笔记总结!

服务消费者需要通过RestTemplate调用注册中心(Eureka)的服务提供者,但当同一服务名称的服务有多个的时候,我们的服务消费者应该调用哪一个服务呢?这时候就需要我们学习理解Ribbon负载均衡的实现原理。

当我们在RestTemplate组件上加上@LoadBalanced注解,就会去注册中心中拉取服务的实例列表,并且实现负载均衡,SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。

1、抛出问题

比如我们的服务消费者 order-service发出请求:Http://userservice/user/1
该请求并不能与注册中心中的服务列表信息相符,那么是如何找到 http://localhost:8081呢?

在这里插入图片描述

2、源码解析

2.1、LoadBalancerIntercepor

上述信息已经表明,我们没有输出IP和端口号,只是通过了服务名称(userservice) 就能找到我们想要调用的服务!

这是因为Ribbon组件中的LoadBalancerInterceptor(负载均衡拦截器)会将调用请求拦截,根据服务名称获取到服务实例的ip和端口。

LoadBalancerInterceptor 会在将RestTemplate的请求进行拦截,然后在Eureka注册中心根据服务名称获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务名称。

在这里插入图片描述

可以看到这里的intercept方法,拦截了调用请求HttpRequest,然后做了一下操作:

1.request.getURI():获取请求uri,本例中就是 http://user-service/user/8

2.originalUri.getHost():获取uri路径的主机名,其实就是服名称:userservice

3.this.loadBalancer.execute():处理服务名称,和用户请求

这里的this.loadBalancer是LoadBalancerClient类型,我们继续跟入execute方法!

2.2、LoadBalancerClient

代码是这样的:

getLoadBalancer(serviceId):根据服务名称获取ILoadBalancer接口,而ILoadBalancer会拿着服务名称去eureka中获取服务列表并保存起来。

getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个。本例中,可以看到获取了8082端口的服务

在这里插入图片描述

放行后,再次访问并跟踪,发现变成获取8081端口服务,实现了负载均衡:

在这里插入图片描述

2.3、负载均衡策略IRule

在刚才的代码中,可以看到获取服务使通过一个getServer方法来做负载均衡:

在这里插入图片描述

继续跟入getServer方法:

在这里插入图片描述

继续跟踪源码chooseServer方法,发现这么一段代码:

在这里插入图片描述

我们看看这个rule是谁:

在这里插入图片描述

这里的rule默认值是一个RoundRobinRule,看看介绍:

在这里插入图片描述

翻译过来就是轮询的意思,这样,整个负载均衡的流程我们就清楚了。

2.4、总结

Ribbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下:

在这里插入图片描述

基本流程如下:

  • 拦截我们的RestTemplate请求http://userservice/user/1
  • RibbonLoadBalancerClient会从请求url中获取服务名称,也就是userservice
  • DynamicServerListLoadBalancer根据userservice到eureka拉取服务列表:localhost:8081、localhost:8082
  • IRule利用内置负载均衡规则,从列表中选择一个服务,例如localhost:8081
  • RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求

3、负载均衡策略

负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:

在这里插入图片描述

不同规则的含义如下:

在这里插入图片描述

默认的实现就是ZoneAvoidanceRule,是一种轮询方案

那么如何自定义负载均衡策略?

通过定义IRule实现可以修改负载均衡规则,有两种方式:

1.代码方式:在配置类或启动类(可以看作配置类)中,定义一个新的IRule:


@Bean
public IRule randomRule(){
	//随机策略
    return new RandomRule();
}

配置文件方式:在application.yml文件中,添加新的配置也可以修改规则:


userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

注意:我们一般用默认的负载均衡规则,不做修改!

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 深入理解Java SpringCloud Ribbon 负载均衡

本文链接: https://lsjlt.com/news/134762.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 深入理解Java SpringCloud Ribbon 负载均衡
    目录前言1、抛出问题2、源码解析2.1、LoadBalancerIntercepor2.2、LoadBalancerClient2.3、负载均衡策略IRule2.4、总结3、负载均衡...
    99+
    2024-04-02
  • SpringCloud Ribbon负载均衡原理
    目录一、Ribbon负载均衡原理1 负载均衡原理2 负载均衡策略(IRule接口)3 Ribbon默认懒加载4 总结:Ribbon负载均衡规则、自定义、饥饿加载一、Ribbon负载均...
    99+
    2024-04-02
  • SpringCloud客户端负载均衡——Ribbon
      Ribbon——A ribbon is a long, narrow piece of cloth that you use for tying things together or as a decoration.  Ribbon是一...
    99+
    2023-06-02
  • SpringCloud怎么实现Ribbon负载均衡
    这篇文章主要讲解了“SpringCloud怎么实现Ribbon负载均衡”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringCloud怎么实现Ribbon负载均衡”吧!Ribbon使用R...
    99+
    2023-06-30
  • 深入浅析spring cloud中的Ribbon负载均衡
    这期内容当中小编将会给大家带来有关深入浅析spring cloud中的Ribbon负载均衡,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、负载均衡负载均衡(Load Balance): 建立在现有网络结...
    99+
    2023-05-31
    spring cloud ribbon 负载均衡
  • SpringCloud Ribbon中的7种负载均衡策略
    SpringCloud Ribbon中的7种负载均衡策略 Ribbon 介绍负载均衡设置7种负载均衡策略1.轮询策略2.权重策略3.随机策略4.最小连接数策略5.重试策略6.可用性敏感策略7....
    99+
    2023-09-07
    spring cloud ribbon 负载均衡
  • SpringCloud负载均衡组件Ribbon源码分析
    本文小编为大家详细介绍“SpringCloud负载均衡组件Ribbon源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringCloud负载均衡组件Ribbon源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-02
  • 深入理解Linux负载均衡LVS
    目录一、LVS负载均衡二、负载均衡LVS基本介绍三、LVS的体系架构3.1、Load Balancer层3.2、Server Arrary层3.3、Shared Storage层四、LVS的实现原理五、LVS的工作原...
    99+
    2022-06-03
    Linux 负载均衡 Linux LVS
  • springcloud集成ribbon负载均衡的实例代码
    本文比较简单集成ribbon,如需要更详细,请查看我的更多博客内容。 首先创建两个服务提供者 服务一,集成的nacos注册中心,这块随便写一个同名接口 端口配置8301 服务二...
    99+
    2024-04-02
  • SpringCloud中如何利用Ribbon实现负载均衡
    SpringCloud中如何利用Ribbon实现负载均衡,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先在pom文件添加Fegin的依赖包。  <d...
    99+
    2023-06-05
  • SpringCloud Ribbon负载均衡使用策略是什么
    这篇“SpringCloud Ribbon负载均衡使用策略是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Sp...
    99+
    2023-07-05
  • SpringCloud超详细讲解负载均衡组件Ribbon源码
    目录前言项目实战创建项目启动项目验证源码分析选择服务地址替换总结前言 上一篇文章中我们通过自己开发了一个负载均衡组件,实现了随机算法的负载均衡功能,如果要实现其他算法,还需要修改代码...
    99+
    2024-04-02
  • SpringCloud LoadBalancerClient 负载均衡原理解析
    目录深入解析 LoadBalancerClient 接口源码:1、LoadBalancerClient 源码解析:2、ILoadBalancer 源码解析:  &...
    99+
    2024-04-02
  • 详解SpringCloud的负载均衡
    目录一.什么是负载均衡 二.负载均衡的简单分类 三.为什么需要做负载均衡 四.springCloud如何开启负载均衡 五.IRule 1.RandomRule:表示随机策略,它将从服...
    99+
    2024-04-02
  • SpringCloud 2020-Ribbon负载均衡服务调用的实现
    目录1、概述2、Ribbon负载均衡演示3、Ribbon核心组件IRule4、Ribbon负载均衡算法4.1 原理 + 源码4.2 手写负载均衡算法1、概述 官网:https://...
    99+
    2024-04-02
  • SpringCloud 客户端Ribbon负载均衡的实现方法
    目录Ribbon 介绍开启客户端负载均衡,简化 RestTemplate 调用负载均衡策略饥饿加载Ribbon 介绍 Ribbon 是 Netflix 提供的一个基于 Http 和 ...
    99+
    2024-04-02
  • SpringCloud笔记(Hoxton)Netflix之Ribbon负载均衡示例代码
    目录Ribbon使用负载均衡代码示例注册中心Provider接口实现Consumer添加依赖测试Ribbon使用 Ribbon是管理HTTP和TCP服务客户端的负载均衡器,Ribbo...
    99+
    2024-04-02
  • ribbon负载均衡的原理是什么
    Ribbon负载均衡的原理是通过在客户端发起请求时选择合适的服务实例来实现负载均衡。Ribbon通过与服务注册中心进行通信获取服务实...
    99+
    2024-04-09
    ribbon
  • ribbon怎么设置负载均衡
    在Ribbon中,可以通过以下步骤来设置负载均衡:1. 添加Ribbon依赖:在项目的pom.xml文件中添加Ribbon的依赖,例...
    99+
    2023-09-01
    ribbon 负载均衡
  • Spring Cloud负载均衡组件Ribbon原理解析
    目录前言一个问题引发的思考Ribbon的简单使用Ribbon 原理分析LoadBalancerAutoConfiguration 自动装配RestTemplateCustomizer...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作