【云原生】springcloud08——Ribbon负载均衡调用

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 【云原生】springcloud08——Ribbon负载均衡调用

1.Ribbon介绍

这篇文章我们讲介绍负载均衡调用组件:Ribbon。

1.1 Ribbon简介

❤ Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。


组件官网:https://github.com/Netflix/ribbon


项目状态:维护ing,但是它很优秀,还没有很成熟的替代方案。


c2e04e4ad86f4e5f91e4ee4f123dba12.png

未来可能被Loadblancer替代。

image.png

1.2 Ribbon应用场景

image.png

2.环境准备

先恢复下Eureka集群环境。如下图,依次启动Eureka服务器7001,7002,支付微服务8001,8002,订单微服务80。

7246cfed64454282a656355454d4a524.png

测试下,http://localhost:7001/

image.png

http://localhost:7002/

image.png

3 Ribbon的负载均衡与Rest调用

3.1 工作原理

下图描述了Ribbon配合Eureka实现负载均衡的架构。

image.png


其工作原理如下。

2845577a21694faba0c88ec48f4dec82.png

3.2 Ribbon依赖引入

我们之前已经知道,我们访问订单微服务提供的接口时,其实已经采用轮询机制调用支付微服务端口8001,8002了

3c00e7e3622644cb916170eb36b78bc1.png

2f1b3cd57ecc4ded85cb964df63b5fed.png

但是我们可用在订单微服务80的pom文件中查找下,并引入没有ribbon的依赖。

实际上,这是因为我们引入netflix-eureka了,已经整合了ribbon。

 <!-- eureka-client -->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

不信您可用按住ctrl点进去看。

 <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
      <version>2.2.1.RELEASE</version>
      <scope>compile</scope>
 </dependency>

当然,你也可以自己加或者在和其它组件配合时使用,可以自己引入依赖。

3.3 RestTemplate

@LoadBalanced注解给RestTemplate开启负载均衡的能力。

官方文档:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html

723f15183ef94a1c8955362142ffa838.png

他的get请求有getForObject,getForEntity两种方法,前者可以理解返回json,后者包含响应一些重要信息:响应头、响应状态码、响应头等。post与get类似。

image.png

getForObject已经用过了,所以只测试getForEntity方法。

  @GetMapping("payment/getForEntity/{id}")
    public CommonResult getPaymentById2(@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, "操作失败");
        }
    }

73d81323cc1540bf9dd4063df77bc03a.png

entity还可以返回更多其他信息,比如头信息等,你可以自己看看其api摸索摸索自定义。

推荐使用object方式,因为返回json串是主流方式。

3.4 默认的负载均衡规则

ribbon的默认负载规则有七种。

45f4b975ff664715ac5c995440f9459b.png

解释如下。


5f429e7296194e3daed2e1b6113f444d.png

如何替换呢?先看看官网的这个提醒

013837ac1c0a49e2b09b26ba25c7a60a.png

🤞Ribbon的自定义配置类不可以放在@ComponentScan所扫描的当前包下以及子包下,否则这个自定义配置类就会被所有的Ribbon客户端共享,达不到为指定的Ribbon定制配置,而@SpringBootApplication注解里就有@ComponentScan注解,所以不可以放在主启动类所在的包下。(因为Ribbon是客户端(消费者)这边的,所以Ribbon的自定义配置类是在客户端(消费者)添加,不需要在提供者或注册中心添加)


为了让所有小兄弟都能够理解,我这边稍微解释下。点进主启动类.


f5277b75895f4c66b6817886d35a099c.png

点进SpringBootApplication,看到ComponentScan了么。


08465404381a40a58409585c2e694156.png

那就是说,Ribbon的配置类不可以放在com.wangzhou.springcloud这个包下了,而是需要另起炉灶。再新建一个myrule包。

6d6450dfc3bc487383930a9d79018232.png

自定义规则配置类。

@Configuration
public class MyselfRule {
    @Bean
    public IRule myRule() {
        return new RandomRule();
    }
}

在主启动类上添加@RibbonClient(name = “CLOUD-PAYMENT-SERVICE”, configuration = MyselfRule.class)name为指定的服务名(服务名必须与注册中心显示的服务名大小写一致)configuration为指定服务使用自定义配置(自定义负载均衡机制)


0c474430ac45433cac047273d7e1ac3f.png

测试:浏览器输入http://localhost/consumer/payment/get/1,多次刷新实现负载均衡为随机。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
14天前
|
负载均衡 算法 架构师
Ribbon负载均衡
上一节就已经实现的负载均衡笔者并未深入探讨,本节通过分析负载均衡算法、Ribbon实现负载均衡的底层原理和实现过程,让大家对负载均衡有了一个大体认识,同时针对Ribbon自定义负载均衡策略,饥饿加载让大家对于Ribbon的了解又多一些。Ribbon实现的负载均衡只是方案之一,我们可以尽量多了解但不要局限于此。
|
4天前
|
存储 设计模式 缓存
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
该文章主要介绍了如何在OpenFeign中集成Ribbon以实现负载均衡,并详细分析了Ribbon中服务选择和服务过滤的核心实现过程。文章还涉及了Ribbon中负载均衡器(ILoadBalancer)和负载均衡策略(IRule)的初始化方式。
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
|
4天前
|
缓存 负载均衡 Java
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
文章标题为“OpenFeign的Ribbon负载均衡详解”,是继OpenFeign十大可扩展组件讨论之后,深入探讨了Ribbon如何为OpenFeign提供负载均衡能力的详解。
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
|
22天前
|
负载均衡 算法 网络协议
Ribbon 负载均衡源码解读
Ribbon 负载均衡源码解读
41 15
Ribbon 负载均衡源码解读
|
22天前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
143 15
|
22天前
|
负载均衡 Java API
Feign 进行rpc 调用时使用ribbon负载均衡源码解析
Feign 进行rpc 调用时使用ribbon负载均衡源码解析
38 11
|
2月前
|
负载均衡 算法 Java
Spring Cloud Netflix 之 Ribbon
Spring Cloud Netflix Ribbon是客户端负载均衡器,用于在微服务架构中分发请求。它与RestTemplate结合,自动在服务发现(如Eureka)注册的服务之间进行调用。配置包括在pom.xml中添加依赖,设置application.yml以连接Eureka服务器,并在配置类中创建@LoadBalanced的RestTemplate。通过这种方式,当调用如`/user/userInfoList`的接口时,Ribbon会自动处理到多个可用服务实例的负载均衡。
|
2月前
|
负载均衡 算法 Java
Ribbon怎么实现的负载均衡
Ribbon怎么实现的负载均衡
18 0
|
2月前
|
负载均衡 算法 Nacos
SpringCloud之LoadBalancer自定义负载均衡算法,基于nacos权重
ReactorLoadBalancer接口,实现自定义负载算法需要实现该接口,并实现choose逻辑,选取对应的节点。
133 0
|
29天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14220 19