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应用场景
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开启负载均衡的能力。
他的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,多次刷新实现负载均衡为随机。