4.调用关系及超时说明

  1. 调用关系图类似如下:
    4.调用关系及超时说明
    1. User发起http请求,这里省略了controller的一层,只为表明RestTemplate的调用过程
    2. Hystrix采用aop拦截的方式,对标注HystrixCommand的方法进行拦截
    3. RestTemplate执行内部的拦截链,但是此拦截并非aop,只是普通的java连接链,类似于ServletFilter
    4. Ribbon执行负载均衡,选择合适的server(包含ip+port)关键信息
    5. 5~6调用返回
    6. RestTemplate委托http客户端发起真正的http请求
    7. http客户端发起真正的http请求
    8. 9~12调用返回
  2. 超时说明
    上面的调用过程中有三个超时设置,分别是hystrix超时,RestTemplate超时和ribbon的超时(其实为http客户端超时)
    那么这三个超时设为多少:
    1. 首先hystrix为最外部超时,其有多重熔断触发机制,代码异常,线程池/信号量跑满等。理论上hystrix超时应该在满足业务容忍度上取最大时间,timeout >= retry * (conntimeout+readtimeout):
      如果设置的比RestTemplate+ribbon的小,当其余两个响应慢时,均会被hystrix中断;
      如果设置的比RestTemplate+ribbon的大,那么hystrix永远不会触发超时中断降级,只可能方法抛出异常(超时等)进行降级;
    2. 其次RestTemplate超时本质为http客户端远程调用超时设置,这个设置为最大容忍远程服务的响应时间即可。
    3. 最后ribbon超时与RestTemplate超时类似,都是http客户端的超时,只不过,ribbon的超时配置在使用feign时才有效。