本文主要研究一下ribbon的超时时间设置

配置

实例

ribbon:ReadTimeout: 10000ConnectTimeout: 10000MaxAutoRetries: 0MaxAutoRetriesNextServer: 1eureka:enabled: true
复制代码

RibbonClientConfiguration

spring-cloud-netflix-ribbon-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java

@SuppressWarnings("deprecation")
@Configuration
@EnableConfigurationProperties
//Order is important here, last should be the default, first should be optional
// see https://github.com/spring-cloud/spring-cloud-netflix/issues/2086#issuecomment-316281653
@Import({HttpClientConfiguration.class, OkHttpRibbonConfiguration.class, RestClientRibbonConfiguration.class, HttpClientRibbonConfiguration.class})
public class RibbonClientConfiguration {public static final int DEFAULT_CONNECT_TIMEOUT = 1000;public static final int DEFAULT_READ_TIMEOUT = 1000;@RibbonClientNameprivate String name = "client";// TODO: maybe re-instate autowired load balancers: identified by name they could be// associated with ribbon clients@Autowiredprivate PropertiesFactory propertiesFactory;@Bean@ConditionalOnMissingBeanpublic IClientConfig ribbonClientConfig() {DefaultClientConfigImpl config = new DefaultClientConfigImpl();config.loadProperties(this.name);config.set(CommonClientConfigKey.ConnectTimeout, DEFAULT_CONNECT_TIMEOUT);config.set(CommonClientConfigKey.ReadTimeout, DEFAULT_READ_TIMEOUT);return config;}//......
}
复制代码
  • 这里设置默认的超时值,都是1000毫秒,设置在DefaultClientConfigImpl

AbstractLoadBalancingClient

spring-cloud-netflix-ribbon-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/ribbon/support/AbstractLoadBalancingClient.java

public abstract class AbstractLoadBalancingClient<S extends ContextAwareRequest, T extends IResponse, D> extendsAbstractLoadBalancerAwareClient<S, T> implements ServiceInstanceChooser {protected int connectTimeout;protected int readTimeout;//......@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {super.initWithNiwsConfig(clientConfig);RibbonProperties ribbon = RibbonProperties.from(clientConfig);this.connectTimeout = ribbon.connectTimeout(DEFAULT_CONNECT_TIMEOUT);this.readTimeout = ribbon.readTimeout(DEFAULT_READ_TIMEOUT);this.secure = ribbon.isSecure();this.followRedirects = ribbon.isFollowRedirects();this.okToRetryOnAllOperations = ribbon.isOkToRetryOnAllOperations();}//......
}
复制代码
  • 这里从RibbonProperties读取超时参数,然后放到类成员变量connectTimeout及readTimeout
  • RibbonProperties就最后是从IClientConfig读取

RibbonLoadBalancingHttpClient

spring-cloud-netflix-ribbon-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClient.java

// TODO: rename (ie new class that extends this in Dalston) to ApacheHttpLoadBalancingClient
public class RibbonLoadBalancingHttpClient extendsAbstractLoadBalancingClient<RibbonApacheHttpRequest, RibbonApacheHttpResponse, CloseableHttpClient> {//......@Overridepublic RibbonApacheHttpResponse execute(RibbonApacheHttpRequest request,final IClientConfig configOverride) throws Exception {IClientConfig config = configOverride != null ? configOverride : this.config;RibbonProperties ribbon = RibbonProperties.from(config);RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(ribbon.connectTimeout(this.connectTimeout)).setSocketTimeout(ribbon.readTimeout(this.readTimeout)).setRedirectsEnabled(ribbon.isFollowRedirects(this.followRedirects)).build();request = getSecureRequest(request, configOverride);final HttpUriRequest httpUriRequest = request.toRequest(requestConfig);final HttpResponse httpResponse = this.delegate.execute(httpUriRequest);return new RibbonApacheHttpResponse(httpResponse, httpUriRequest.getURI());}//......
}
复制代码
  • 这里execute方法从IClientConfig构造RequestConfig,会设置connectTimeout及socketTimeout
  • 如果configOverride为null,则使用抽象类的默认配置

OkHttpLoadBalancingClient

spring-cloud-netflix-ribbon-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/ribbon/okhttp/OkHttpLoadBalancingClient.java

