深入理解Java SpringCloud Ribbon 负载均衡

目录
  • 前言
  • 1、抛出问题
  • 2、源码解析
    • 2.1、LoadBalancerIntercepor
    • 2.2、LoadBalancerClient
    • 2.3、负载均衡策略IRule
    • 2.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 # 负载均衡规则

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

总结

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

(0)

相关推荐

  • SpringCloud手写Ribbon实现负载均衡

    前言 前面我们学习了 SpringCloud整合Consul,在此基础上我们手写本地客户端实现类似Ribbon负载均衡的效果. 注: order 模块调用者 记得关闭 @LoadBalanced 注解. 我们这里只演示 注册中心 consul,至于 zookeeper 也是一模一样. 生产者 member模块 member 服务需要集群,所以我们copy application-consul.yml 文件命名为 application-consul2.yml 服务别名一致,只需要修改端口号即可.

  • Spring cloud alibaba之Ribbon负载均衡方案

    目录 1.什么是Ribbon 1.1客户端的负载均衡 1.2服务器端的负载均衡 1.3常见负载均衡算法 2.Nacos使用Ribbon 3.Ribbon负载均衡策略 3.1常用负载均衡描述 3.3修改默认的负载均衡策略--配置文件的方式 3.4自定义负载均衡策略 4.使用spring cloud loadbalancer替代ribbon 1.什么是Ribbon 目前主流的负载均衡方案分为以下两种: (1)集中式负载均衡:在消费者和服务提供者中间使用独立的代理方式进行负载,有硬件的(F5),软件的

  • Spring Cloud 系列之负载均衡 Ribbon的示例代码

    1.1 简介 1.1.1 概述   Ribbon 是 Netflix 发布的负载均衡器,它有助于控制 HTTP 和 TCP 客户端的行为.为 Ribbon 配置服务提供者地址列表后,Ribbon 就可基于某种负载均衡算法,自动地帮助服务消费者去请求.Ribbon 默认为我们提供了很多的负载均衡算法,例如轮询.随机等.当然,我们也可为 Ribbon 实现自定义的负载均衡算法.Ribbon 现在已经进入维护状态,但目前仍在大规模使用,Spring Cloud 准备使用 LoadBalancer 作为

  • SpringCloud 2020-Ribbon负载均衡服务调用的实现

    1.概述 官网:https://github.com/Netflix/ribbon/wiki/Getting-Started Ribbon目前也进入维护模式,未来替换方案: LB(负载均衡) 集中式LB 进程内LB Ribbon就是负载均衡+RestTemplate调用 2.Ribbon负载均衡演示 1.架构说明 总结:Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例. 2. 3.二说RestTemplate的使用 官网

  • springcloud中Ribbon和RestTemplate实现服务调用与负载均衡

    文件目录结构 文件目录结构很重要,特别注意的是rule文件要放在主启动类上一级位置,才能够扫描. 写pom <dependencies> <!--springboot 2.2.2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependenc

  • 深入理解Java SpringCloud Ribbon 负载均衡

    目录 前言 1.抛出问题 2.源码解析 2.1.LoadBalancerIntercepor 2.2.LoadBalancerClient 2.3.负载均衡策略IRule 2.4.总结 3.负载均衡策略 总结 前言 该技术博客是关于黑马视频教程的笔记总结! 服务消费者需要通过RestTemplate调用注册中心(Eureka)的服务提供者,但当同一服务名称的服务有多个的时候,我们的服务消费者应该调用哪一个服务呢?这时候就需要我们学习理解Ribbon负载均衡的实现原理. 当我们在RestTempl

  • SpringCloud Ribbon负载均衡实例解析

    这篇文章主要介绍了SpringCloud Ribbon负载均衡实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring Cloud集成了Ribbon,结合Eureka,可实现客户端的负载均衡. 下面实现一个例子,结构下图所示. 一.服务器端 1.创建项目 开发工具:IntelliJ IDEA 2019.2.3 IDEA中创建一个新的SpringBoot项目,名称为"cloud-server",SpringBoot版本选择2

  • SpringCloud Ribbon 负载均衡的实现

    前言 Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制.我们在上篇(猛戳:SpringCloud系列--Feign 服务调用)已经实现了多个服务之间的Feign调用,服务消费者调用服务提供者,本文记录Feign调用Ribbon负载均衡的服务提供者 GitHub地址:https://github.com/Netflix/ribbon 官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-net

  • Springcloud ribbon负载均衡算法实现

    一 前言 经过几篇的cloud系列文章,我想大家都有一个坚实的基础,后续的学习就会轻松很多,如果是刚刚来看的读者需要有eureka基础知识,或者查阅知识追寻者的cloud系列专栏:这篇文章主要讲解如何使用ribbon实现web service客户端调用,ribbon默认算法实现负载均衡等! 二 ribbon简介 ribbon是一个客户端负载均衡器,其能够整合不同的协议工具进行web service API 调用: 主要特色如下: 提供可插拔式的负载均衡整合服务发现故障弹性恢复cloud支持客户端

  • 详解SpringCloud Ribbon 负载均衡通过服务器名无法连接的神坑

    一,问题 采取eureka集群.客户端通过Ribbon调用服务,Ribbon端报下列异常 java.net.UnknownHostException: SERVICE-HI java.lang.IllegalStateException: No instances available for SERVICE-HI java.lang.IllegalStateException: Request URI does not contain a valid hostname: http://SERVI

  • SpringCloud Ribbon负载均衡代码实例

    1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId&g

  • SpringCloud笔记(Hoxton)Netflix之Ribbon负载均衡示例代码

    目录 Ribbon使用 负载均衡 代码示例 注册中心 Provider 接口实现 Consumer 添加依赖 测试 Ribbon使用 Ribbon是管理HTTP和TCP服务客户端的负载均衡器,Ribbon具有一系列带有名称的客户端(Named Client),也就是带有名称的Ribbon客户端(Ribbon Client). 每个客户端由可配置的组件构成,负责一类服务的调用请求.SpringCloud通RibbonClientConfiguration 为每个Ribbon客户端创建Applica

  • SpringCloud 客户端Ribbon负载均衡的实现方法

    目录 Ribbon 介绍 开启客户端负载均衡,简化 RestTemplate 调用 负载均衡策略 饥饿加载 Ribbon 介绍 Ribbon 是 Netflix 提供的一个基于 Http 和 TCP 的客户端负载均衡工具,且已集成在 Eureka 依赖中. 实现原理:SpringCloud Ribbon 的底层采用了一个拦截器,拦截了 RestTemplate 发出的请求,对地址做了修改. 开启客户端负载均衡,简化 RestTemplate 调用 1)在服务调用者的 RestTemplate 配

  • SpringCloud 服务负载均衡和调用 Ribbon、OpenFeign的方法

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

随机推荐