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

在这里插入图片描述

前 言
🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端
☕专栏简介:深入、全面、系统的介绍springcloud与springcloud Alibaba微服务常用技术栈
🌰 文章简介:本文将介绍Ribbon负载均衡调用,建议收藏备用,创作不易,敬请三连哦
🥒文章推荐:
微服务架构与springcloud 01——微服务入门
微服务架构与springcloud02——父工程构建及支付模块实现
微服务架构与springcloud03——项目热部署与消费者订单模块
微服务架构与springcloud04——Eureka服务注册与发现
springcloud05——Zookeeper实现支付微服务
【云原生】springcloud06——订单服务注册zookeeper
【云原生】springcloud07—Consul的服务注册与发现
大厂面试真题|面经

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,但是它很优秀,还没有很成熟的替代方案。
在这里插入图片描述
未来可能被Loadblancer替代。
在这里插入图片描述

1.2 Ribbon应用场景

Ribbon主要应用于负载均衡,配合RestTemplate实现RPC的远程调用。
在这里插入图片描述

2.环境准备

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

在这里插入图片描述

测试下,http://localhost:7001/
在这里插入图片描述
http://localhost:7002/
在这里插入图片描述

3 Ribbon的负载均衡与Rest调用

3.1 工作原理

下图描述了Ribbon配合Eureka实现负载均衡的架构。
在这里插入图片描述
其工作原理如下。
在这里插入图片描述

3.2 Ribbon依赖引入

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

但是我们可用在订单微服务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

在这里插入图片描述

他的get请求有getForObject,getForEntity两种方法,前者可以理解返回json,后者包含响应一些重要信息:响应头、响应状态码、响应头等。post与get类似。
在这里插入图片描述
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, "操作失败");
        }
    }

在这里插入图片描述

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

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

3.4 默认的负载均衡规则

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

在这里插入图片描述

解释如下。
在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述
点进SpringBootApplication,看到ComponentScan了么。

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

在这里插入图片描述

自定义规则配置类。

@Configuration
public class MyselfRule {

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

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

在这里插入图片描述
测试:浏览器输入http://localhost/consumer/payment/get/1,多次刷新实现负载均衡为随机。

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半旧518

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值