我们使用Spring Cloud Ribbon实现客户端负载均衡的时候,通常都会利用@LoadBalanced
来让RestTemplate具备客户端负载功能,从而实现面向服务名的接口访问。
下面的例子,实现了对服务名为hello-service的/hello接口的调用。由于RestTemplate被@LoadBalanced
修饰,所以它具备客户端负载均衡的能力,当请求真正发起的时候,url中的服务名会根据负载均衡策略从服务清单中挑选出一个实例来进行访问。
大多数情况下,上面的实现没有任何问题,但是总有一些意外发生,比如:有一个实例发生了故障而该情况还没有被服务治理机制及时的发现和摘除,这时候客户端访问该节点的时候自然会失败。所以,为了构建更为健壮的应用系统,我们希望当请求失败的时候能够有一定策略的重试机制,而不是直接返回失败。这个时候就需要开发人员人工的来为上面的RestTemplate调用实现重试机制。
不过,从Spring Cloud Camden SR2版本开始,我们就不用那么麻烦了。从该版本开始,Spring Cloud整合了Spring Retry来实现重试逻辑,而对于开发者只需要做一些配置即可。
以上面对hello-service服务的调用为例,我们可以在配置文件中增加如下内容:
spring.cloud.loadbalancer.retry.enabled
该参数用来开启重试机制,它默认是关闭的。这里需要注意,官方文档中的配置参数少了enabled。
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
断路器的超时时间需要大于ribbon的超时时间,不然不会触发重试。
ribbon.ConnectTimeout
请求连接的超时时间
ribbon.ReadTimeout
请求处理的超时时间
ribbon.OkToRetryOnAllOperations
对所有操作请求都进行重试
ribbon.MaxAutoRetriesNextServer
切换实例的重试次数
ribbon.MaxAutoRetries
对当前实例的重试次数
根据如上配置,当访问到故障请求的时候,它会再尝试访问一次当前实例,如果不行,就换一个实例进行访问,如果还是不行,再换一次实例访问,如果依然不行,返回失败信息。