Ribbon服务调用+负载均衡(入门)
1、Ribbon
Ribbon中文:(用于捆绑或装饰的)带子; 丝带; 带状物;
主要功能是提供客户端的软件负载均衡算法和服务调用
Ribbon已经进入了维护模式了,但是Ribbon仍然被广泛使用中
①.Nginx和Ribbon的区别
Nginx是服务器的负载均衡,客户端将所有请求给Nginx,Nginx实现转发。辅助均衡通过服务端实现。
而Ribbon是本地的负载均衡,在调用微服务的接口的时候,会在注册中心获取注册信息服务列表之后缓存到JVM,之后就在本地实现RPC调用了。
②.什么是Ribbon
负载均衡+restTemplate实现远程调用
Ribbon是一个软负载均衡客户端组件,可以和其他所需请求的客户端结合使用,比如Eureka......
③.Ribbon工作流程
- 选择EurekaServer,优先选一个负载较少的Server
- 根据用户指定的策略,从server渠道的服务注册表中选一个地址(Ribbon提供多种策略:轮询、随机、响应事件加权)
2、演示
①.为什么之前支持负载均衡?
在微服务注册中心的笔记中,没有单独显示Ribbon的引用,同样能实现负载均衡
原因:之前我们在使用eureka注册中心的时候引入了如下的依赖:
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
通过Maven能够看到也引入了Ribbon

同样能够看到使用zookeeper和consul都有ribbon这个依赖


②开启负载均衡
开启负载均衡
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
③.RestTemplate
RestTemplate有两个方法:
getForObject或者getForEntity方法
postForObject或者postForEntity方法
ForObject和ForEntity的区别
ForObject返回为响应体中数据转化成的对象,可以理解为json
FoeEntity返回对象为ResponseEntity对象,包含响应中的一些重要信息,比如响应头,响应的状态码和响应体
一.ForObject(推荐这个)
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}

二.ForEntity
@GetMapping("/consumer/payment/getForEntity/{id}")
public CommonResult<Payment> getPayment2(@PathVariable("id") Long id){
ResponseEntity<CommonResult> entity =restTemplate.getForEntity(PAYMENT_URL+"/payment/get/"+id, CommonResult.class);
//成功
if (entity.getStatusCode().is2xxSuccessful()){
return entity.getBody();
}else {
return new CommonResult<>(444,"get fail");
}
}

3、负载均衡算法
①.算法有哪些
Rabbion负载均衡算法:
- (默认)RoundRobinRule(轮询)
- RandomRule(随机)
- RetryRule(按照RoundRobinRule即轮询获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务)
- WeightResponseTimeRule(对RoundRobinRule的拓展,响应速度越快的实例选择的权重越大)
- BestAvailableRule(过滤多次故障处于断路器跳闸状态的服务,然后选一个并非量最小的服务)
- AvailabilityFilteringRule(先过滤故障实例,然后选择并发量比较小的实例)
- ZoneAvoidanceRule(默认规则,复合判断server所在的区域的性能和server的可用性选择服务器)
- 1.RoundRobinRule
②.RoundRobinRule原理
负载均衡算法:
rest接口第几次条用数%服务器集群总数=实际的调用位置下标,每次服务重启动后rest接口计数从1开始
例:
总台数:2
List=2 instance
第一次调用:1%2 ---->index=1 list.get(Index)
第二次调用:2%2 ---->index=0 list.get(Index)
第三次调用:3%2 ---->index=1 list.get(Index)
4、替换默认负载均衡算法
自定义的配置类不能放在@ComponentScan所扫描的当前包下以及子包下
否则我们自定义的配置类会被所有Ribbon客户端共享(即多个调用服务会使用同一个IRule规则)
多个调用服务会使用同一个IRule规则:
比如order想要调用payment服务和user服务,调用payment使用轮询,调用user使用随机规则。这样就区分了Ribbon的负载均衡算法
解释:
Springboot启动类:在springcloud这个包下,其中一个注解@SpringBootApplication
如下图所示,@ComponentScan在是springclooud这个类下,所以我们的Ribbon配置类不能放在springcloud包及其子包内
上面的解释理清了Ribbon配置类的位置要求,下面编写配置类
1.关闭的Ribbon的负载均衡

2.新建myrule包,与springcloud包同级

3.编写配置类
@Configuration
public class MyselfRule {
@Bean
public IRule myRule(){
return new RandomRule();//随机规则
}
}
4.配置Client的负载均衡规则
修改启动类的注解
@SpringBootApplication
@EnableEurekaClient
//name 需要访问的微服务的名称 ,configuration为负载均衡规则的配置类
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MyselfRule.class)
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class,args);
}
}
RibbonCilent需要调用CLOUD-PAYMENT-SERVICE

测试:
经过5次调用,可以看到Ribbon的负载均衡算法从默认的轮询替换为了随机

