- 推荐序一
- 推荐序二
- 推荐序三
- 推荐语
- 前言
- 第1章 基础知识
- 第2章 微服务构建:Spring Boot
- 第3章 服务治理:Spring Cloud Eureka
- 第4章 客户端负载均衡:Spring Cloud Ribbon
- 第5章 服务容错保护:Spring Cloud Hystrix
- 第6章 声明式服务调用:Spring Cloud Feign
- 第7章 API网关服务:Spring Cloud Zuul
- 第8章 分布式配置中心:Spring Cloud Config
- 第9章 消息总线:Spring Cloud Bus
- 第10章 消息驱动的微服务:Spring Cloud Stream
- 附录 A Starter POMs
- 后记
Ribbon配置
由于Spring Cloud Feign的客户端负载均衡是通过Spring Cloud Ribbon实现的,所以我们可以直接通过配置Ribbon客户端的方式来自定义各个服务客户端调用的参数。那么我们如何在使用Spring Cloud Feign的工程中使用Ribbon的配置呢?
全局配置
全局配置的方法非常简单,我们可以直接使用ribbon.<key>=<value>的方式来设置ribbon的各项默认参数。比如,修改默认的客户端调用超时时间:
ribbon.ConnectTimeout=500
ribbon.ReadTimeout=5000
指定服务配置
大多数情况下,我们对于服务调用的超时时间可能会根据实际服务的特性做一些调整,所以仅仅依靠默认的全局配置是不行的。在使用Spring Cloud Feign的时候,针对各个服务客户端进行个性化配置的方式与使用Spring Cloud Ribbon时的配置方式是一样的,都采用<client>.ribbon.key=value 的格式进行设置。但是,这里就有一个疑问了,<client>所指代的Ribbon客户端在哪里呢?
回想一下,在定义Feign客户端的时候,我们使用了@FeignClient注解。在初始化过程中,Spring Cloud Feign会根据该注解的name属性或value属性指定的服务名,自动创建一个同名的Ribbon客户端。也就是说,在之前的示例中,使用@FeignClient(value="HELLO-SERVICE")来创建 Feign 客户端的时候,同时也创建了一个名为HELLO-SERVICE的Ribbon客户端。既然如此,我们就可以使用@FeignClient注解中的name或value属性值来设置对应的Ribbon参数,比如:
HELLO-SERVICE.ribbon.ConnectTimeout=500
HELLO-SERVICE.ribbon.ReadTimeout=2000
HELLO-SERVICE.ribbon.OkToRetryOnAllOperations=true
HELLO-SERVICE.ribbon.MaxAutoRetriesNextServer=2
HELLO-SERVICE.ribbon.MaxAutoRetries=1
重试机制
在 Spring Cloud Feign 中默认实现了请求的重试机制,而上面我们对于HELLO-SERVICE客户端的配置内容就是对于请求超时以及重试机制配置的详情,具体内容可参考第4章最后一节关于Spring Cloud Ribbon重试机制的介绍。我们可以通过修改之前的示例做一些验证。
- 在hello-service应用的/hello接口实现中,增加一些随机延迟,比如:
@RequestMapping(value="/hello",method=RequestMethod.GET)
public String hello()throws Exception {
ServiceInstance instance=client.getLocalServiceInstance() ;
//测试超时
int sleepTime=new Random().nextInt(3000);
logger.info("sleepTime:"+sleepTime);
Thread.sleep(sleepTime);
logger.info("/hello,host:"+instance.getHost()+",service_id:"+
instance.getServiceId());
return "Hello World";
}
- 在feign-consumer应用中增加上文中提到的重试配置参数。其中,由于HELLOSERVICE.ribbon.MaxAutoRetries设置为1,所以重试策略先尝试访问首选实例一次,失败后才更换实例访问,而更换实例访问的次数通过 HELLO-SERVICE.ribbon.MaxAutoRetriesNextServer 参数设置为2,所以会尝试更换两次实例进行重试。
- 最后,启动这些应用,并尝试访问几次http://localhost:9001/feignconsumer接口。当请求发生超时的时候,我们在hello-service的控制台中可能会获得如下输出内容(由于sleepTime的随机性,并不一定每次相同):
INFO 19264---[nio-8001-exec-6]com.didispace.web.HelloController :sleepTime:2929
INFO 19264---[nio-8001-exec-7]com.didispace.web.HelloController : sleepTime:253
INFO 19264---[nio-8001-exec-7]com.didispace.web.HelloController : /hello,host:
192.168.0.105,service_id:hello-service
INFO 19264---[nio-8001-exec-6]com.didispace.web.HelloController : /hello,host:
192.168.0.105,service_id:hello-service
从控制台输出中,我们可以看到这次访问的第一次请求延迟时间为2929毫秒,由于超时时间设置为2000毫秒,Feign客户端发起了重试,第二次请求的延迟为253秒,没有超时。Feign客户端在进行服务调用时,虽然经历了一次失败,但是通过重试机制,最终还是获得了请求结果。所以,对于重试机制的实现,对于构建高可用的服务集群来说非常重要,而Spring Cloud Feign也为其提供了足够的支持。
这里需要注意一点,Ribbon 的超时与 Hystrix 的超时是两个概念。为了让上述实现有效,我们需要让Hystrix的超时时间大于Ribbon的超时时间,否则Hystrix命令超时后,该命令直接熔断,重试机制就没有任何意义了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论