返回介绍

Ribbon配置

发布于 2024-08-18 11:12:34 字数 3090 浏览 0 评论 0 收藏 0

由于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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文