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的负载均衡算法从默认的轮询替换为了随机

Ribbon服务调用+负载均衡(入门)的更多相关文章

  1. Ribbon进行服务调用/负载均衡以及请求重试配置

    Ribbon负载均衡 经过对Eureka的认识,及Eureka集群的搭建,已经基本可以入门Eureka的使用.之前对于服务调用者我们是直接获取注册列表后通过 get(0) 的方式来获取第一个注册信息. ...

  2. Spring Cloud入门教程-Ribbon实现客户端负载均衡

    简介 我们继续以之前博客的代码为基础,增加Ribbon组件来提供客户端负载均衡.负载均衡是实现高并发.高性能.可伸缩服务的重要组成部分,它可以把请求分散到一个集群中不同的服务器中,以减轻每个服务器的负 ...

  3. 服务注册发现Eureka之三:Spring Cloud Ribbon实现客户端负载均衡(客户端负载均衡Ribbon之三:使用Ribbon实现客户端的均衡负载)

    在使用RestTemplate来消费spring boot的Restful服务示例中,我们提到,调用spring boot服务的时候,需要将服务的URL写死或者是写在配置文件中,但这两种方式,无论哪一 ...

  4. 一起来学Spring Cloud | 第三章:服务消费者 (负载均衡Ribbon)

    一.负载均衡的简介: 负载均衡是高可用架构的一个关键组件,主要用来提高性能和可用性,通过负载均衡将流量分发到多个服务器,多服务器能够消除单个服务器的故障,减轻单个服务器的访问压力. 1.服务端负载均衡 ...

  5. SpringCloud(4)---Ribbon服务调用,源码分析

    SpringCloud(4)---Ribbon 本篇模拟订单服务调用商品服务,同时商品服务采用集群部署. 注册中心服务端口号7001,订单服务端口号9001,商品集群端口号:8001.8002.800 ...

  6. 撸一撸Spring Cloud Ribbon的原理-负载均衡策略

    在前两篇<撸一撸Spring Cloud Ribbon的原理>,<撸一撸Spring Cloud Ribbon的原理-负载均衡器>中,整理了Ribbon如何通过负载均衡拦截器植 ...

  7. 搭建服务与负载均衡的客户端-Spring Cloud学习第二天(非原创)

    文章大纲 一.Eureka中的核心概念二.Spring RestTemplate详解三.代码实战服务与负载均衡的客户端四.项目源码与参考资料下载五.参考文章 一.Eureka中的核心概念 1. 服务提 ...

  8. Spring Cloud(十四):Ribbon实现客户端负载均衡及其实现原理介绍

    年后到现在一直很忙,都没什么时间记录东西了,其实之前工作中积累了很多知识点,一直都堆在备忘录里,只是因为近几个月经历了一些事情,没有太多的经历来写了,但是一些重要的东西,我还是希望能坚持记录下来.正好 ...

  9. Ribbon自带负载均衡策略

    IRule这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例. AbstractLoadBalancerRuleAbstractLoadBalancerRule是一 ...

  10. SpringCloud与微服务Ⅶ --- Feign负载均衡

    官方文档:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign 一.Feign是什么 Feign是一 ...

随机推荐

  1. 篇(16)-Asp.Net Core入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证二)

    入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证二) (1).在用户管理着模块中,相比较菜单功能的代码还是比较多的,设计到用户的创建,修改,角色变更和密码重置,同时都集中在列表 ...

  2. 如何利用C++使Windows蓝屏

    如何利用C++使Windows蓝屏 虽说windows非常强大,但是使它蓝屏也非常简单: 如果你想让Windows蓝屏,你一定会在运行框里输入: cmd /c for /f %I in ('wmic ...

  3. updog:一款局域网传输文件的软件

    前言 不知道你是否有过这样 的需求,在局域网传输文件,苦于没有好的软件支持,或者只能单向传输,updog可以完全解决这种问题 安装 pip3 install updog updog是python中的一 ...

  4. linux 挂载 vdi 文件(virtual box虚拟机镜像文件)

    1. 下载 vdfuse 下载地址 2.解压deb文件 解压deb安装包文件,这里不使用安装命令是因为你的virtualbox 可能和vdfuse的版本不一致,导致安装失败,而我们只需要用到 vdfu ...

  5. MISC图片批量处理jio本

    此处以ctfshow中MISC入门题目作为切入点 感兴趣的同学可以一边做题一边参照 批量修改PNG图片的宽 import zlib import struct filename = "fla ...

  6. Python函数/动态参数/关键字参数

    1.函数 #函数语法: #函数名规范:小谢字母开头,不同字母下划线隔开(字母数字下划线) #def 函数名(): #函数体:希望函数做的事情 1.1.无参函数 #无参函数 def music(): p ...

  7. flutter系列之:移动端手势的具体使用

    目录 简介 赋予widget可以点击的功能 会动的组件 可删除的组件 总结 简介 之前我们介绍了GestureDetector的定义和其提供的一些基本的方法,GestureDetector的好处就是可 ...

  8. PowerDotNet平台化软件架构设计与实现系列(14):平台建设指南

    软件开发中常见的几种不同服务模型包括SaaS(软件即服务).LaaS(许可即服务).PaaS(平台即服务).CaaS(容器即服务).IaaS(基础设施即服务)和FaaS(功能即服务). 很多人认为Ia ...

  9. 正则提取器和beanshell处理器组合,将提取的所有id拼接成字符串

    1.添加正则表达式,提取所有id值 2.添加beanshell处理器将所有的id值拼接成字符串 方法一: int N = Integer.parseInt(vars.get("build_m ...

  10. 在CentOS8中安装gitlab

    安装 docker 及 docker-compose centos8 更新源 cd /etc/yum.repos.d/ sed -i 's/mirrorlist/#mirrorlist/g' /etc ...