在使用Spring Cloud 的时候,都会用到Ribbon做负载均衡,使用Feign 简化web 服务调用,在使用的过程中,网络服务是不稳定,所有要设置超时时间,避免服务端响应慢影响调用的服务,网络可能偶尔不稳定,重试机制能增加成功的几率。处理超时机制的几个方式;如下
Ribbon 超时设置 1.全局设置,所有的ribbon客户端都会生效
?ribbon.ReadTimeout=2000 # 设置读取时间为2s ?ribbon.ConnnectTimeout=1000 #tcp建立连接的时间,内网一般设置1s以内
2.独立设置某个服务的ribbon调用超时时间
? ? 该设置会覆盖掉全局配置,servicename为调用服务在注册中心注册服务名称
?servicename.ribbon.ReadTimeout=2000 # 设置读取时间为2s ?servicename.ribbon.ConnnectTimeout=1000 #tcp建立连接的时间,内网一般设置1s以内
Ribbon 重试设置 1.需要引入spring的重试模块组件,否则配置不生效,这点一定要注意
<!-- ?RestTemplate Fegin ?Ribbon 调用重试需要引入次包 ? ? ? ? ? --> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>org.springframework.retry</groupId> ? ? ? ? ? ? <artifactId>spring-retry</artifactId> ? ? ? ? ? ? <version>1.3.0</version> ? ? ? ? </dependency>?
2.全局设置,这设置调用失败的话,当前服务重试一次,如果不成功,重试下一个服务一次
ribbon.OkToRetryOnAllOperations #对所有的操作都进行重试,默认是GET请求进行重试 ribbon.MaxAutoRetries=1 # 重试当前服务最大次数 ribbon.MaxAutoRetriesNextServer=1 #下一个服务的重试次数
3.独立设置某个服务的ribbon调用超时时间
? ? 该设置会覆盖掉全局配置,servicename为调用服务在注册中心注册服务名称
servicename.ribbon.OkToRetryOnAllOperations #对所有的操作都进行重试,默认是GET请求进行重试 ?servicename.ribbon.MaxAutoRetries=1 # 重试当前服务最大次数 ?servicename.MaxAutoRetriesNextServer=1 #下一个服务的重试次数?
Fegin整合Ribbon超时设置 1. 和ribbon设置超时配置一样
2.spring cloud 也对Feign 提供了其他配置方式,比如这里服务名称为 ?user-service ,不过这种方式设置超时,不能使用配置中心动态调整超时时间,这点需要特别注意。
? feign.client.config.user-service.read-timeout=2000 ? # 设置读取时间为2s? ? feign.client.config.user-service.connect-timeout=1000 #tcp连接超时时间1s以内? ? ?
Fegin整合Ribbon重试设置 1.和ribbon设置重试一样
Fegin不使用Ribbon超时设置 1.这里Feign 不在使用Ribbon负载均衡,直接通过url调用一些服务,比如通过nginx调用,FeignClient 配置必须要配置name,这里还是以user-service为例
? feign.client.config.user-service.read-timeout=2000 ? # 设置读取时间为2s? ? feign.client.config.user-service.connect-timeout=1000 #tcp连接超时时间1s以内? ? ?
Fegin不使用Ribbon重试设置 1.需要实现Retryer接口
public interface Retryer extends Cloneable { ? ? /** ? ?* if retry is permitted, return (possibly after sleeping). Otherwise propagate the exception. ? ?*/ ? void continueOrPropagate(RetryableException e); ? }
2.这里以使用Feign 的默认实现Default为例配置,这里使用bean的方式配置,这里配置 最大重试次次数是5次,最大重试时间1s,每次重试间隔100ms
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; ? import feign.Retryer; ? import static java.util.concurrent.TimeUnit.SECONDS; ? @Configuration public class AppConfig { ? ? ? ? ? @Bean ? ? public Retryer feignRetryer(){ ? ? ? ? ? return new Retryer.Default(1,SECONDS.toMillis(1), 5); ? ? } ? ? }
|