API手冊(cè)
在HSF應(yīng)用的API中,最關(guān)鍵的是創(chuàng)建ProviderBean和ConsumerBean相關(guān)的API。
背景信息
根據(jù)用戶使用的場(chǎng)景不同,主要分為4個(gè)關(guān)鍵的類。
com.taobao.hsf.app.api.util.HSFApiProviderBean: 通過(guò)API編程的方式創(chuàng)建Provider Bean。
com.taobao.hsf.app.api.util.HSFApiConsumerBean: 通過(guò)API編程的方式創(chuàng)建Consumer Bean。
com.taobao.hsf.app.spring.util.HSFSpringProviderBean: 通過(guò)Spring配置的方式創(chuàng)建Provider Bean。
com.taobao.hsf.app.spring.util.HSFSpringConsumerBean: 通過(guò)Spring配置的方式創(chuàng)建Consumer Bean。
其中,HSFSpringXxxBean的配置屬性與HSFApiXxxBean的setter方法相對(duì)應(yīng)。接下來(lái)就分別以ProviderBean和ConsumerBean的視角介紹這4個(gè)類的API。
ProviderBean
API編程方式 - HSFApiProviderBean
通過(guò)配置并初始化com.taobao.hsf.app.api.util.HSFApiProviderBean即可完成HSF服務(wù)的發(fā)布。
對(duì)于一個(gè)服務(wù),com.taobao.hsf.app.api.util.HSFApiProviderBean的配置及初始化過(guò)程只需配置一次。此外,考慮到HSFApiProviderBean對(duì)象比較復(fù)雜,建議緩存。
示例代碼:
// 實(shí)例化并配置Provider Bean HSFApiProviderBean hsfApiProviderBean = new HSFApiProviderBean(); hsfApiProviderBean.setServiceInterface("com.taobao.hsf.test.HelloWorldService"); hsfApiProviderBean.setTarget(target); // target為serviceInterface指定接口的實(shí)現(xiàn)對(duì)象。 hsfApiProviderBean.setServiceVersion("1.0.0"); hsfApiProviderBean.setServiceGroup("HSF"); // 初始化Provider Bean,發(fā)布服務(wù)。 hsfApiProviderBean.init();
可配置屬性表:
除上述示例代碼中設(shè)置的屬性,HSFApiProviderBean還包含許多其他可配置的屬性,均可通過(guò)對(duì)應(yīng)的setter方法進(jìn)行設(shè)置。
屬性名
類型
是否必選
默認(rèn)值
含義
serviceInterface
String
是
無(wú)
設(shè)置HSF服務(wù)對(duì)外提供的業(yè)務(wù)接口。客戶端通過(guò)此屬性進(jìn)行訂閱。
target
Object
是
無(wú)
設(shè)置serviceInterface指定接口的服務(wù)實(shí)現(xiàn)對(duì)象。
serviceVersion
String
否
1.0.0
設(shè)置服務(wù)的版本號(hào)。客戶端通過(guò)此屬性進(jìn)行訂閱。
serviceGroup
String
否
HSF
設(shè)置服務(wù)的組別。客戶端通過(guò)此屬性進(jìn)行訂閱。
serviceDesc
String
否
無(wú)
設(shè)置服務(wù)的描述,從而方便管理。
clientTimeout
int
否
3000
設(shè)置響應(yīng)超時(shí)時(shí)間(單位:毫秒)。如果服務(wù)端在設(shè)置的時(shí)間內(nèi)沒(méi)有返回,則拋出HSFTimeOutException。
methodSpecials
MethodSpecial[]
否
無(wú)
設(shè)置服務(wù)中某些方法的響應(yīng)超時(shí)時(shí)間。通過(guò)設(shè)置MethodSpecial.methodName指定方法名,通過(guò)設(shè)置MethodSpecial.clientTimeout指定當(dāng)前方法的超時(shí)時(shí)間,優(yōu)先級(jí)高于當(dāng)前服務(wù)端的clientTimeout。
preferSerializeType
String
否
hessian2
針對(duì)HSF2,設(shè)置服務(wù)的請(qǐng)求參數(shù)和響應(yīng)結(jié)果的序列化方式。可選值有java、hessian、hessian2、json和kryo。
corePoolSize
值為整型的String
否
0
配置服務(wù)單獨(dú)的線程池,并指定最小活躍線程數(shù)量。若不設(shè)置該屬性,則默認(rèn)使用HSF服務(wù)端的公共線程池。
maxPoolSize
值為整型的String
否
0
配置服務(wù)單獨(dú)的線程池,并指定最大活躍線程數(shù)量。若不設(shè)置該屬性,則默認(rèn)使用HSF服務(wù)端的公共線程池。
Spring配置方式 - HSFSpringProviderBean
通過(guò)在Spring配置文件中,配置一個(gè)class為 com.taobao.hsf.app.spring.util.HSFSpringProviderBean的bean,即可完成HSF服務(wù)的發(fā)布。
示例代碼
<bean id="helloWorldService" class="com.taobao.hsf.test.HelloWorldService" /> <bean class="com.taobao.hsf.app.spring.util.HSFSpringProviderBean" init-method="init"> <!-- [必選] 設(shè)置HSF服務(wù)對(duì)外提供的業(yè)務(wù)接口 --> <property name="serviceInterface" value="com.taobao.hsf.test.HelloWorldService" /> <!-- [必選] 設(shè)置serviceInterface指定接口的服務(wù)實(shí)現(xiàn)對(duì)象,即需要發(fā)布為HSF服務(wù)的spring bean id --> <property name="target" ref="helloWorldService" /> <!-- [可選] 設(shè)置服務(wù)的版本號(hào),默認(rèn)為1.0.0 --> <property name="serviceVersion" value="1.0.0" /> <!-- [可選] 設(shè)置服務(wù)的組別,默認(rèn)為HSF --> <property name="serviceGroup" value="HSF" /> <!-- [可選] 設(shè)置服務(wù)的描述,從而方便管理,默認(rèn)為null --> <property name="serviceDesc" value="HelloWorldService providered by HSF" /> <!-- [可選] 設(shè)置響應(yīng)超時(shí)時(shí)間(單位:毫秒)。如果服務(wù)端在設(shè)置的時(shí)間內(nèi)沒(méi)有返回,則拋出HSFTimeOutException --> <!-- 默認(rèn)為3000 ms --> <property name="clientTimeout" value="3000"/> <!-- [可選] 設(shè)置服務(wù)中某些方法的響應(yīng)超時(shí)時(shí)間。優(yōu)先級(jí)高于上面的clientTimeout --> <!-- 通過(guò)設(shè)置MethodSpecial.methodName指定方法名,MethodSpecial.clientTimeout指定方法的超時(shí)時(shí)間 --> <property name="methodSpecials"> <list> <bean class="com.taobao.hsf.model.metadata.MethodSpecial"> <property name="methodName" value="sum" /> <property name="clientTimeout" value="2000" /> </bean> </list> </property> <!-- [可選] 設(shè)置服務(wù)的請(qǐng)求參數(shù)和響應(yīng)結(jié)果的序列化方式。可選值包含java、hessian、hessian2、json和kryo --> <!-- 默認(rèn)為hessian2 --> <property name="preferSerializeType" value="hessian2"/> <!-- [可選] 配置服務(wù)單獨(dú)的線程池,并指定最小活躍線程數(shù)量。若不設(shè)置該屬性,則默認(rèn)使用HSF服務(wù)端的公共線程池 --> <property name="corePoolSize" value="10"/> <!-- [可選] 配置服務(wù)單獨(dú)的線程池,并指定最大活躍線程數(shù)量。若不設(shè)置該屬性,則默認(rèn)使用HSF服務(wù)端的公共線程池 --> <property name="maxPoolSize" value="60"/> </bean>
ConsumerBean
API配置方式 - HSFApiConsumerBean
通過(guò)配置并初始化com.taobao.hsf.app.api.util.HSFApiConsumerBean完成HSF服務(wù)的訂閱。
對(duì)于同一個(gè)服務(wù),com.taobao.hsf.app.api.util.HSFApiConsumerBean的配置及初始化過(guò)程只需配置一次。
由于HSFApiConsumerBean對(duì)象內(nèi)容多,建議將該對(duì)象以及獲取到的HSF代理進(jìn)行緩存。
說(shuō)明在HSF內(nèi)部HSFApiConsumerBean對(duì)服務(wù)的配置是緩存起來(lái)的。即如果對(duì)某個(gè)訂閱的服務(wù)進(jìn)行了多次配置,只有第一次的配置生效。
示例代碼
// 實(shí)例化并配置Consumer Bean HSFApiConsumerBean hsfApiConsumerBean = new HSFApiConsumerBean(); hsfApiConsumerBean.setInterfaceName("com.taobao.hsf.test.HelloWorldService"); hsfApiConsumerBean.setVersion("1.0.0"); hsfApiConsumerBean.setGroup("HSF"); // 初始化Consumer Bean,訂閱服務(wù) // true表示等待地址推送(超時(shí)時(shí)間為3000毫秒),默認(rèn)為false(異步) hsfApiConsumerBean.init(true); // 獲取HSF代理HelloWorldService helloWorldService = (HelloWorldService) hsfApiConsumerBean.getObject(); // 發(fā)起HSF調(diào)用String helloStr = helloWorldService.sayHello("Li Lei");
可配置屬性表
除上述示例代碼中設(shè)置的屬性,HSFApiConsumerBean還包含許多其他可配置的屬性,均可通過(guò)對(duì)應(yīng)的setter方法進(jìn)行設(shè)置。
屬性名
類型
是否必選
默認(rèn)值
含義
interfaceName
String
是
無(wú)
設(shè)置需要訂閱服務(wù)的接口名。客戶端通過(guò)此屬性進(jìn)行訂閱。
version
String
是
無(wú)
設(shè)置需要訂閱服務(wù)的版本號(hào)。客戶端通過(guò)此屬性進(jìn)行訂閱。
group
String
是
無(wú)
設(shè)置需要訂閱服務(wù)的組別。客戶端通過(guò)此屬性進(jìn)行訂閱。
clientTimeout
int
否
無(wú)
設(shè)置請(qǐng)求超時(shí)時(shí)間(單位:毫秒)。如果客戶端在設(shè)置的時(shí)間內(nèi)沒(méi)有收到服務(wù)端響應(yīng),則拋出HSFTimeOutException。 若客戶端設(shè)置了clientTimeout,則優(yōu)先級(jí)高于服務(wù)端設(shè)置的clientTimeout。否則,在服務(wù)的遠(yuǎn)程調(diào)用過(guò)程中,使用服務(wù)端設(shè)置的clientTimeout。
methodSpecials
MethodSpecial[]
否
無(wú)
設(shè)置服務(wù)中某些方法的請(qǐng)求超時(shí)時(shí)間。通過(guò)設(shè)置MethodSpecial.methodName指定方法名,通過(guò)設(shè)置MethodSpecial.clientTimeout指定當(dāng)前方法的超時(shí)時(shí)間,優(yōu)先級(jí)高于當(dāng)前客戶端的clientTimeout。
maxWaitTimeForCsAddress
int
否
無(wú)
設(shè)置同步等待ConfigServer推送地址的時(shí)間(單位:毫秒),從而避免因地址還未推送到就發(fā)起服務(wù)調(diào)用造成的HSFAddressNotFoundException。一般建議設(shè)置為5000毫秒,即可滿足推送等待時(shí)間。
asyncallMethods
List
否
無(wú)
設(shè)置需要異步調(diào)用的方法列表。List中的每一個(gè)字符串的格式為:
name:方法名
type:異步調(diào)用類型
listener:監(jiān)聽(tīng)器
其中l(wèi)istener只對(duì)callback類型的異步調(diào)用生效。type的類型有:
future:通過(guò)Future的方式去獲取請(qǐng)求執(zhí)行的結(jié)果。
callback:當(dāng)遠(yuǎn)程服務(wù)的調(diào)用完成后,HSF會(huì)使用響應(yīng)結(jié)果回調(diào)此處配置的listener,該listener需要實(shí)現(xiàn)HSFResponseCallback接口。
proxyStyle
String
否
jdk
設(shè)置服務(wù)的代理模式,一般不用配置。如果要攔截這個(gè)consumer bean,需要配置成javassist。
Spring配置方式 - HSFSpringConsumerBean
通過(guò)在Spring配置文件中,配置一個(gè)class為com.taobao.hsf.app.api.util.HSFSpringConsumerBean的bean,即可實(shí)現(xiàn)服務(wù)的訂閱。
示例代碼
<bean id="helloWorldService" class="com.taobao.hsf.app.spring.util.HSFSpringConsumerBean"> <!-- [必選] 設(shè)置需要訂閱服務(wù)的接口名 --> <property name="interfaceName" value="com.taobao.hsf.test.HelloWorldService" /> <!-- [必選] 設(shè)置需要訂閱服務(wù)的版本號(hào) --> <property name="version" value="1.0.0" /> <!-- [必選] 設(shè)置需要訂閱服務(wù)的組別 --> <property name="group" value="HSF" /> <!-- [可選] 設(shè)置請(qǐng)求超時(shí)時(shí)間(單位:毫秒)。如果客戶端在設(shè)置的時(shí)間內(nèi)沒(méi)有收到服務(wù)端響應(yīng),則拋出HSFTimeOutException --> <!-- 若客戶端設(shè)置了clientTimeout,則優(yōu)先級(jí)高于服務(wù)端設(shè)置的clientTimeout。否則,在服務(wù)的遠(yuǎn)程調(diào)用過(guò)程中,使用服務(wù)端設(shè)置的clientTimeout。--> <property name="clientTimeout" value="3000" /> <!-- [可選] 設(shè)置服務(wù)中某些方法的請(qǐng)求超時(shí)時(shí)間,優(yōu)先級(jí)高于當(dāng)前客戶端的clientTimeout --> <!-- 通過(guò)設(shè)置MethodSpecial.methodName指定方法名,通過(guò)設(shè)置MethodSpecial.clientTimeout指定當(dāng)前方法的超時(shí)時(shí)間 --> <property name="methodSpecials"> <list> <bean class="com.taobao.hsf.model.metadata.MethodSpecial"> <property name="methodName" value="sum" /> <property name="clientTimeout" value="2000" /> </bean> </list> </property> <!-- [可選] 設(shè)置同步等待ConfigServer推送地址的時(shí)間(單位:毫秒)--> <!-- 從而避免因地址還未推送到就發(fā)起服務(wù)調(diào)用造成的HSFAddressNotFoundException --> <!-- 一般建議設(shè)置為5000毫秒,即可滿足推送等待時(shí)間 --> <property name="maxWaitTimeForCsAddress" value="5000"/> <!-- [可選] 設(shè)置需要異步調(diào)用的方法列表。List中的每一個(gè)字符串的格式為:--> <!-- name:方法名 --> <!-- type:異步調(diào)用類型 --> <!-- listener:監(jiān)聽(tīng)器 --> <!-- 其中,listener只對(duì)callback類型的異步調(diào)用生效--> <!-- type的類型有: --> <!-- future: 通過(guò)Future的方式去獲取請(qǐng)求執(zhí)行的結(jié)果 --> <!-- callback: 當(dāng)遠(yuǎn)程服務(wù)的調(diào)用完成后,HSF會(huì)使用響應(yīng)結(jié)果回調(diào)此處配置的listener,該listener需要實(shí)現(xiàn)HSFResponseCallback接口 --> <property name="asyncallMethods"> <list> <value>name:sayHello;type:callback;listener:com.taobao.hsf.test.service.HelloWorldServiceCallbackHandler</value> </list> </property> <!-- [可選] 設(shè)置服務(wù)的代理模式,一般不用配置。如果要攔截這個(gè)consumer bean,需要配置成javassist --> <property name="proxyStyle" value="jdk" /> </bean>