客户端负载均衡Ribbon
Spring Cloud中的Ribbon是什么?
我们通常说的负载均衡是指将一个请求均匀地分摊到不同的节点单元上执行,负载均衡分为硬件负载均衡和软件负载均衡;
硬件负载均衡:比如F5、深信服、Array等;
软件负载均衡:比如Nginx、LVS、HAProxy等;
硬件负载均衡或者软件负载均衡,他们都会维护一个可用的服务端清单,通过心跳检测来剔除故障的服务端节点以保证清单中都是可以正常访问的服务端节点。当客户端发送请求到负载均衡设备的时候,该设备按照某种算法(比如轮询、权重、最小连接数等)从维护的可用服务端清单中取出一台服务端的地址,然后进行转发。
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,是一个基于HTTP和TCP的客户端负载均衡工具。
Spring Cloud对Ribbon做了二次封装,可以让我们使用RestTemplate的服务请求,自动转换成客户端负载均衡的服务调用。
Ribbon支持多种负载均衡算法,还支持自定义的负载均衡算法。
Ribbon只是一个工具类框架,比较小巧,Spring Cloud对它封装后使用也非常方便,它不像服务注册中心、配置中心、API网关那样需要独立部署,Ribbon只需要在代码直接使用即可;
Ribbon与Nginx的区别:
Ribbon是客户端的负载均衡工具,而客户端负载均衡和服务端负载均衡最大的区别在于服务清单所存储的位置不同,在客户端负载均衡中,所有客户端节点下的服务清单,需要自己从服务注册中心上获取,比如Eureka服务注册中心。同服务端负载均衡的架构类似,在客户端负载均衡中也需要心跳去维护服务端清单的健康性,只是这个步骤需要与服务注册中心配合完成。在Spring Cloud中,由于Spring Cloud对Ribbon做了二次封装,所以默认会创建针对Ribbon的自动化整合配置。
在Spring Cloud中,Ribbon主要与RestTemplate对象配置起来使用,Ribbon会自动化配置RestTemplate对象,通过@LoadBalanced开启RestTemplate对象调用时的负载均衡。
Ribbon实现客户端负载均衡
由于Spring Cloud Ribbon的封装,我们在微服务架构中使用客户端负载均衡调用非常简单,只需要如下两步:
1、启动多个服务提供者实例并注册到一个服务注册中心或者是服务注册中心集群。
2、服务消费者通过被@LoadBalanced注解修饰过的RestTemplate来调用服务提供者。
这样,我们就可以实现服务提供者的高可用以及服务消费者的负载均衡调用。
Ribbon负载均衡策略
Ribbon的负载均衡策略是由IRule接口定义,该接口由如下实现:
RandomRule:随机策略;
RoundRobinRule:轮询策略(默认);
WeightResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快服务权重就越大,被选中的概率越高,如果服务刚启动时统计信息不足,则使用RoundRobinRule策略,待统计信息足够会切换到该WeightResponseTimeRule策略;
RetryRule:先按照RoundRobinRule策略分发,如果分发到的服务不能访问,则在指定时间内进行重试,分发其他可用服务;
BestAvailableRule:先过滤掉由于多次访问故障的服务,然后选择一个并发量最小的服务;
ZoneAvoidanceRule:综合判断服务节点所在区域的性能和服务节点的可用性,来决定选择哪个服务。
如果想采用其他的负载均衡策略,在调用服务的配置类里面如下写:
@Configuration //等价于spring applicationContext.xml配置文件
public class BeanConfig {/** @Bean 等价于:* <bean id="restTemplate" class="xxx.xxx.xxx.RestTemplate">* </bean>* */@LoadBalanced //使用Ribbon实现负载均衡的调用@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}/*** 覆盖掉原来Ribbon默认的轮询负载均衡策略* @return*/@Beanpublic IRule iRule(){return new RandomRule(); //采用随机的负载均衡策略return new RetryRule(); //采用重试的负载均衡策略}
}
Rest请求模板类解读
当我们从服务消费端去调用服务提供者的服务的时候,使用了一个极其方便的对象叫RestTemplate,当时我们只使用了RestTemplate中最简单的一个供能getForEntity发起了一个get请求去调用服务端的数据,同时,我们还通过配置@LoadBalanced注解开启客户端负载均衡,RestTemplate的功能非常强大,接下来详细看一下RestTemplate中几种常见请求方法的使用。
在日常操作中,基于Rest的方式通常是四种情况,它们分别是:
GET请求--查询数据;
POST请求--添加数据;
PUT请求--修改数据;
DELETE请求--删除数据;
RestTemplate的GET请求
Get请求可以有两种方式:
第一种:getForEntity
该方法返回一个ResponseEntity<T>对象,ResponseEntity<T>是Spring对HTTP请求响应的封装,包括了几个重要的元素,比如响应码、contentType、contentLength、响应消息体等等;
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/hello",String.class);
String body = responseEntity.getBody();
HttpStatus httpStatus = responseEntity.getStatusCode();
int statusCodeValue = responseEntity.getStatusCodeValue();
HttpHeaders headers = responseEntity.getHeaders();
以上代码:
getForEntity方法第一个参数为要调用的服务的地址,即服务提供者提供的http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/hello接口地址,注意这里是通过服务名调用而不是服务地址,如果改为服务地址就无法使用Ribbon实现客户端负载均衡了;
getForEntity第二个参数String.class表示希望返回的body类型是String类型,如果希望返回一个对象,也是可以的,比如User对象;
第二种:getForObject()
与getForEntity使用类似,只不过getForObject是在getForEntity基础上进行了再次封装,可以将http的响应体body信息转为指定的对象,方便我们的代码开发;
当不需要返回响应中的某些信息,只需要body体信息的时候,可以使用这个更方便;
User user = restTemplate.getForObject("http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/getUser?id={0}&name={1}&phone={2}", User.class,strArray);
直接返回一个User对象。
RestTemplate的POST请求
post与get请求非常类似:
restTemplate.postForEntity(); restTemplate.postForObject(); restTemplate.postForLocation();
例子:在被调用的服务中增加方法:
// @RequestMapping(value="/service/addUser",method = RequestMethod.POST)@PostMapping("/service/addUser")public User addUser(@RequestParam("id") Integer id,@RequestParam("name") String name,@RequestParam("phone") String phone){// 进行业务处理(省略)System.out.println("服务提供者1。。。。。");User user = new User();user.setId(id);user.setName(name);user.setPhone(phone);// 将user对象插入数据库(暂时省略)return user;}
在服务消费者中测试post请求方法:
/*** 消费者调用服务提供者的addUser方法* @return*/@RequestMapping("/web/addUser")public User addUser(){// 逻辑判断省略不写// 调用post请求的方法,参数并非拼接在url地址后面,通过请求体传递参数// 要传的表单信息,参数数据(坑人的),不能用hashmap这一类MultiValueMap<String,Object> dataMap = new LinkedMultiValueMap<String,Object>();dataMap.add("id","1028");dataMap.add("name","章");dataMap.add("phone","1213141414234");ResponseEntity<User> responseEntity = restTemplate.postForEntity("http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/addUser", dataMap, User.class);User body = responseEntity.getBody();HttpStatus httpStatus = responseEntity.getStatusCode();int statusCodeValue = responseEntity.getStatusCodeValue();HttpHeaders headers = responseEntity.getHeaders();System.out.println(body.getId()+"--"+body.getName()+"--"+body.getPhone());System.out.println(httpStatus);System.out.println(statusCodeValue);System.out.println(headers);User user = restTemplate.postForObject("http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/addUser", dataMap, User.class);System.out.println(user.getId()+"--"+user.getName()+"--"+user.getPhone());return restTemplate.postForEntity("http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/addUser",dataMap,User.class).getBody();}
RestTemplate的PUT请求
restTemplate.put();
例子:在服务提供者中增加方法:
// @RequestMapping(value = "/service/updateUser",method = RequestMethod.PUT)@PutMapping("/service/updateUser")public User updateUser(@RequestParam("id") Integer id,@RequestParam("name") String name,@RequestParam("phone") String phone){// 进行业务处理(省略)System.out.println("服务提供者1。。。。。");User user = new User();user.setId(id);user.setName(name);user.setPhone(phone);// 修改数据库数据(暂时省略)return user;}
在服务消费者中调用put请求方法
/*** 消费者调用服务提供者的updateUser方法* @return*/@RequestMapping("/web/updateUser")public String updateUser(){// 逻辑判断省略不写// 调用post请求的方法,参数并非拼接在url地址后面,通过请求体传递参数// 要传的表单信息,参数数据(坑人的),不能用hashmap这一类MultiValueMap<String,Object> dataMap = new LinkedMultiValueMap<String,Object>();dataMap.add("id","1028");dataMap.add("name","章");dataMap.add("phone","1213141414234");// put没有返回值restTemplate.put("http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/updateUser", dataMap);return "success";}
RestTemplate的DELETE请求
restTemplete.delete();
delete与get类似,参数传递可以在url后面拼接。delete方法没有返回值。
客户端负载均衡Ribbon相关推荐
- 五、springcloud之客户端负载均衡Ribbon
一.简介 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式: 一种是ribbon+restTemplate, ...
- 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən] n. 带; 绶带; (打印机的) 色带; 带状物; v. 把-撕成条带; 用缎带装饰; 形成带状; ...
- Spring Cloud入门教程(二):客户端负载均衡(Ribbon)
对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...
- 基于Spring cloud Ribbon和Eureka实现客户端负载均衡
前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...
- SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用
什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...
- Spring Cloud微服务笔记(四)客户端负载均衡:Spring Cloud Ribbon
客户端负载均衡:Spring Cloud Ribbon 一.负载均衡概念 负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容.因为负载均衡对系统的高可用性. 网络压力的缓解和处理能力的扩容的 ...
- Ribbon客户端负载均衡
前一篇博客我们已经构建了一个微服务项目demo,地址为https://blog.csdn.net/f123147/article/details/115904274,在高访问量和高并发的复杂项目中,不 ...
- Springcloud、Nacos 服务注册、负载均衡Ribbon、http客户端Feign
SpringCloud是基于SpringBoot的一整套实现微服务的框架.它提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等组 ...
- 负载均衡Ribbon和Feign---SpringCloud
负载均衡Ribbon和Feign Ribbon负载均衡(基于客户端) 6.1 负载均衡以及Ribbon Ribbon是什么? Spring Cloud Ribbon 是基于Netflix Ribbon ...
- SpringCloud学习笔记(6)----Spring Cloud Netflix之负载均衡-Ribbon的使用
1. 什么是负载均衡? 负载均衡,就是分发请求流量到不同的服务器. 负载均衡一般分为两种 1. 服务器端负载均衡(nginx) 2. 客户端负载均衡(Ribbon) 2. 服务提供者(spring-c ...
最新文章
- Python 笔试集(1):关于 Python 链式赋值的坑
- jquery之仿京东菜单
- ABAP R3 时代著名的 SFLIGHT 航班模型测试数据,到了S/4HANA时代的进化版
- F - GCD or MIN(数论)
- vim反向删除_VIM之操纵缓冲区列表
- html页面循环报错,wxs 脚本中 for 循环的一种写法导致 page-frame.html 报错
- 【转】Javascript 的词法作用域、调用对象和闭包
- 利用excel快速制作标准正态分布表
- 七年级计算机上教学计划,新人教版七年级数学下册教学计划(精选5篇)
- 6678与FPGA PCIE调试
- iOS Mac安装ipa文件的几种方法
- 当AI开始创作出令人惊叹的作品时 你的双眼已被蒙蔽
- DOJO API 中文参考手册
- destoon模板安装方法
- iso管理体系认证条件
- 如何在服务器中搭建属于自己的个人网盘
- agilent仪表频谱仪控制程序
- 【硬件开源电路】STM32G070RBT6开发板
- wifi5和wifi6差别 wifi5和wifi6区别
- 中国式危机公关9加1策略(第四章 情感公关策略)
热门文章
- JAVA---集合子接口之Set
- python最好视频教程_国外最顶级的Python视频教程,赶紧收藏!(带中文字幕)
- 怎么制作你的第一个机器人
- 重装系统缺少计算机所需的介质,win10重装系统提示缺少介质,显示缺少介质解决方法...
- 共享单车调度_原来你是这样的共享单车调度员:每天抬1万斤,走2万多步
- Sql取得两表关联数据
- 【手把手带你刷LeetCode】——02.出现1次和K次的数(位运算)
- 基于JAVA春运出行铁路路线规划推荐系统计算机毕业设计源码+系统+lw文档+部署
- IT精英《非诚》引论战 泰国帅哥转角遇到爱
- mysql 导入dmp_navicat怎么导入dmp文件