SpringCloud Ribbon负载均衡介绍及使用
一、什么是Ribbon
Ribbon为Netflix发布的一款客户端负载均衡器。在SpringCloud中Eureka一般配合Ribbon使用,Ribbon利用从Rureka中获取到服务提供者列表信息,并基于内置的负载均衡算法进行选择调用。Ribbon的底层也是对RestTemplate进行封装,使用http请求进行调用。
二、Ribbon的作用有哪些
1,服务调用
Ribbon 的服务调动为通过注册中心获取服务列表组成(服务名-请求路径)映射关系。并借助RestTemplate对象完成服务调用
2,客户端负载均衡
负载均衡在端类型上分为服务端负载均衡和客户端负载均衡,有点类似正向代理(客户端)和反向代理(服务端)。按软硬件分为软件负载均衡和硬件负载均衡。我们常见的Nginx、lvs为服务端负载均衡软件,F5为服务端负载均衡硬件。Ribbon为客户端负载均衡软件。
Ribbon的负载均衡测试包含:
- 轮询方式策略(com.netflix.loadbalancer.RoundRobinRule)
- 随机策略(com.netflix.loadbalancer.RandomRule)
- 重试策略(com.netflix.loadbalancer.RetryRule)
- 权重策略(com.netflix.loadbalancer.WeightedResponseTimeRule 会计算每个服务的权重,越高的调用次数越大)
- 最佳策略(com.netflix.loadbalancer.BestAvailableRule 遍历所有服务实例,并过滤掉故障实例,并返回请求数最小的实例,类似dubbo的最小活跃数策略)
- 可用过滤策略(com.netflix.loadbalancer.AvailabilityFilteringRule 过滤掉故障和请求数超过阈值的服务实例,再从剩下的实例中轮询调用)
3,使用Ribbon的请求重试功能
通过添加spring.retry依赖 和结合Ribbon的配置可以实现Ribbon的请求重试功能。
三、Ribbon的配置使用
1,服务调用代码
为RestTemplate bean对象添加@org.springframework.cloud.client.loadbalancer.LoadBalanced 注解(Eureka 依赖已经引入不需要在添加依赖);在使用RestTemplate对象调用远程接口时,可以将接口地址中的ip和端口部分可以使用注册中心中的服务ID代替;
参考消费者工程中的RestTemplate配置类代码如下(重点):
package com.xiaohui.springcloud.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/**** 相当于 spring的 application.xml bean注解相当于 bean 标签*/
@Configuration
public class ApplicationContextConfig {@LoadBalanced@Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}
使用restTemplate 的Controller 代码如下,其中第三种调用方式中 在接口地址中直接使用了服务提供者的工程的服务名:
package com.xiaohui.springcloud.controller;import com.xiaohui.springcloud.entities.CommonResult;
import com.xiaohui.springcloud.entities.Payment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import java.util.List;@RestController
public class OrderController {public static String PAYMENT_URL = "http://127.0.0.1:8001";@Autowiredprivate DiscoveryClient discoveryClient;@Autowiredprivate RestTemplate restTemplate;@GetMapping("/consumer/payment/get/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id){return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);}@GetMapping("/consumer/payment/get2/{id}")public CommonResult<Payment> getPayment2(@PathVariable("id") Long id){List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");ServiceInstance serviceInstance = instances.get(0);return restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/payment/get/"+id,CommonResult.class);}@GetMapping("/consumer/payment/get3/{id}")public CommonResult<Payment> getPayment3(@PathVariable("id") Long id){CommonResult<Payment> commonResult = null;commonResult = restTemplate.getForObject("http://cloud-payment-service/payment/get/"+id,CommonResult.class);return commonResult;}
}
2,负载均衡配置实现:
轮询策略:在上面的使用Ribbon的调用配置后,Ribbon会使用默认的负载均衡测试进行调用,即轮询策略,当该服务又多个服务提供者节点时,Ribbon会逐一轮询调用每个节点。测试方式:我们启动两个不同端口的服务提供者节点,端口分别为8001,和8002。在节点处理返回结果时添加上当前提供者节点的ip和端口信息来观察请求路由到哪一个节点上,观察调用效果:注意负载均衡策略配置在消费者节点配置中,因为Ribbon为客户端负载均衡器
- 默认轮询策略
默认的负载均衡实现类为:com.netflix.loadbalancer.RoundRobinRule。我们在服务端返回处理调用的当前服务接口ip端口,效果如下可以看到端口8002、8001 进行顺序切换。
- 随机策略:
如果需要修改默认的轮询负载均衡算法,则可以在客户端配置文件上对cloud-payment-service.ribbon.NFLoadBalancerRuleClassName 键值进行修改,如下配置将默认的负载均衡算法实现修改为随机算法:(cloud-payment-service 为服务端的服务名称)
cloud-payment-service:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
和上面的环境一样我们开启两个生产者服务,然后返回处理请求的服务节点ip和端口信息,通过返回可以看出 处理节点在 8002、8001 上随机进行请求。
- 重试配置:通过引入spring.retry 可以实现服务的容错能力。当某一个节点在处理请求超时,则可以根据超时重试配置规则进行换一台服务节点进行重新请求。如 如下配置,当服务节点和连接节点后的数据处理时间超过对应配置的时间后没有相应则会进行切换节点进行重新发起请求。MaxAutoRetriesNextServer 表示重新请求的最大次数。MaxAutoRetries表示对当前故障节点的再次重启次数。
maven 添加依赖
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId>
</dependency>
application.yml 文件添加配置如下
cloud-payment-service:ribbon:
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRuleConnectTimeout: 250 #Ribbon的 链接超时时间ReadTimeout: 1000 #Ribbon的数据读取超时时间OkToRetryOnAllOperations: true #是否对所有操作都重试MaxAutoRetriesNextServer: 1 #切换实例的重试次数MaxAutoRetries: 1 #对当前实例的重试次数
SpringCloud Ribbon负载均衡介绍及使用相关推荐
- 四、SpringCloud——Ribbon负载均衡Ribbon自定义
1 Ribbon简介 1)是什么 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目,主要功 ...
- 【SpringCloud】Ribbon:负载均衡
什么是Ribbon? 并且Eureka中已经集成了Ribbon,所以我们无需引入新的依赖 如果要引入也是可以以的,依赖如下 <dependency><groupId>org.s ...
- JavaEE进阶知识学习-----SpringCloud(六)Ribbon负载均衡
Ribbon负载均衡 Ribbon概述 Spring Cloude Ribbon是基于Netfilx Ribbon实现的一套客户端 负载均衡的工具,简单说,Ribbon是Netfilix发布的开源项目 ...
- SpringCloud源码:Ribbon负载均衡分析
本文主要分析 SpringCloud 中 Ribbon 负载均衡流程和原理. SpringCloud版本为:Edgware.RELEASE. 一.时序图 和以前一样,先把图贴出来,直观一点: 二.源码 ...
- SpringCloud:Ribbon负载均衡(基本使用、 负载均衡、自定义配置、禁用 Eureka 实现 Ribbon 调用)
现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现在的问题,所有的微服务汇集到了 Eureka 之 ...
- SpringCloud的Ribbon负载均衡
Spring Cloud Ribbon相关学习: 简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说,Ribbon是Netflix ...
- SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)...
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册 ...
- SpringCloud[04]Ribbon负载均衡服务调用
文章目录 Ribbon负载均衡服务调用 1. 概述 1. Ribbon是什么 2. Ribbon能做什么 2. Ribbon负载均衡演示 1. 架构说明 2. Ribbon的POM依赖 3. Rest ...
- Spring Cloud概念+案例(eureka注册+拉取、ribbon负载均衡+重试)、netfix各组件介绍【上】
Spring Cloud概念+案例(断路器)[下] https://blog.csdn.net/LawssssCat/article/details/104632719 [⭐️⭐️⭐️] Spring ...
最新文章
- Makefile的语法
- 动态规划专题 01背包问题详解【转】
- javascript读写本机文本文件
- 第 5-2 课:线程池——ThreadPoolExecutor + 面试题
- IDEA Git更新
- 百练 06 股票买卖
- Sigar - no sigar-amd64-winnt.dll in java.library.path
- mysql 返回几个组_MySQL – 控制由组返回的行
- 对付U盘病毒彻底免疫
- 计算机字体管理软件,字体管理软件有哪些?字体管理软件推荐
- Siebel系统中配置LDAP认证
- 鸿蒙系统支持双系统吗,双系统同台登出,EMUI11+鸿蒙系统2.0,有大招
- 【历史上的今天】4 月 28 日:人工智能理论之父出生;大众点评上线;苹果开设 iTunes 音乐商店
- keep sb updated_keep you update 和keep you updated哪个正确
- Android P SystemUI之StatusBar UI布局status_bar.xml解析
- 用html设计一个时间距离查询,使用HTML5 Geolocation实现一个距离追踪器
- java检测弹窗并自动enter_JAVA实现自动检测股票波动情况,然后桌面上弹窗显示...
- 一文揭秘:「政府之眼」与「加密世界透视者」Chainalysis
- 人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[3]——邯郸学步
- teamcity 配置npm自动化构建