为什么80%的码农都做不了架构师?>>>   

##序 ribbon的超时设置,只能按转发的serviceId来分的,无法像nginx那样直接在每个转发的链接里头设置超时时间。这里hack一下,实现url基本的ribbon超时时间设置。具体的思路就是重写RibbonApacheHttpRequest的toRequest方法,然后进行设置。

##CustomRibbonApacheHttpRequest

public class CustomRibbonApacheHttpRequest extends RibbonApacheHttpRequest {public CustomRibbonApacheHttpRequest(RibbonCommandContext context) {super(context);}@Overridepublic HttpUriRequest toRequest(RequestConfig requestConfig) {final RequestBuilder builder = RequestBuilder.create(this.context.getMethod());builder.setUri(this.uri);for (final String name : this.context.getHeaders().keySet()) {final List<String> values = this.context.getHeaders().get(name);for (final String value : values) {builder.addHeader(name, value);}}for (final String name : this.context.getParams().keySet()) {final List<String> values = this.context.getParams().get(name);for (final String value : values) {builder.addParameter(name, value);}}if (this.context.getRequestEntity() != null) {final BasicHttpEntity entity;entity = new BasicHttpEntity();entity.setContent(this.context.getRequestEntity());// if the entity contentLength isn't set, transfer-encoding will be set// to chunked in org.apache.http.protocol.RequestContent. See gh-1042if (this.context.getContentLength() != null) {entity.setContentLength(this.context.getContentLength());} else if ("GET".equals(this.context.getMethod())) {entity.setContentLength(0);}builder.setEntity(entity);}customize(this.context.getRequestCustomizers(), builder);//todo 这里处理个性的timeout信息if(uri.getPath().equals("/review/timeout")){RequestConfig.Builder configBuilder = RequestConfig.copy(builder.getConfig());configBuilder.setConnectionRequestTimeout(30*1000);configBuilder.setConnectTimeout(30*1000);configBuilder.setSocketTimeout(30*1000);builder.setConfig(configBuilder.build());}else{builder.setConfig(requestConfig);}return builder.build();}
}

##CustomHttpClientRibbonCommand

public class CustomHttpClientRibbonCommand extends HttpClientRibbonCommand {public CustomHttpClientRibbonCommand(String commandKey, RibbonLoadBalancingHttpClient client, RibbonCommandContext context, ZuulProperties zuulProperties) {super(commandKey, client, context, zuulProperties);}public CustomHttpClientRibbonCommand(String commandKey, RibbonLoadBalancingHttpClient client, RibbonCommandContext context, ZuulProperties zuulProperties, ZuulFallbackProvider zuulFallbackProvider) {super(commandKey, client, context, zuulProperties, zuulFallbackProvider);}@Overrideprotected RibbonApacheHttpRequest createRequest() throws Exception {RibbonApacheHttpRequest ribbonApacheHttpRequest = new CustomRibbonApacheHttpRequest(this.context);return ribbonApacheHttpRequest;}
}

##CustomHttpClientRibbonCommandFactory

public class CustomHttpClientRibbonCommandFactory extends HttpClientRibbonCommandFactory{private final SpringClientFactory clientFactory;private final ZuulProperties zuulProperties;public CustomHttpClientRibbonCommandFactory(SpringClientFactory clientFactory, ZuulProperties zuulProperties) {super(clientFactory, zuulProperties);this.clientFactory = clientFactory;this.zuulProperties = zuulProperties;}public CustomHttpClientRibbonCommandFactory(SpringClientFactory clientFactory, ZuulProperties zuulProperties, Set<ZuulFallbackProvider> fallbackProviders) {super(clientFactory, zuulProperties, fallbackProviders);this.clientFactory = clientFactory;this.zuulProperties = zuulProperties;}@Overridepublic HttpClientRibbonCommand create(RibbonCommandContext context) {ZuulFallbackProvider zuulFallbackProvider = getFallbackProvider(context.getServiceId());final String serviceId = context.getServiceId();final RibbonLoadBalancingHttpClient client = this.clientFactory.getClient(serviceId, RibbonLoadBalancingHttpClient.class);client.setLoadBalancer(this.clientFactory.getLoadBalancer(serviceId));return new CustomHttpClientRibbonCommand(serviceId, client, context, zuulProperties, zuulFallbackProvider);}
}

##配置

@Autowired(required = false)private Set<ZuulFallbackProvider> zuulFallbackProviders = Collections.emptySet();@Bean@ConditionalOnMissingBeanpublic RibbonCommandFactory<?> ribbonCommandFactory(SpringClientFactory clientFactory, ZuulProperties zuulProperties) {return new CustomHttpClientRibbonCommandFactory(clientFactory, zuulProperties, zuulFallbackProviders);}

##网关的超时层级 ###zuul

zuul:max:host:connections: 500host:socket-timeout-millis: 60000connect-timeout-millis: 60000

###ribbon

ribbon:ReadTimeout: 10000ConnectTimeout: 10000MaxAutoRetries: 0MaxAutoRetriesNextServer: 1eureka:enabled: true

###hystrix

hystrix:command:default:execution:timeout:enabled: trueisolation:thread:timeoutInMilliseconds: 60000

##小结 走网关的话,有三层的超时时间,一个是zuul的,一个是ribbon的,还有一个是hystrix的。hystrix的超时设置,AbstractRibbonCommand这个类没有暴露设置hystrix的Setter方法出来,所以无法通过继承的方式来扩展。因此要自定义ribbon超时的话,需要这个超时时间是小于hystrix的,不然就提前被hystrix超时了,无法起到效果。

转载于:https://my.oschina.net/go4it/blog/1068719

ribbon设置url级别的超时时间相关推荐

