Ribbon负载均衡服务调用
8. Ribbon负载均衡服务调用
概述
是什么
Spring Cloud Ribbon是基于Netfilx Ribbon实现的一套客户端 负载均衡的工具。
一句话,所谓ribbon就是负载均衡+RestTemplate调用
官网
https://github.com/Netflix/ribbon
ribbon已经进入维护状态,但ribbon比较优秀,仍在大规模使用,短时间内不会被替换掉
能干嘛
负载均衡概述:
LB即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。
负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)
常见的负载均衡软件有Nginx,Lvs等
dubbo、SpringCloud中均给我们提供了负载均衡,Springcloud的负载均衡算法可以自定义
Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡的区别
负载均衡简单分类:
集中式LB
进程式LB
Ribbon负载均衡演示
架构说明:
Ribbon其实就是一个软 负载均衡的客户端组件,
它可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。
架构图
ribbon在工作时分两步
其中,Ribbon提供了多种策略,比如:轮询、随机和根据相应时间加权。
第一步,先选择EurekaServer,它优先选择在同一个区域内负载较少的server
POM
ribbon的依赖 spring-cloud-starter-netfilx-ribbon 是不用引的
因为之前引的netfilx-eureka-client里面已经包含了ribbon的内容
二说RestTemplate
getForObject / getForEntity
postForObject / postForEntity
getForObect和getForEntity的区别
getForObject 用的比较多
返回对象为响应体中数据转化成的对象,基本可以理解为返回了个Json
以consumer80中的OrderController为例
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id)
{
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}getForEntity
返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等。
以consumer80中的OrderController为例
@GetMapping("/consumer/payment/getForEntity/{id}")
public CommonResult<Payment> getPayment2(@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,"操作失败");
}
}小结:两种的返回结果是一样的,
如果只用一个json串,就用getForObject,
如果想返回更多内容,可以用getForEntiry,
但是目前直接返回一个 json串是用的比较多。
Ribbon核心组件IRule
IRule:根据特定算法 从服务列表找那个选取一个要访问的服务
默认是轮询
如何替换
前提:在前面的5.3eureka集群搭建里把负载均衡的注解@LoadBalanced写上,这样就可以通过80同时调用多个 微服务了(支付模块8001,8002)
修改cloud-consumer-order80
注意配置细节
官方文档明确给出了警告:
这个自定义配置类不能放在@ComponentScan所扫描的当前包及子包下
否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,达不到特定化定制的目的了。
进入80的主程序类的@SpringBootApplication,可以看到@ComponentScan注解,
也就是说不能放在主启动类所在的springcloud包及其子包下。
新建package及新建规则类
com.woxueit.myrule MySelfRule.java
@Configuration
public class MySelfRule
{
@Bean
public IRule myRule()
{
return new RandomRule();//定义为随机
}
}主启动 OrderMain80 ------->>>>加上@RibbonClient
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration=MySelfRule.class)测试------------------->默认是轮询,我们给改成了随机
启动8001、8002,order80
localhost/consumer/payment/get/1
端口号8001和8002随机出现
补充:最好还是改回ribbon默认的轮询,将@RibbonClient注释掉
//@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration=MySelfRule.class)
至此,就完成了ribbon项目的初步构建
注:未完待续,敬请期待 Ribbon负载均衡服务调用(下)
往期干货推荐
1.
2.
3.
4.
5.
转自网络,侵删
点在看的你真好看