public class OkHttpLoadBalancingClientextends AbstractLoadBalancingClient<OkHttpRibbonRequest, OkHttpRibbonResponse, OkHttpClient> {//......@Overridepublic OkHttpRibbonResponse execute(OkHttpRibbonRequest ribbonRequest,final IClientConfig configOverride) throws Exception {boolean secure = isSecure(configOverride);if (secure) {final URI secureUri = UriComponentsBuilder.fromUri(ribbonRequest.getUri()).scheme("https").build().toUri();ribbonRequest = ribbonRequest.withNewUri(secureUri);}OkHttpClient httpClient = getOkHttpClient(configOverride, secure);final Request request = ribbonRequest.toRequest();Response response = httpClient.newCall(request).execute();return new OkHttpRibbonResponse(response, ribbonRequest.getUri());}OkHttpClient getOkHttpClient(IClientConfig configOverride, boolean secure) {IClientConfig config = configOverride != null ? configOverride : this.config;RibbonProperties ribbon = RibbonProperties.from(config);OkHttpClient.Builder builder = this.delegate.newBuilder().connectTimeout(ribbon.connectTimeout(this.connectTimeout), TimeUnit.MILLISECONDS).readTimeout(ribbon.readTimeout(this.readTimeout), TimeUnit.MILLISECONDS).followRedirects(ribbon.isFollowRedirects(this.followRedirects));if (secure) {builder.followSslRedirects(ribbon.isFollowRedirects(this.followRedirects));}return builder.build();}//......
}
复制代码
  • 这里是通过configOverride或默认的config来构建指定超时参数的OkHttpClient
  • 相比较于apache httpclient通过request config来设置超时时间,OkHttpClient是通过client来设置的,这样可能存在一个问题,就是OkHttpClient没法用单例,每次都得new一个

clientConfig传递

RibbonHttpRequest

spring-cloud-netflix-ribbon-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/ribbon/RibbonHttpRequest.java

public class RibbonHttpRequest extends AbstractClientHttpRequest {//......@Overrideprotected ClientHttpResponse executeInternal(HttpHeaders headers)throws IOException {try {addHeaders(headers);if (outputStream != null) {outputStream.close();builder.entity(outputStream.toByteArray());}HttpRequest request = builder.build();HttpResponse response = client.executeWithLoadBalancer(request, config);return new RibbonHttpResponse(response);} catch (Exception e) {throw new IOException(e);}}//......
}
复制代码
  • 这里client.executeWithLoadBalancer(request, config)使用的是RibbonHttpRequest的config配置

RibbonClientHttpRequestFactory

spring-cloud-netflix-ribbon-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/ribbon/RibbonClientHttpRequestFactory.java

public class RibbonClientHttpRequestFactory implements ClientHttpRequestFactory {private final SpringClientFactory clientFactory;public RibbonClientHttpRequestFactory(SpringClientFactory clientFactory) {this.clientFactory = clientFactory;}@Override@SuppressWarnings("deprecation")public ClientHttpRequest createRequest(URI originalUri, HttpMethod httpMethod)throws IOException {String serviceId = originalUri.getHost();if (serviceId == null) {throw new IOException("Invalid hostname in the URI [" + originalUri.toASCIIString() + "]");}IClientConfig clientConfig = this.clientFactory.getClientConfig(serviceId);RestClient client = this.clientFactory.getClient(serviceId, RestClient.class);HttpRequest.Verb verb = HttpRequest.Verb.valueOf(httpMethod.name());return new RibbonHttpRequest(originalUri, verb, client, clientConfig);}}
复制代码
  • ClientHttpRequest是通过RibbonClientHttpRequestFactory这个工厂创建的
  • clientConfig是RibbonClientHttpRequestFactory这个工厂根据serviceId获取的,默认是DefaultClientConfigImpl,从配置文件读取,serviceId自己的个性化配置参数会覆盖默认值,读取不到的就是默认的参数。

小结

spring cloud netflix的ribbon,其超时时间配置有ReadTimeout以及ConnectTimeout,分别是设置的socketTimeout以及connectTimeout,创建请求的时候,会读取指定配置,没有的话,就取默认的配置,设置超时时间。

