在HSF應用的API中,最關鍵的是建立ProviderBean和ConsumerBean相關的API。
背景資訊
根據使用者使用的情境不同,主要分為4個關鍵的類。
com.taobao.hsf.app.api.util.HSFApiProviderBean: 通過API編程的方式建立Provider Bean。
com.taobao.hsf.app.api.util.HSFApiConsumerBean: 通過API編程的方式建立Consumer Bean。
com.taobao.hsf.app.spring.util.HSFSpringProviderBean: 通過Spring配置的方式建立Provider Bean。
com.taobao.hsf.app.spring.util.HSFSpringConsumerBean: 通過Spring配置的方式建立Consumer Bean。
其中,HSFSpringXxxBean的配置屬性與HSFApiXxxBean的setter方法相對應。接下來就分別以ProviderBean和ConsumerBean的視角介紹這4個類的API。
ProviderBean
API編程方式 - HSFApiProviderBean
通過配置並初始化com.taobao.hsf.app.api.util.HSFApiProviderBean即可完成HSF服務的發布。
對於一個服務,com.taobao.hsf.app.api.util.HSFApiProviderBean的配置及初始化過程只需配置一次。此外,考慮到HSFApiProviderBean對象比較複雜,建議緩衝。
範例程式碼:
// 執行個體化並配置Provider Bean HSFApiProviderBean hsfApiProviderBean = new HSFApiProviderBean(); hsfApiProviderBean.setServiceInterface("com.taobao.hsf.test.HelloWorldService"); hsfApiProviderBean.setTarget(target); // target為serviceInterface指定介面的實現對象。 hsfApiProviderBean.setServiceVersion("1.0.0"); hsfApiProviderBean.setServiceGroup("HSF"); // 初始化Provider Bean,發布服務。 hsfApiProviderBean.init();
可配置屬性工作表:
除上述範例程式碼中設定的屬性,HSFApiProviderBean還包含許多其他可配置的屬性,均可通過對應的setter方法進行設定。
屬性名稱
類型
是否必選
預設值
含義
serviceInterface
String
是
無
設定HSF服務對外提供的業務介面。用戶端通過此屬性進行訂閱。
target
Object
是
無
設定serviceInterface指定介面的服務實現對象。
serviceVersion
String
否
1.0.0
設定服務的版本號碼。用戶端通過此屬性進行訂閱。
serviceGroup
String
否
HSF
設定服務的組別。用戶端通過此屬性進行訂閱。
serviceDesc
String
否
無
設定服務的描述,從而方便管理。
clientTimeout
int
否
3000
設定響應逾時時間(單位:毫秒)。如果服務端在設定的時間內沒有返回,則拋出HSFTimeOutException。
methodSpecials
MethodSpecial[]
否
無
設定服務中某些方法的響應逾時時間。通過設定MethodSpecial.methodName指定方法名,通過設定MethodSpecial.clientTimeout指定當前方法的逾時時間,優先順序高於當前服務端的clientTimeout。
preferSerializeType
String
否
hessian2
針對HSF2,設定服務的請求參數和響應結果的序列化方式。可選值有java、hessian、hessian2、json和kryo。
corePoolSize
值為整型的String
否
0
佈建服務單獨的線程池,並指定最小活躍線程數量。若不設定該屬性,則預設使用HSF服務端的公用線程池。
maxPoolSize
值為整型的String
否
0
佈建服務單獨的線程池,並指定最大活躍線程數量。若不設定該屬性,則預設使用HSF服務端的公用線程池。
Spring配置方式 - HSFSpringProviderBean
通過在Spring設定檔中,配置一個class為 com.taobao.hsf.app.spring.util.HSFSpringProviderBean的bean,即可完成HSF服務的發布。
範例程式碼
<bean id="helloWorldService" class="com.taobao.hsf.test.HelloWorldService" /> <bean class="com.taobao.hsf.app.spring.util.HSFSpringProviderBean" init-method="init"> <!-- [必選] 設定HSF服務對外提供的業務介面 --> <property name="serviceInterface" value="com.taobao.hsf.test.HelloWorldService" /> <!-- [必選] 設定serviceInterface指定介面的服務實現對象,即需要發布為HSF服務的spring bean id --> <property name="target" ref="helloWorldService" /> <!-- [可選] 設定服務的版本號碼,預設為1.0.0 --> <property name="serviceVersion" value="1.0.0" /> <!-- [可選] 設定服務的組別,預設為HSF --> <property name="serviceGroup" value="HSF" /> <!-- [可選] 設定服務的描述,從而方便管理,預設為null --> <property name="serviceDesc" value="HelloWorldService providered by HSF" /> <!-- [可選] 設定響應逾時時間(單位:毫秒)。如果服務端在設定的時間內沒有返回,則拋出HSFTimeOutException --> <!-- 預設為3000 ms --> <property name="clientTimeout" value="3000"/> <!-- [可選] 設定服務中某些方法的響應逾時時間。優先順序高於上面的clientTimeout --> <!-- 通過設定MethodSpecial.methodName指定方法名,MethodSpecial.clientTimeout指定方法的逾時時間 --> <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> <!-- [可選] 設定服務的請求參數和響應結果的序列化方式。可選值包含java、hessian、hessian2、json和kryo --> <!-- 預設為hessian2 --> <property name="preferSerializeType" value="hessian2"/> <!-- [可選] 佈建服務單獨的線程池,並指定最小活躍線程數量。若不設定該屬性,則預設使用HSF服務端的公用線程池 --> <property name="corePoolSize" value="10"/> <!-- [可選] 佈建服務單獨的線程池,並指定最大活躍線程數量。若不設定該屬性,則預設使用HSF服務端的公用線程池 --> <property name="maxPoolSize" value="60"/> </bean>
ConsumerBean
API配置方式 - HSFApiConsumerBean
通過配置並初始化com.taobao.hsf.app.api.util.HSFApiConsumerBean完成HSF服務的訂閱。
對於同一個服務,com.taobao.hsf.app.api.util.HSFApiConsumerBean的配置及初始化過程只需配置一次。
由於HSFApiConsumerBean對象內容多,建議將該對象以及擷取到的HSF代理進行緩衝。
說明在HSF內部HSFApiConsumerBean對服務的配置是緩衝起來的。即如果對某個訂閱的服務進行了多次配置,只有第一次的配置生效。
範例程式碼
// 執行個體化並配置Consumer Bean HSFApiConsumerBean hsfApiConsumerBean = new HSFApiConsumerBean(); hsfApiConsumerBean.setInterfaceName("com.taobao.hsf.test.HelloWorldService"); hsfApiConsumerBean.setVersion("1.0.0"); hsfApiConsumerBean.setGroup("HSF"); // 初始化Consumer Bean,訂閱服務 // true表示等待地址推送(逾時時間為3000毫秒),預設為false(非同步) hsfApiConsumerBean.init(true); // 擷取HSF代理HelloWorldService helloWorldService = (HelloWorldService) hsfApiConsumerBean.getObject(); // 發起HSF調用String helloStr = helloWorldService.sayHello("Li Lei");
可配置屬性工作表
除上述範例程式碼中設定的屬性,HSFApiConsumerBean還包含許多其他可配置的屬性,均可通過對應的setter方法進行設定。
屬性名稱
類型
是否必選
預設值
含義
interfaceName
String
是
無
設定需要訂閱服務的介面名。用戶端通過此屬性進行訂閱。
version
String
是
無
設定需要訂閱服務的版本號碼。用戶端通過此屬性進行訂閱。
group
String
是
無
設定需要訂閱服務的組別。用戶端通過此屬性進行訂閱。
clientTimeout
int
否
無
佈建要求逾時時間(單位:毫秒)。如果用戶端在設定的時間內沒有收到服務端響應,則拋出HSFTimeOutException。 若用戶端設定了clientTimeout,則優先順序高於服務端設定的clientTimeout。否則,在服務的遠程調用過程中,使用服務端設定的clientTimeout。
methodSpecials
MethodSpecial[]
否
無
設定服務中某些方法的請求逾時時間。通過設定MethodSpecial.methodName指定方法名,通過設定MethodSpecial.clientTimeout指定當前方法的逾時時間,優先順序高於當前用戶端的clientTimeout。
maxWaitTimeForCsAddress
int
否
無
設定同步等待ConfigServer推送地址的時間(單位:毫秒),從而避免因地址還未推送到就發起服務調用造成的HSFAddressNotFoundException。一般建議設定為5000毫秒,即可滿足推送等待時間。
asyncallMethods
List
否
無
設定需要非同步呼叫的方法列表。List中的每一個字串的格式為:
name:方法名
type:非同步呼叫類型
listener:監聽器
其中listener只對callback類型的非同步呼叫生效。type的類型有:
future:通過Future的方式去擷取請求執行的結果。
callback:當遠程服務的調用完成後,HSF會使用響應結果回調此處配置的listener,該listener需要實現HSFResponseCallback介面。
proxyStyle
String
否
jdk
設定服務的代理模式,一般不用配置。如果要攔截這個consumer bean,需要配置成javassist。
Spring配置方式 - HSFSpringConsumerBean
通過在Spring設定檔中,配置一個class為com.taobao.hsf.app.api.util.HSFSpringConsumerBean的bean,即可實現服務的訂閱。
範例程式碼
<bean id="helloWorldService" class="com.taobao.hsf.app.spring.util.HSFSpringConsumerBean"> <!-- [必選] 設定需要訂閱服務的介面名 --> <property name="interfaceName" value="com.taobao.hsf.test.HelloWorldService" /> <!-- [必選] 設定需要訂閱服務的版本號碼 --> <property name="version" value="1.0.0" /> <!-- [必選] 設定需要訂閱服務的組別 --> <property name="group" value="HSF" /> <!-- [可選] 佈建要求逾時時間(單位:毫秒)。如果用戶端在設定的時間內沒有收到服務端響應,則拋出HSFTimeOutException --> <!-- 若用戶端設定了clientTimeout,則優先順序高於服務端設定的clientTimeout。否則,在服務的遠程調用過程中,使用服務端設定的clientTimeout。--> <property name="clientTimeout" value="3000" /> <!-- [可選] 設定服務中某些方法的請求逾時時間,優先順序高於當前用戶端的clientTimeout --> <!-- 通過設定MethodSpecial.methodName指定方法名,通過設定MethodSpecial.clientTimeout指定當前方法的逾時時間 --> <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> <!-- [可選] 設定同步等待ConfigServer推送地址的時間(單位:毫秒)--> <!-- 從而避免因地址還未推送到就發起服務調用造成的HSFAddressNotFoundException --> <!-- 一般建議設定為5000毫秒,即可滿足推送等待時間 --> <property name="maxWaitTimeForCsAddress" value="5000"/> <!-- [可選] 設定需要非同步呼叫的方法列表。List中的每一個字串的格式為:--> <!-- name:方法名 --> <!-- type:非同步呼叫類型 --> <!-- listener:監聽器 --> <!-- 其中,listener只對callback類型的非同步呼叫生效--> <!-- type的類型有: --> <!-- future: 通過Future的方式去擷取請求執行的結果 --> <!-- callback: 當遠程服務的調用完成後,HSF會使用響應結果回調此處配置的listener,該listener需要實現HSFResponseCallback介面 --> <property name="asyncallMethods"> <list> <value>name:sayHello;type:callback;listener:com.taobao.hsf.test.service.HelloWorldServiceCallbackHandler</value> </list> </property> <!-- [可選] 設定服務的代理模式,一般不用配置。如果要攔截這個consumer bean,需要配置成javassist --> <property name="proxyStyle" value="jdk" /> </bean>