文章目录
系列链接:
- GitHub:源码
- SpringCloud(1)–入门、版本、环境搭建
- SpringCloud(2)–服务注册与发现(Eureka、Zookeeper、Consul)
- SpringCloud(3)–服务调用(Ribbon、OpenFeign)
- SpringCloud(4)–服务降级(Hystrix、降级、熔断、监控)
- SpringCloud(5)–服务网关(GateWay)
- …
服务调用
Ribbon
Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端,主要功能是提供客户端的软件负载均衡算法和服务调用。
注:Ribbon虽然大规模运用,但目前也进入维护,基本上不准备更新了
负载均衡:将用户的请求平摊的分配到多个服务上,常见的负载均衡软件有Nginx等。
Ribbon本地负载均衡客户端与Nginx服务端负载均衡的区别:
-
Nginx是服务器负载均衡,客户端所有请求交给 Nginx,然后由 Nginx 实现转发请求。
-
Ribbon是本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到 JVM 本地,从而在本地实现 RPC 远程服务调用技术。
由上面的区别可以将负载均衡分为两种:
- 集中式LB:在服务的消费方和提供方之间使用独立的LB设施(Nginx)
- 进程内LB:将LB的逻辑继承到消费方,消费方从服务注册中心获知哪些提供方地址可用,然后自己进行选择(Ribbon)
Ribbon就是一个软负载均衡的客户端组件,就是负载均衡+RestTemplate调用,与Eureka结合的架构如下:
Ribbon的使用
-
我们之前实现了负载均衡就是基于 Ribbon,其实在使用eureka的新版本时,默认就集成了Ribbon。
<!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
RestTemplate类
- xxxForObject()方法:返回的是响应体中的数据
- xxxForEntity()方法:返回的是entity对象,包含响应体数据、响应体信息(状态码等)
Ribbon常用负载均衡算法
Riboon使用 IRule 接口,根据特定算法从所有服务中,选择一个服务。而I Rule 接口有7个实现类。每个实现类代表一个负载均衡算法:
- com.netflix.loadbalancer.RoundRobinRule:轮询
- com.netflix.loadbalancer.RandomRule:随机
- com.netflix.loadbalancer.RetryRule:先轮询,失败则在指定时间内进行重试
- WeightedResponseTimeRule:对轮询的扩展,响应速度越快权重越大
- BestAvailableRule:先过滤处于断路状态的服务,选择一个并发量最小的服务
- AvailabilityFilteringRule:先过滤故障实例,再选择并发较小的实例
- ZoneAvoidanceRule:默认规则,根据Server所在区域的性能和可用性选择服务器。
修改Order模块
有两点需要注意:
-
这里使用 Eureka 的相关服务
-
IRule 自定义配置类不能放在@ComponentScan所扫描的当前包以及子包下
(有@SpringBootApplication注解的Main所在的包)
-
额外创建一个包
-
创建配置类,指定负载均衡算法
@Configuration public class MySelfRule { @Bean public IRule myRule(){ return new RandomRule();//随机负载均衡算法 } }
-
在主启动类上加@RibbonClient注解,表示访问CLOUD-PAYMENT-SERVICE服务时,使用我们自定义的负载均衡算法