SpringCloud知识点梳理 - 2.服务调用与服务负载均衡组件之Ribbon组件

微服务调用概述

所谓微服务其实就是把原本项目的各个模块拆分成一个个独立的服务,
通过拆分出的服务去暴露http rest接口,微服务的调用就是这些http rest接口之间的调用。

spring cloud提供了三种微服务的调用方式

1.基于RestTemplate的服务调用;
2.基于Ribbon的服务调用;
3.基于open feign的服务调用;

1.基于RestTemplate的服务调用

0.说明

Spring框架提供的RestTemplate类可用于在应用中调用rest服务,
它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接,
我们只需要传入URL以及返回值类型即可。

相较于之前Apache的httpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。

创建两个服务(商品服务、用户服务)并注册到注册中心
下图以product服务为例,注册中心为consul 在这里插入图片描述
商品服务中接口如下图:
在这里插入图片描述用户服务接口如下图,此接口的作用是调用商品服务
在这里插入图片描述如上图,基于RestTemplate的服务调用是在调用方接口直接new一个RestTemple对象,通过RestTemple的getObject方法获取返回。

PS:
商品服务中的接口注解为getMapping,所以此处用getObject,
若商品服务中的接口注解为postMapping,则应用postObject方法。

用户服务调用商品服务成功
在这里插入图片描述总结

RestTemple是直接基于服务地址的调用,通过点对点的方式调用服务;
被调用的URL是一个写死的固定字符串,没有通过服务注册中心获取服务;
因此当服务器宕机时,不能做到高效剔除;
也没办法实现服务的负载均衡,如果需要实现负载均衡,就要自己手动书写负载均衡策略。

负载均衡:

所谓负载均衡,就是把负载均分。
在分布式架构中,我们通常要保证微服务是高可用的,
要保证高可用,就不能把鸡蛋放在一个篮子里,即服务只部署在一台服务器上,
否则万一服务器宕机整个微服务就完全不可用了。
因此在微服务分布式架构中,我们通常把微服务部署在大于1台服务器上,
保证就算有部分服务器宕机,该服务也不会变得完全不可用。

2.基于Ribbon的服务调用

0.说明

Spring Cloud Ribbon是一个基于http和TCP的客户端负载均衡工具,它基于NetFix Ribbon实现。

通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模板请求自动转换成客户端负载均衡的调用。

通过Ribbon可以去注册中心中拿指定服务的服务列表,
如用户调用商品服务,就可以去注册中心去拿商品服务的所有可用服务器列表,返回到客户端,
再根据指定的负载均衡算法去决定请求打到哪一台服务器上

Spring Cloud Ribbon的调用方式有三种:

①DiscoverClient;
②LoadBalanceClient;
③@LoadBalance

①.DiscoverClient
在这里插入图片描述此时启动用户与商品服务,让用户服务区调用商品服务findAllProduct接口
在这里插入图片描述DiscoverClient调用方式总结

通过这种方式,可以根据服务名拉取可用端口列表,而后书写负载均衡策略。

相对于RestTemple,这种方式应用了注册中心,可以做到高可用,

缺点是负载均衡策略仍然需要自己手动书写。

②.LoadBalanceClient
在这里插入图片描述
返回负载均衡后的端口,默认负载均衡策略是轮询策略
在这里插入图片描述因此调用方式可写成:
在这里插入图片描述LoadBalanceClient总结

这种方式可以通过注册中心实现高可用,也可以实现负载均衡。

默认负载均衡策略是轮询策略

缺点是每次都需要拿serviceInstance对象choose一下服务,再自己拼接URL,比较麻烦。

能不能只写一个服务,自动帮我们实现负载均衡去调用?

—第3种方式应运而生

③.@LoadBalance + RestTemple
在服务的调用方写一段配置,@LoadBalance指明这是一个班Ribbon组件。
在这里插入图片描述在这里插入图片描述在这里插入图片描述@LoadBalance + RestTemple总结

LoadBalance + RestTemple方式通过服务名去注册中心拿到可用端口列表,
返回实现了负载均衡的可用端口,调用时一行代码即可搞定,
是实际开发中大多数项目会采用的方式。

Ribbon的负载均衡策略

1.RoundRobinRule 轮询策略,按顺序循环选择  

RoundRobinRule 源码:
在这里插入图片描述
在这里插入图片描述

2.RandomRule 随机策略

3.AvailabilityFilterRule 可用过滤策略
会先过滤由于多次访问故障而处于断路器跳闸状态的服务,
还有并发的连接数量超过阈值的服务,然后对剩余服务按照轮询策略进行访问。

4.WeightedResponseTimeRule 响应时间加权策略
根据平均响应的时间计算所有服务的权重,响应时间越快服务权重越大,
被选中的概率越高,刚启动时若统计信息不足,则使用RoundRobinRule 策略,
等统计信息足够会切换到WeightedResponseTimeRule.

5.RetryRule 重试策略
先按照RoundRobinRule获取服务,若过去失败则在指定的时间内进行重试,获取可用的服务。

6.BestAvailableRule 最低并发策略
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择并发量最小的服务。

在这里插入图片描述
修改服务默认负载均衡策略

写在调用方:
服务id.ribbom.NFLoadBalancerRuleClassName=(负载均衡策略全限定名)

eg:以上例子用户调用商品服务时修改为随机负载均衡策略

写在用户的配置文件中:
products.ribbom.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

Spring Cloud Ribbon之调用方式总结

上述Ribbon +RestTemplate是应用层面很广的一种微服务调用方式,能够比较方便地进行微服务之间的自由调用。

但在开发中我们发现,这种调用方式仍有一定缺点:
①若要调用一个服务,就需要把地址耦合进代码中,在这个地址需要被修改时,就需要逐个修改代码;
②在不同地方调用时都需要把同样的代码再写一遍。

基于以上问题,我们还可以选择第三种方式 ---- Open Feign。

Open Feign是NetFlix的开源组件中的一个可插拔式组件,它底层继承了ribbon,
解决了ribbon使用时不够灵活的问题

具体信息见下一章。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值