码迷,mamicode.com
首页 > 其他好文 > 详细

hsf入门

时间:2015-08-06 13:16:45      阅读:986      评论:0      收藏:0      [点我收藏+]

标签:中间件   hsf   

hsf是淘宝的中间件,主要介绍下如何使用
新人手册
PS:jetty的插件自己下,提供的地址已失效。


原理:你做了一个基于接口的功能,把接口提供出去,把功能实现的机器部署起来,然后用户使用该接口从hsf服务器上获得提供该功能的机器地址,去调用。

如何将Spring bean对外发布,以供远程调用  

    已有一个名称为HelloWorld的Spring Bean,此Bean实现的接口为com.taobao.hsf.test.HelloWorld,现需让其他功能模块能远程调用此Spring Bean;  
    * 增加一个如下内容的Spring Bean XML:   

<beans>  

 <bean class="com.taobao.hsf.app.spring.util.HSFSpringProviderBean">  

       serviceInterface必须配置[String],为服务对外提供的接口  
   <property name="serviceInterface">  
     <value>com.taobao.hsf.test.HelloWorld</value>  
   </property>  

       target必须配置[ref],为需要发布为HSF服务的spring bean id  
   <property name="target">  
     <ref bean="HelloWorld"/>  
   </property>  

       serviceVersion为可选配置[String],含义为服务的版本,默认为1.0.0  
   <property name="serviceVersion">  
     <value>1.1.0</value>不要有空白字符/回车换行  
   </property>  

       serviceName为推荐配置[String],含义为服务的名称,便于管理,默认为null  
   <property name="serviceName">  
     <value>HelloWorldService</value>  
   </property>  

       serviceDesc为可选配置[String],含义为服务的描述信息,便于管理,默认为null  
   <property name="serviceDesc">  
     <value>HelloWorldService providered by HSF</value>  
   </property>  

       serviceGroup为可选配置[String],含义为服务所属的组别,相当于此机器所在的VIP,默认为HSF  
   <property name="serviceGroup">  
      <value>HSF</value>  
   </property>  

       supportAsynCall为可选配置[true|false],含义为标识此服务是否支持持久可靠的异步调用  
       默认值为false,也就是不支持持久可靠的异步调用,但仍然支持非持久可靠的oneway、future以及callback方式的异步调用  
   <property name="supportAsynCall">  
     <value>false</value>  
   </property>  

       clientTimeout为可选配置[int],含义为客户端调用此服务时的超时时间,单位为ms,默认为3000ms  
   <property name="clientTimeout">  
     <value>3000</value>  
   </property>  

       clientIdleTimeout为可选配置[int],含义为客户端连接空闲的超时时间,单位为s,默认为600  
   <property name="clientIdleTimeout">  
     <value>60</value>  
   </property>  

       serializeType为可选配置[String(hessian|java)],含义为序列化类型,默认为hessian  
   <property name="serializeType">  
     <value>java</value>  
   </property>  

       methodToInjectConsumerIp为可选配置,含义为注入调用端IP的方法,这样业务服务也可以得知是哪个IP在调用,该方法的参数必须为String  
   <property name="methodToInjectConsumerIp">  
     <value>setConsumerIP</value>  
   </property>  

       methodSpecials为可选配置,含义为为方法单独配置超时时间,这样接口中的方法可以采用不同的超时时间  
   <property name="methodSpecials">  
     <list>  
       <bean class="com.taobao.hsf.model.metadata.MethodSpecial">  
          <property name="methodName" value="sum" />  
          <property name="clientTimeout" value="10000" />  
       </bean>  
     </list>  
   </property>  
 </bean>  

</beans>  

    将此XML加入到Spring加载的applicationContext文件中;  
    按项目正常方式打包部署,启动JBoss,此HelloWorld就可被远程以HSF服务的方式调用了。  
    注意:序列化注意事项   

如何在Spring中远程调用其他系统提供的HSF服务  

    在Spring中需远程调用一个接口为com.taobao.hsf.test.HelloWorld,版本为1.1.0的服务,需调用此服务的Spring bean名称定为CallHelloWorld;  
    * 增加一个如下内容的Spring Bean XML:   