Ribbon服务调用+负载均衡(入门)的更多相关文章
- Ribbon进行服务调用/负载均衡以及请求重试配置
Ribbon负载均衡 经过对Eureka的认识,及Eureka集群的搭建,已经基本可以入门Eureka的使用.之前对于服务调用者我们是直接获取注册列表后通过 get(0) 的方式来获取第一个注册信息. ...
- Spring Cloud入门教程-Ribbon实现客户端负载均衡
简介 我们继续以之前博客的代码为基础,增加Ribbon组件来提供客户端负载均衡.负载均衡是实现高并发.高性能.可伸缩服务的重要组成部分,它可以把请求分散到一个集群中不同的服务器中,以减轻每个服务器的负 ...
- 服务注册发现Eureka之三:Spring Cloud Ribbon实现客户端负载均衡(客户端负载均衡Ribbon之三:使用Ribbon实现客户端的均衡负载)
在使用RestTemplate来消费spring boot的Restful服务示例中,我们提到,调用spring boot服务的时候,需要将服务的URL写死或者是写在配置文件中,但这两种方式,无论哪一 ...
- 一起来学Spring Cloud | 第三章:服务消费者 (负载均衡Ribbon)
一.负载均衡的简介: 负载均衡是高可用架构的一个关键组件,主要用来提高性能和可用性,通过负载均衡将流量分发到多个服务器,多服务器能够消除单个服务器的故障,减轻单个服务器的访问压力. 1.服务端负载均衡 ...
- SpringCloud(4)---Ribbon服务调用,源码分析
SpringCloud(4)---Ribbon 本篇模拟订单服务调用商品服务,同时商品服务采用集群部署. 注册中心服务端口号7001,订单服务端口号9001,商品集群端口号:8001.8002.800 ...
- 撸一撸Spring Cloud Ribbon的原理-负载均衡策略
在前两篇<撸一撸Spring Cloud Ribbon的原理>,<撸一撸Spring Cloud Ribbon的原理-负载均衡器>中,整理了Ribbon如何通过负载均衡拦截器植 ...
- 搭建服务与负载均衡的客户端-Spring Cloud学习第二天(非原创)
文章大纲 一.Eureka中的核心概念二.Spring RestTemplate详解三.代码实战服务与负载均衡的客户端四.项目源码与参考资料下载五.参考文章 一.Eureka中的核心概念 1. 服务提 ...
- Spring Cloud(十四):Ribbon实现客户端负载均衡及其实现原理介绍
年后到现在一直很忙,都没什么时间记录东西了,其实之前工作中积累了很多知识点,一直都堆在备忘录里,只是因为近几个月经历了一些事情,没有太多的经历来写了,但是一些重要的东西,我还是希望能坚持记录下来.正好 ...
- Ribbon自带负载均衡策略
IRule这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例. AbstractLoadBalancerRuleAbstractLoadBalancerRule是一 ...
- SpringCloud与微服务Ⅶ --- Feign负载均衡
官方文档:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign 一.Feign是什么 Feign是一 ...
随机推荐
- hwlog----types.go
// Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved.// Package hwlog provides the ...
- 24、编写一个函数void replace(char *str1,char *str2,int i,int j),将字符串中str1中的第i个字符开始到j个字符结束的位置替换为str2.
/* 编写一个函数void replace(char *str1,char *str2,int i,int j),将字符串中str1中的第i个字符开始到j个字符结束的位置替换为str2. */ #in ...
- 为什么你的static_assert不能按预期的工作?
static_assert是c++11添加的新语法,它可以使我们在编译期间检测一些断言条件是否为真,如果不满足条件将会产生一条编译错误信息. 使用静态断言可以提前暴露许多问题到编译阶段,极大的方便了我 ...
- 9 STL-queue
重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要介绍S ...
- 读 RocketMQ 源码,学习并发编程三大神器
笔者是 RocketMQ 的忠实粉丝,在阅读源码的过程中,学习到了很多编程技巧. 这篇文章,笔者结合 RocketMQ 源码,分享并发编程三大神器的相关知识点. 1 CountDownLatch 实现 ...
- HCIE Routing&Switching之MPLS基础理论
技术背景 90年代初期,互联网流量快速增长,而由于当时硬件技术的限制,路由器采用最长匹配算法逐跳转发数据包,成为网络数据转发的瓶颈:于是快速路由技术成为当时研究的一个热点:在各种方案中,IETF确定了 ...
- audio解决不能自动播放问题
问题描述 无法实现打开网页就能自动播放音乐 正常情况下使用autoplay即可实现自动播放,但是现在打开网页该参数无效 原因分析: 根据最新的规范,Chrome系浏览器,没有交互过的网站默认禁止自动播 ...
- Tkinter根据屏幕分辨率最大化适应屏幕
还不能够实现所有组件随分辨率自动变化 # 实现的是界面覆盖整个屏幕 from tkinter import * import win32api, win32con # 获取屏幕的分辨率 width = ...
- Kafka教程(二)API开发-生产者、消费者、topic
一.地址 1.实时更新的思维导图 https://www.mubucm.com/doc/4uqlpedefuj 2.图片 二.具体内容 5.producer生产者 demo 发送pro.s ...
- EPSS 解读:与 CVSS 相比,孰美?
通用漏洞评分系统(CVSS)是当前应用最频繁的评分系统以评估安全漏洞的严重性.但是,由于该系统在评估漏洞和优先级排序方面存在不足而遭受批评.因此,有部分专业人士呼吁使用漏洞利用预测评分系统(EPSS) ...

