基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】

这篇具有很好参考价值的文章主要介绍了基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、前言

二、源码分析

三、负载均衡策略


一、前言

如下图,我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求,在服务拉取的时候,主机名 localhost 是用服务名 userserver 代替的,那么该 url 是一个可访问的网络地址吗?

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon
 

我们在浏览器中访问一下这个地址,果然不可用。

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

那么它又是怎么访问到 userserver 数据的?别忘了我们的服务都是注册在 Eureka 上的,那肯定是拿着服务名去找 Eureka 要人了对不对?找到服务之后把具体的主机名替换掉就OK了。

实际上,我们可能有多个 userserver 同时注册在 Eureka 上,这时候 orderserver 要去 Eureka 上拉取服务的时候,拉取到的就不只是一个 userserver 服务了,它应该是一个服务列表,那么最终执行的时候肯定是只交给一个服务去做,到底要交给谁呢?没错,这就是我们本篇要说的 —— Ribbon,用它来实现多服务的负载均衡。

二、源码分析

上一篇文章中,提到了 @LoadBalanced 注解,我们说用它可以开启负载均衡。这个注解其实就是一个标记,标记 RestTemplate 发起的请求要被 Ribbon 拦截并处理。

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

那个这个拦截动作具体是谁来做的呢?Ctrl + Shift + N,搜索 LoadBalancerInterceptor,点击第一个。

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

我们可以打断点 debug,可以看到 request.getURI() 这一步是在获取请求路径,也就是我们上面说的那个不可用的 url。

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

F8 快捷键下一步,originalUri.getHost() 应该就是在获取主机名,获取到的 host 正是 userserver。

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

拿到了主机名,就该去找 Eureka 拉取服务了,继续往下走,发现它把该服务名称交给了 loadBalancer.execute 去执行,F7 跟进该方法。

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

服务列表拿到之后就准备负载均衡了,F7 进入方法内部,我们发现它调用了 chooseServer 方法,翻译一下:选择服务。从刚才拉取到的服务列表中选择一个出来?

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

继续 F7 进入 chooseServer 方法,可以看到它又去调用父类的 chooseServer 方法了。

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

跟进方法往下走,返回一个 rule.choose?翻译一下:选择规则。说明我们从服务列表中选择一个服务的时候也是有规则的。

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

光标放到 rule 上,Ctrl 加鼠标左键跟进,它原来是一个 IRule 类型的。

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

那么这个 IRule 接口有哪些具体的 Rule 呢?光标放在 IRule 上,Ctrl + H,弹出它的实现类。翻译一下:有随机规则、轮询规则等等。

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

拿到了真实的访问地址,并且选择了一种负载均衡策略,就可以对之前不可访问的 url 进行替换了。

整体流程:

orderserver 发起 http 请求 → 请求被 LoadBalancerInterceptor 负载均衡拦截器拦截 → RibbonLoadBalancerClient 拿到服务名,并将其作为参数传给 DynamicServerListLoadBalancer → DynamicServerListLoadBalancer 就会去 Eureka 中拉取服务列表 → 随后 DynamicServerListLoadBalancer 又会去请求 IRule 接口做负载均衡,根据规则挑一个服务出来,并返回 → RibbonLoadBalancerClient 拿到了真实的服务地址就会对之前不可访问的 url 地址进行替换,最终请求到目标服务。

三、负载均衡策略

如下图,每一个子接口都是一种规则:

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

默认是的负载均衡策略是 ZoneAvoidanceRule,它父类的父类是轮询的,所以本质上讲 ZoneAvoidanceRule 也是一个轮询策略,但是它是以 Zone 对服务器进行划分的,这个 Zone 可以理解为一个机房,所以在选择服务的时候,它会优先选择跟自己在同一个机房里面的服务,然后进行轮询。

那么如何修改负载均衡规则呢?有两种方式。

① 代码方式,在 orderserver 的启动类中定义一个新的 IRule(作用于全局)

@Bean
public IRule randomRule() {
    return new RandomRule();
}

② 配置文件方式,在 orderserver 的 yml 文件中添加新的配置(只针对某个微服务而言)

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon

Ribbon 的默认加载机制是懒加载,所谓懒加载就是不用的时候不加载,什么时候要用了才去加载,所以服务在第一次被访问的时候速度较慢,由于 Ribbon 给我们提供了缓存,所以之后的访问速度还是很快的。

