1、Ribbon

Ribbon中文:(用于捆绑或装饰的)带子; 丝带; 带状物;

主要功能是提供客户端的软件负载均衡算法服务调用

Ribbon已经进入了维护模式了,但是Ribbon仍然被广泛使用中

①.Nginx和Ribbon的区别

Nginx是服务器的负载均衡,客户端将所有请求给Nginx,Nginx实现转发。辅助均衡通过服务端实现。

而Ribbon是本地的负载均衡,在调用微服务的接口的时候,会在注册中心获取注册信息服务列表之后缓存到JVM,之后就在本地实现RPC调用了。

②.什么是Ribbon

负载均衡+restTemplate实现远程调用

Ribbon是一个软负载均衡客户端组件,可以和其他所需请求的客户端结合使用,比如Eureka......

③.Ribbon工作流程

  1. 选择EurekaServer,优先选一个负载较少的Server
  2. 根据用户指定的策略,从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有两个方法:

  1. getForObject或者getForEntity方法

  2. 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负载均衡算法:

  1. (默认)RoundRobinRule(轮询)
  2. RandomRule(随机)
  3. RetryRule(按照RoundRobinRule即轮询获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务)
  4. WeightResponseTimeRule(对RoundRobinRule的拓展,响应速度越快的实例选择的权重越大)
  5. BestAvailableRule(过滤多次故障处于断路器跳闸状态的服务,然后选一个并非量最小的服务)
  6. AvailabilityFilteringRule(先过滤故障实例,然后选择并发量比较小的实例)
  7. ZoneAvoidanceRule(默认规则,复合判断server所在的区域的性能和server的可用性选择服务器)
  8. 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的负载均衡算法从默认的轮询替换为了随机

最新文章

  1. angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation
  2. oracle 学习笔记2
  3. Angular从0到1:function(上)
  4. Jenkins配置MSBuild时使用环境变量
  5. IntelliJ IDEA 14 SVN无法正常使用问题
  6. Randomize select algorithm 随机选择算法
  7. 2.Add Two Numbers-两个单链表相加
  8. 手游 ui布局
  9. 使用 Bitbucket Pipelines 持续交付托管项目
  10. docker swarm集群搭建
  11. Java基础系列--集合之ArrayList
  12. 单元测试-unittest模块
  13. 电脑修改密码后git上传失败Authentication failed
  14. python六十四课——高阶函数练习题(三)
  15. KeepAlived+Nginx 安装
  16. 2017-2018-2 20155314《网络对抗技术》Exp3 免杀原理与实践
  17. 2018.11.17 hdu5829Rikka with Subset(ntt)
  18. android 内存分哪些区
  19. excel weekday
  20. LCT(link cut tree) 动态树

热门文章

  1. Redis 常见问题
  2. Day22:多态详解
  3. PyTorch Geometric Temporal 介绍 —— 数据结构和RGCN的概念
  4. easyui combobox的级联设置
  5. js 获取相同name元素的属性值
  6. WPF中的“资源”
  7. pycharm 小技巧
  8. python运算符与基本数据类型
  9. 【爬虫+数据分析+数据可视化】python数据分析全流程《2021胡润百富榜》榜单数据!
  10. Typora + PicGo + B2 Cloud Storage 实现个人免费图床