<beans>  

 <bean id="CallHelloWorld" class="com.taobao.hsf.app.spring.util.HSFSpringConsumerBean">  

     interfaceName必须配置[String],为需要调用的服务的接口  
   <property name="interfaceName">  
     <value>com.taobao.hsf.test.HelloWorld</value>  
   </property>  

     version为可选配置[String],含义为需要调用的服务的版本,默认为1.0.0  
   <property name="version">  
     <value>1.1.0</value>  
   </property>  

     group为可选配置[String],含义为需要调用的服务所在的组,默认为HSF  
   <property name="group">  
     <value>HSF</value>  
   </property>  

     methodSpecials为可选配置,含义为为方法单独配置超时时间,这样接口中的方法可以采用不同的超时时间  
   <property name="methodSpecials">  
     <list>  
       <bean class="com.taobao.hsf.model.metadata.MethodSpecial">  
         <property name="methodName" value="sum" />  
         <property name="clientTimeout" value="10000" />  
       </bean>  
     </list>  
   </property>  

     target为可选配置[String],含义为需调用的服务的地址和端口  
     主要用于单元测试环境和hsf.runmode=0的开发环境中,在运行环境下,此属性将无效,而是采用配置中心推送回来的目标服务地址信息  
   <property name="target">  
       <value>10.1.6.57:12200?_TIMEOUT=1000</value>  
   </property>  

asyncallMethods为可选配置[List],含义为调用此服务时需要采用异步调用的方法名列表以及异步调用的方式 默认为空集合,即所有方法都采用同步调用  

   <property name="asyncallMethods">  
     <list>  

格式为: name:方法名;type:异步调用类型;  

type默认为oneway,支持的种类有:oneway、future、callback、reliable和reliablecallback  

oneway的含义为单向的异步调用,即发起请求后不管执行结果,如果调用的目标服务器不可用,则此次调用会失败,但仅会在日志中记录  

future的含义为通过Future的方式去获取请求执行的结果,例如先调用下远程的接口,接着继续做别的事情,然后再通过Future来获取结果  

callback的含义为当远程服务执行完毕后,会将结果回调此处所配置的callbackhandler  

reliable的含义为单向的可靠持久异步调用,和oneway的不同在于,即使调用的目标服务器暂时不可用,在其可用后仍然会保证调用成功 reliablecallback的含义为当异步可靠的执行远程服务后,会将结果可靠的回调此处所配置的callbackhandler  

       <value>name:save</value>  
     </list>  
   </property>  

     设置回调的处理器,此处理器不用实现HSF的任何接口,方法遵循以下约定即可  
     public void ${name}_callback(Object invokeContext, Object appResponse, Throwable t),其中${name}即为发起调用的远程服务的方法名  
   <property name="callbackHandler" ref="PlugServiceCallbackHandler" />  

     设置传递上下文的方式为接口方式,即在发起调用时先调用接口上的setInvokeContext方法传入上下文对象  
   <property name="interfaceMethodToAttachContext" value="setInvokeContext" />  

   设置传递上下文的方式为ThreadLocal对象方式,即在发起调用时通过一个ThreadLocal对象来设置上下文对象,接口方式和ThreadLocal对象方式选其一即可  
   <property name="invokeContextThreadLocal" ref="invokeContextThreadLocal" />   
 </bean>  

</beans>  

    将此XML加入到Spring加载的ApplicatonContext文件中去;  
    按项目正常方式打包部署,启动JBoss,当存在接口为com.taobao.hsf.test.HelloWorld,版本为1.1.0的服务时,当调用CallHelloWorld时,就会自动的调用远程的服务

常见问题

Hsf用Junit来测试运行,需要的依赖如下,其中com.taobao.hsf hsf.app.spring 2.0.1.9 这个很重要,文档中缺失。Hsfunit 用1.0.6版本
@Test中要有下面这句静态加载

static {
        HSFEasyStarter.start("src/test/resources", "2.0.1.9");
}

使用高版本的hsf控件,不然错误很奇葩。

配置文件中使用com.taobao.hsf.app.spring.util.HSFSpringConsumerBean 这个class
Hsf调用中间件的时候getBean使用的是
com.taobao.hsf.app.spring.util.HSFSpringConsumerBean 这个类的ID加载xml配置文件的时候,不成功原因:

xml文件中的类或xml本身加载不成功
Hsf消费者端调用的接口也需要引用进来再使用。

接口、Spring都是用来解耦,增加中间部件屏蔽提供方的修改产生的影响。

关于classpath

XML文件等资源在Maven中放在/src/main/resources(这里是就是classpath)
系统运行时的classpath用this.getClass().getResource(“”)查看
或者是用src/main/resources/Info.xml
“**/” 表示的是任意目录;
*/applicationContext-.xml”
表示任意目录下的以”applicationContext-“开头的XML文件。
程序部署到tomcat后,src目录下的配置文件会和class文件一样,自动copy到应用的 WEB-INF/classes目录下 classpath:与classpath*:的区别在于, 前者只会从第一个classpath中加载,而 后者会从所有的classpath中加载

版权声明:本文为博主原创文章,未经博主允许不得转载。

hsf入门

标签:中间件   hsf   

原文地址:http://blog.csdn.net/gg_gogoing/article/details/47314739

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!