前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 ☕专栏简介:深入、全面、系统的介绍springcloud与springcloud Alibaba微服务常用技术栈 🌰 文章简介:本文将介绍Ribbon负载均衡调用,建议收藏备用,创作不易,敬请三连哦 🥒文章推荐: 微服务架构与springcloud 01——微服务入门 微服务架构与springcloud02——父工程构建及支付模块实现 微服务架构与springcloud03——项目热部署与消费者订单模块 微服务架构与springcloud04——Eureka服务注册与发现 springcloud05——Zookeeper实现支付微服务 【云原生】springcloud06——订单服务注册zookeeper 【云原生】springcloud07—Consul的服务注册与发现 大厂面试真题|面经
这篇文章我们讲介绍负载均衡调用组件: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替代。
Ribbon主要应用于负载均衡,配合RestTemplate实现RPC的远程调用。
先恢复下Eureka集群环境。如下图,依次启动Eureka服务器7001,7002,支付微服务8001,8002,订单微服务80。
测试下,http://localhost:7001/
http://localhost:7002/
下图描述了Ribbon配合Eureka实现负载均衡的架构。
其工作原理如下。
我们之前已经知道,我们访问订单微服务提供的接口时,其实已经采用轮询机制调用支付微服务端口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>
当然,你也可以自己加或者在和其它组件配合时使用,可以自己引入依赖。
@LoadBalanced注解给RestTemplate开启负载均衡的能力。
他的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串是主流方式。
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,多次刷新实现负载均衡为随机。