本文介绍开发HSF应用过程中如何进行超时配置。
前提条件
在开发应用前,您已经完成以下工作:
背景信息
有关网络调用的请求,都需要配置超时,HSF的默认超时时间是3000ms。客户端和服务端都可以设置超时,默认优先采用客户端的配置,如果客户端没有配置,使用服务端的超时配置。 在服务端设置超时时,需要考虑到业务本身的执行耗时,加上序列化和网络通讯的时间。所以推荐服务端给每个服务都配置个默认的时间。当然客户端也可以根据自己的业务场景配置超时时间,例如一些前端应用,需要用户快速看到结果,可以把超时时间设置小一些。
配置的作用范围、作用域,按照优先级由高到低如下表所示。
优先级 | API | 范围 | 作用域 |
0 | com.taobao.hsf.util.RequestCtxUtil#setRequestTimeout | 客户端 | 单次调用 |
1 | HSFApiConsumerBean#setMethodSpecials | 客户端 | 方法 |
2 | HSFApiConsumerBean#setClientTimeout | 客户端 | 接口 |
3 | defaultHsfClientTimeout | 客户端 | 所有接口 |
4 | HSFApiProviderBean#setMethodSpecials | 服务端 | 方法 |
5 | HSFApiProviderBean#setClientTimeout | 服务端 | 接口 |
客户端配置优先于服务端,方法优先于接口。
客户端超时配置
API形式配置HSF服务。
配置HSFApiConsumerBean的clientTimeout属性,单位是ms,我们把接口的超时配置为1000ms,方法queryOrder配置为100ms, 代码如下。
HSFApiConsumerBean consumerBean = new HSFApiConsumerBean(); // 接口级别超时配置 consumerBean.setClientTimeout(1000); 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也支持使用注解进行配置,用来订阅服务。
在项目中增加依赖starter。
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>pandora-hsf-spring-boot-starter</artifactId> </dependency>
在代码中注解配置。
通常一个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); 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); } }