在spring mvc 的项目开发中,由于各个系统之间需要进行数据的传递,因此,一些公司都是通过基于服务的接口方式提供数据,在淘宝,是通过hsf服务的方式开放自己应用的接口,达到数据在各个应用间的流动和互用。同时也达到了分布式开发的目的。这样的好处是显而易见的,通过HSF,我们可以将业务进行拆分,例如可以拆分为订单团队,账号团队,商品团队。而这些团队之间本身的业务会有一些依赖,这些依赖就能通过HSF来解决。
如何运行:
运行HSF项目,需要下载带有HSF 包的web容器 jetty。
HSF组成:
hsf由提供者和消费者组成。
消费者:使用接口的一方。例如我是订单团队的开发者,我在开发下单流程中,需要使用用户的账号,这个时候,我就可以通过配置好的HSF 直接调用账号团队的API。
提供者:提供接口的一方。例如是账号团队,提供给订单团队API使用。账号团队首先会提供一个interface的jar包供订单团队下载查看提供的接口,账号团队通过hsf就可以调用这些接口,而账号团队对外提供的只是interface,而具体实现还在自己这边。
提供者:
假如我要提供一个hello的服务给外部团队使用,使用HSF必须在Service层需要有interface和具体实现。具体代码如下:
HelloWorldService.java
package com.yunos.account.biz.service;public interface HelloWorldService { public String get();}
HelloWorldServiceImp.java
package com.yunos.account.biz.service.impl;import com.yunos.account.biz.service.HelloWorldService;public class HelloWorldServiceImpl implements HelloWorldService { @Override public String get() { return "Hello World"; }}
这个是我的代码,但是我要提供出去我写的这个代码的服务,则需要做两步工作:
1. 将interface的代码打成Jar包,放进maven仓库中,供使用者下载使用,并且interface中需要有详细的接口注释。而具体代码实现则不需要放进jar包中。
2. 配置hsf.xml文件,将代码服务提供出去。
<bean id="helloWorldServiceImpl" class="com.xxx.xxx.biz.service.impl.HelloWorldServiceImpl" /> <bean id="helloWorldServiceProvider" class="com.taobao.hsf.app.spring.util.HSFSpringProviderBean" init-method="init"> <property name="serviceInterface"> <value>com.yunos.account.biz.service.HelloWorldService</value> </property> <property name="target"> <ref bean="helloWorldServiceImpl" /> </property> <property name="serviceName"> <value>HelloWorldService</value> </property> <property name="serviceVersion"> <value>1.0.0.daily</value> </property> <property name="serviceGroup"> <value>HSF</value> </property> </bean>
服务提供成功后,一般在淘宝的HSF服务管理中心可以查看到这个HSF服务。
消费者:
消费者是使用HSF服务的用户。使用HSF管理中心中用户提供的HSF服务的时候,首先需要配置一份HSF.XML的配置。
<bean name="HelloWorldService" class="com.taobao.hsf.app.spring.util.HSFSpringConsumerBean" init-method="init"> <property name="interfaceName" value="com.xxx.xxx.biz.service.impl.HelloWorldService" /> <property name="version" value="1.0.1" /> </bean>这个时候,就基本上说明了需要使用这个服务。
我们封装了一个函数:
public class CommonServiceImpl implements CommonService { @Autowired private Gson gson; /** * 获取HSF ApplicationContext * @return ClassPathXmlApplicationContext */ public ClassPathXmlApplicationContext getHsfApplicationContext() { return new ClassPathXmlApplicationContext("hsf.xml"); } /** * 返回json格式字符串 * @param status 状态码 * @param message 提示信息 * @param data 数据 * @return String */ public String returnJson(ApiReturnBo apiReturnData) { return gson.toJson(apiReturnData); } }
具体使用:
ClassPathXmlApplicationContext applicationContext = commonService.getHsfApplicationContext();HelloWorldService helloWorldService = (HelloWorldService) applicationContext.getBean("HelloWorldService");