相对于懒加载的是饥饿加载,顾名思义,饥饿加载就是在项目一启动的时候就开始加载,所以它的每一次访问速度都很快。那么如何修改 Ribbon 的加载方式呢?我们可以通过配置文件的方式进行修改。

eureka微服务 负载均衡 实现,SpringCloud,spring cloud,eureka,ribbon文章来源地址https://www.toymoban.com/news/detail-776251.html

到了这里,关于基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springCloud之Eureka之负载均衡Ribbon

    说完了注册中心Eureka,虽然Eureka可以实现服务的发现和调用,但在微服务体系中,服务的发现和调用往往是需要伴随着负载均衡这个概念一体的。而在SpringCloud中自然也存在着与Eureka配套的负载均衡组件,也就是Ribbon组件。 Ribbon介绍 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套

    2024年02月05日
    浏览(32)
  • 38.SpringCloud—注册中心(eureka/nacos)、负载均衡Ribbon

    目录 一、SpringCloud。 (1)认识微服务。 (1.1)单体架构与分布式架构(微服务)。 (1.2)微服务技术对比。 (1.3)SpringCloud。 (2)服务拆分及远程调用。 (2.1)服务拆分。 (2.2)远程调用。 (3)提供者与消费者。 (4)Eureka注册中心。 (4.1)Eureka的作用。  (4.2)搭建

    2024年02月09日
    浏览(53)
  • 【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

    服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务) 服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口) 很明显,这是一个相对的概念。 上一篇中,远程调用时,url参数是写死在代码中的,而不同的测试、生产、

    2024年02月06日
    浏览(46)
  • SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡

    目录 一:Eureka注册中心 1. Eureka原理 2. 动手实践 ①搭建EurekaServer ②服务注册 ③服务发现  二:Ribbon负载均衡 1. 负载均衡原理 2. 负载均衡策略 3. 懒加载 tips:前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,感兴趣的同学可以

    2024年02月05日
    浏览(44)
  • SpringCloud学习笔记(上):服务注册与发现:Eureka、Zookeeper、Consul+负载均衡服务调用:Ribbon

    SpringCloud=分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。 springboot版本选择: git源码地址:https://github.com/spring-projects/spring-boot/releases/ SpringBoot2.0新特性:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release springcloud版本选

    2024年02月08日
    浏览(42)
  • springcloud五大组件:Eureka:注册中心、Zuul:服务网关、Ribbon:负载均衡、Feign:服务调用、Hystix:熔断器

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。 SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 Eureka包含两个组件:Eureka Server和Eure

    2024年04月10日
    浏览(43)
  • SpringCloud集成Eureka并实现负载均衡

    辗转两家公司也算工作了大半年,有幸见识过很多微服务架构,比如Dubbo+Redis的组合;Dubbo+Zookepper的组合;SpringCloud+Eureka的组合;SpringCloud+Nacos的组合… 每一种组合都有属于自己的故事。 笔者认为:流行的不一定是最好的,如果只学习最流行的技术,这对以后的发展是很受限

    2024年02月05日
    浏览(44)
  • springcloud 中RestTemplate 是怎么和 ribbon整合,实现负载均衡的?源码分析

    RestTemplate 内置了一个 ClientHttpRequestInterceptor ,这个是一个拦截器操作,我们可以在请求的前后做一些事情。然后我们看一下这个类,这个类里面 有一个 intercept 方法。我们看下这个实现类,里面有一个 LoadBalancerInterceptor 实现类。 我们来看 LoadBalancerInterceptor 实现类。 然后我

    2024年02月09日
    浏览(40)
  • [日报] Ribbon、Eureka、Nginx、负载均衡

    目录 前言 一、Ribbon和Eureka的关系 二、Eureka知识笔记(个人理解) 三、关于Ribbon和Nginx的负载均衡区别 1、位置工作方式 2、策略 3、集中式与分布式 四、杂项 1、版本问题 2、一些课堂内容订正 3、Spring Cloud生态给出的替代方案 Spring Cloud LoadBalancer Spring Cloud Consul 完成度比较

    2024年03月18日
    浏览(39)
  • 使用SpringCloud Eureka 搭建EurekaServer 集群- 实现负载均衡&故障容错【上】

    😀前言 本篇博文是关于使用SpringCloud Eureka 搭建EurekaServer 集群- 实现负载均衡故障容错,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包