doc

  • Client Side Load Balancing with Ribbon and Spring Cloud

聊聊ribbon的超时时间设置相关推荐

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

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

  2. spring cloud超时时间设置

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

  3. Socket超时时间设置

    你知道在 Java 中怎么对 Socket 设置超时时间吗?他们的区别是什么?想一想和女朋友打电话的场景就知道了,如果实在想不到,那我们就一起来来看一下是咋回事吧 设置方式 主要有以下两种方式,我们来 ...

  4. Modbus 超时时间设置

    原文链接:https://blog.csdn.net/sunxboy/java/article/details/84499791 Modbus通讯时,需要连续读取多个现场设备的数据,虽然也编写了Mod ...

  5. 修改服务器超时时间,服务器超时时间设置

    服务器超时时间设置 内容精选 换一换 在压测过程中能够提供自身性能数据的施压目标机器.管理执行机的节点.CPTS为用户的测试工程提供管理能力,事务.压测任务.测试报告的内容在同一个测试工程内共享复用, ...

  6. TCP 超时时间设置过长或 MTU 设置不合理会导致网络速度变慢吗

    是的,TCP 超时时间设置过长或 MTU 设置不合理都可能导致网络速度变慢. TCP 超时时间是指在发送数据之后,如果没有收到对端的应答,就会在超时时间后再次发送数据.如果超时时间设置过长,会导致发送 ...

  7. 联众服务器超时中断,http连接中客户端中断了请求,服务端会中断执行吗?超时时间设置?...

    由于http是基于tcp的,在tcp中,客户端中断了连接,服务端是无法感知的,只能通过发心跳包来检测,而显然我们的nginx是没有发心跳包的,所以,包括nginx,php-fpm都是不知道客户端已断开 ...

  8. 服务器时间修改连接超时时间,服务器设置网络连接超时时间设置

    服务器设置网络连接超时时间设置 内容精选 换一换 有以下几种现象:将制作好的SD卡插入开发者板并上电后,开发者板LED1与LED2灯状态信息异常.将制作好的SD卡插入开发者板,并通过USB方式连接Ub ...

  9. httpClient 超时时间设置

    上周乐视网cms香港接口,数据刷新缓慢.香港运营人员一直在群里反馈tv端内容不更新. 我观察了下服务器,发现请求接口耗时很久500-6000ms.之前一般都是100ms左右. 导致很多线程一直在wai ...

最新文章

  1. 为提高能量利用效率,大脑会对感官进行预测
  2. 如何自己写一个公用的NPM包
  3. php常用的技术有哪些,php常用技术
  4. 项目经理面试中可能遇到的问题
  5. 《数学之美》马尔科夫链的扩展-贝叶斯网络
  6. 【操作系统】—处理机调度的概念以及层次
  7. 清楚了解TCP三次握手和四次挥手的过程中各标志的含义
  8. hashmap浅析-get方法
  9. ubuntu16.04安装搭建RED5流媒体服务器
  10. aso优化应用市场推广方案到底怎么写
  11. Three.js的uv坐标贴图理解
  12. 老九学堂C++实现小游戏之小公主养成记
  13. unity 陶瓷质感_Unity2D:简单自动瓷砖(Tile)的实现
  14. 博才教育三校领导莅临湖南省智慧教育装备展示体验中心参观交流
  15. CVE-2020-1472 Netlogon权限提升漏洞分析
  16. Vendor NDK
  17. ConnectBot连接Linux服务器手机端工具
  18. proteus8单片机c语言仿真教程,入门学习Proteus 8仿真软件以及C51单片机的LED点亮(C语言)——实例...
  19. 页面静态化----------------------------------------个人笔记
  20. PHP技能架构思维导图(高清大图)详解

热门文章

  1. c语言中合法转义字符,判断c语言合法转义字符
  2. 版本不一致_一致哈希:Beyond the basics
  3. vue项目的实用配置
  4. Springboot-application.properties
  5. 跟随光标下划线导航插件
  6. python(3)-动态参数实现字符串格式化
  7. SpringSecurity简单应用(二)
  8. LALR(1)语法分析生成器--xbytes
  9. Redhat GRUB配置错误修复
  10. Linux系统中如何添加自己的库文件路径