本文介绍开发 HSF 应用过程中如何进行超时配置。

背景信息

有关网络调用的请求,都需要配置超时,HSF 的默认超时时间是 3000ms。客户端和服务端都可以设置超时,默认优先采用客户端的配置,如果客户端没有配置,使用服务端的超时配置。 在服务端设置超时时,需要考虑到业务本身的执行耗时,加上序列化和网络通讯的时间。所以推荐服务端给每个服务都配置个默认的时间。当然客户端也可以根据自己的业务场景配置超时时间,例如一些前端应用,需要用户快速看到结果,可以把超时时间设置小一些。

配置的作用范围、作用域,按照优先级由高到低如下表所示。

优先级 API 范围 作用域
0 com.taobao.hsf.util.RequestCtxUtil#setRequestTimeout 客户端 单次调用
1 HSFApiConsumerBean#setMethodSpecials 客户端 方法
2 HSFApiConsumerBean#setClientTimeout 客户端 接口
3 -DdefaultHsfClientTimeout 客户端 所有接口
4 HSFApiProviderBean#setMethodSpecials 服务端 方法
5 HSFApiProviderBean#setClientTimeout 服务端 接口
说明 客户端配置优先于服务端,方法优先于接口。

客户端超时配置

  • API 形式配置 HSF 服务。

    配置 HSFApiConsumerBean 的 clientTimeout 属性,单位是 ms,我们把接口的超时配置为 1000ms,方法 queryOrder 配置为 100ms, 代码如下。

    HSFApiConsumerBean consumerBean = new HSFApiConsumerBean();
    // 接口级别超时配置
    consumerBean.setClientTimeout(1000);
    //xxx
    MethodSpecial methodSpecial = new MethodSpecial();
    methodSpecial.setMethodName("queryOrder");
    // 方法级别超时配置,优先于接口超时配置
    methodSpecial.setClientTimeout(100);
    consumerBean.setMethodSpecials(new MethodSpecial[]{methodSpecial});
  • Spring 配置 HSF 服务。
    Spring 框架是在应用中广泛使用的组件,如果不想通过 API 的形式配置 HSF 服务,可以使用 Spring XML 的形式进行配置,上述例子中的 API 配置等同于如下 XML 配置。
    <bean id="CallHelloWorld" class="com.taobao.hsf.app.spring.util.HSFSpringConsumerBean">
        ...
        <property name="clientTimeout" value="1000" />
        <property name="methodSpecials">
          <list>
            <bean class="com.taobao.hsf.model.metadata.MethodSpecial">
              <property name="methodName" value="queryOrder" />
              <property name="clientTimeout" value="100" />
            </bean>
          </list>
        </property>
        ...
    </bean>
  • 注解配置。
    SpringBoot 广泛使用的今天,使用注解装配 SpringBean 也成为一种选择,HSF 也支持使用注解进行配置,用来订阅服务。
    1. 在项目中增加依赖 starter。
      <dependency>
          <groupId>com.alibaba.boot</groupId>
          <artifactId>pandora-hsf-spring-boot-starter</artifactId>
      </dependency>
    2. 在代码中注解配置。

      通常一个 HSF Consumer 需要在多个地方使用,但并不需要在每次使用的地方都用 @HSFConsumer 来标记。只需要写一个统一个 Config 类,然后在其它需要使用的地方,直接 @Autowired 注入即可上述例子中的 API 配置等同于如下注解配置。

       @HSFConsumer(clientTimeout = 1000, methodSpecials = @HSFConsumer.ConsumerMethodSpecial(methodName = "queryOrder", clientTimeout = "100"))
       private OderService orderService;
  • 客户端全局接口超时配置。
    • 在启动参数中添加 -DdefaultHsfClientTimeout=100
    • 在代码中添加 System.setProperty("defaultHsfClientTimeout", “100”)

服务端方法超时配置

  • API 配置 HSF 服务。

    配置 HSFApiProviderBean 的 clientTimeout 属性,单位是 ms,代码如下。

    HSFApiProviderBean providerBean = new HSFApiProviderBean();
    // 接口级别超时配置
    providerBean.setClientTimeout(1000);
    //xxx
    MethodSpecial methodSpecial = new MethodSpecial();
    methodSpecial.setMethodName("queryOrder");
    // 方法级别超时配置,优先于接口超时配置
    methodSpecial.setClientTimeout(100);
    providerBean.setMethodSpecials(new MethodSpecial[]{methodSpecial});
  • Spring 配置 HSF 服务。

    Spring 框架是在应用中广泛使用的组件,如果不想通过 API 的形式配置 HSF 服务,可以使用 Spring XML 的形式进行配置,上述例子中的 API 配置等同于如下 XML 配置。

    <bean class="com.taobao.hsf.app.spring.util.HSFSpringProviderBean" init-method="init">
        ...
        <property name="clientTimeout" value="1000" />
        <property name="methodSpecials">
          <list>
            <bean class="com.taobao.hsf.model.metadata.MethodSpecial">
              <property name="methodName" value="queryOrder" />
              <property name="clientTimeout" value="2000" />
            </bean>
          </list>
        </property>
        ...
    </bean>
  • 注解配置 HSF 服务。

    注入即可上述例子中的 API 配置等同于如下注解配置。

    @HSFProvider(serviceInterface = OrderService.class, clientTimeout = 3000)
    public class OrderServiceImpl implements OrderService {
        @Autowired
        private OrderDAO orderDAO;
    
        @Override
        public OrderModel queryOrder(Long id) {
            return orderDAO.queryOrder(id);
        }
    }