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

简介: 【云原生】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,多次刷新实现负载均衡为随机。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3天前
|
缓存 负载均衡 算法
【微服务 SpringCloud】实用篇 · Ribbon负载均衡
【微服务 SpringCloud】实用篇 · Ribbon负载均衡
11 0
|
3天前
|
负载均衡 算法 Java
Ribbon自定义负载均衡算法
Ribbon自定义负载均衡算法
16 1
|
3天前
|
负载均衡
Ribbon负载均衡策略
Ribbon负载均衡策略
|
3天前
|
负载均衡 算法
SpringCloud&Ribbon负载均衡原理与实践
SpringCloud&Ribbon负载均衡原理与实践
20 3
|
3天前
|
负载均衡 算法 Java
第五章 Spring Cloud Netflix 之 Ribbon
第五章 Spring Cloud Netflix 之 Ribbon
21 0
|
3天前
|
Java Nacos Sentinel
Spring Cloud Alibaba 面试题及答案整理,最新面试题
Spring Cloud Alibaba 面试题及答案整理,最新面试题
255 0
|
3天前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
204 0
|
3天前
|
Java API Nacos
第十二章 Spring Cloud Alibaba Sentinel
第十二章 Spring Cloud Alibaba Sentinel
30 0
|
3天前
|
存储 前端开发 Java
第十一章 Spring Cloud Alibaba nacos配置中心
第十一章 Spring Cloud Alibaba nacos配置中心
29 0
|
3天前
|
消息中间件 SpringCloudAlibaba Java
第十章 SpringCloud Alibaba 之 Nacos discovery
第十章 SpringCloud Alibaba 之 Nacos discovery
10 0

热门文章

最新文章