  1. Java 调用接口工具类并设置请求和传输超时时间

    废话不多说直接上代码 /*** 接口调用工具类* @Author: MonsterTiny* @Date: 2020-07-23 10:06*/ public class HttpClientUtil ...

  2. Feign Hystrix (HystrixCommonKey) 设置单独接口的超时时间和FallBack

    Feign设置单独接口的超时时间和FallBack(HystrixCommonKey) HystrixCommonKey生成方法:类名#方法名(入参类型)   final class Default ...

  3. python怎么设置代码执行时间_Python 2.x如何设置命令执行的超时时间实例

    前言 在Python2.x中的几个用来执行命令行的库或函数在执行命令是均不能设置一个命令执行的超时时间,用来在命令执行时间超时时终端这个命令的执行,这个功能在3.x(?)中解决了,但是在2.x还是只能 ...

  4. 服务超时时间如何设置、如何对超时时间治理、超时设计原则一文揭秘!

    微服务是⼀种分布式架构,系统内各部分(服务)被部署为单独的应用程序,并通过某种远程访问协议进⾏通讯.分布式应⽤的挑战之⼀就是如何管理远程服务的可用性和它们的响应.本⽂主要探讨服务的响应时间对系统的影响 ...

  5. 单独某个设置feign接口的超时时间

    1.在配置文件里配置:hystrix:enabled: true feign:httpclient.enable: falseokhttp.enable: true# 开启熔断hystrix:enab ...

  6. Feign Client的各种超时时间设置

    在Spring Cloud微服务架构中,大部分公司都是利用Open Feign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务要进行比较繁杂的业务计算,那 ...

  7. 同时设置超时时间_刚入职的小菜鸡,设错了RPC超时,搞了个线上事故

    上面这张监控图,对于服务端的研发同学来说再熟悉不过了.在日常的系统维护中,『服务超时』应该属于监控报警最多的一类问题. 尤其在微服务架构下,一次请求可能要经过一条很长的链路,跨多个服务调用后才能返回结 ...

  8. spring cloud超时时间设置

    #如果是zuul(网关)的超时时间需要设置zuul.hystrix.ribbon等三部分:#zuul超时设置 #默认1000 zuul.host.socket-timeout-millis=2000 ...

  9. Dubbo设置超时时间

    Timeout 设置服务调用,超时时间 默认时间1秒,默认单位毫秒 服务调用 服务调用失败,会重新尝试 默认尝试两次,失败之后,不再尝试 抛出异常 使用方式 在服务暴露的时候 配置服务超时时间,比如, ...

最新文章

  1. push、pop指令
  2. oracle:小知识点
  3. BUUCTF(misc)变异凯撒 --二
  4. python基础之python中if __name__ == '__main__': 的解析
  5. Self Crossing
  6. php 登陆信息 传递,PHP传递POST信息
  7. PCB设计过孔选用指导
  8. erp服务器系统分区多大,云服务器的存储容量有多大
  9. 聊聊Lambda架构
  10. 薪资被倒挂?是怒刷 LeetCode,还是另寻他路?
  11. 9. Browser 对象 - Location 对象
  12. ARM——操作系统—最小操作系统-开发板测试
  13. Flash 游戏设计笔记:计时器制作
  14. HTML如何把输入框变成必填值,required输入框为必填项
  15. 通达信日线数据用转换为excel、csv和feather格式
  16. 四川省内江市启动公共视频监控三期建设
  17. Centos8安装报错Error setting up base repository
  18. 安卓手机反应慢又卡怎么办_安卓手机反应慢怎么办?一分钟教你加速!
  19. 推荐给比较好用FF插件
  20. 2019年年终个人总结

热门文章

  1. 人工智能:看看BAT三巨头怎么说
  2. 1亿参数4万样本BERT仍听不懂人话,我们离通用NLP能还有多远?
  3. 使用CNN分类签名和文本图像
  4. 人工智能商业化的重点:语音交互和人脸识别
  5. 心得丨在开始第一个机器学习项目之前就了解的那些事儿
  6. 《数学之美》第2章自然语言处理从规则到统计
  7. mini-batch 和batch到底是什么
  8. 线性规划的原始对偶算法
  9. 从科学简历看研究方法——爱因斯坦探索性的演绎法
  10. 特约专栏丨王耀南院士:人工智能赋能无人系统