`

淘宝(taobao)HSF框架

 
阅读更多

一、背景

      随着网站访问量增加,仅仅靠增加机器已不能满足系统的要求,于是需要对应用系统进行垂直拆分和水平拆分。在拆分之后,各个被拆分的模块如何通信?如何保证性能?如何保证各个应用都以同样的方式交互?这就需要一种负责各个拆分的模块间通信的高性能服务框架(HSF)。

二、HSF做的事情

 

1. 标准Service方式的RPC

    1). service定义:基于OSGI的service定义方式

    2). TCP/IP通信:

           IO方式:nio,采用mina框架

           连接方式:长连接

           服务器端有限定大小的连接池

           WebService方式

    3). 序列化:hessian序列化机制

 

2. 软件负载体系

    采用软件实现负载均衡,支持随机、轮询、权重、按应用路由等方式。软件负载均衡没有中间点,通过配置中心统一管理。配置中心收集服务提供者和消费者的注册信息,以推送的方式发送到服务消费者直接使用,不经过中间点;注册中心可以感应服务器的状态,出现failover时,实现注册信息重新推送。

3. 模块化、动态化

4. 服务治理

    服务治理利用注册中心实现服务信息管理(服务提供者、调用者信息查询)、服务依赖关系分析、服务运行状况感知、服务可用性保障,如:路由调整、流量分配、服务端降级、调用端降级等

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/marine2010/archive/2010/03/21/5401366.aspx

背景: WEBX -- 阿里巴巴网站所采用的WEB应用框架.

HSF接口: com.taobao.item.service.ItemQueryService

需求: 根据商品ID取得商品信息

载体: TBCMS系统

实现步骤: 1. 创建 /bundle/war/src/webroot/META-INF/autoconf/item-hsf-xml.vm

代码:
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
  <bean id="itemQueryService" class="com.taobao.hsf.app.spring.util.HSFSpringConsumerBean" init-method="init">
   <property name="interfaceName">
    <value>com.taobao.item.service.ItemQueryService</value>
   </property>
   <property name="version">
    <value>${item_provide_service_version}</value>
   </property>
   <!--asyncallMethods为可选配置[List],含义为调用此服务时需要采用异步调用的方法名列表,默认为空集合,即所有方法都采用同步调用-->
   <property name="asyncallMethods">
    <list>
</list>
</property>
</bean>

</beans>  

2.其中: ${item_provide_service_version} 需要在 auto-config.xml 中配置,在 <group name="arkcms-bundle-war"> ...</group>中增加:

<property name="item.provide.service.version" defaultValue="1.0.0.daily" desc="itemClient调用版本"/>

同时在 <script>...</script>中增加:

<generate template="item-hsf.xml.vm" destfile="WEB-INF/biz/bean/item-hsf.xml" charset="GBK"/>

3.在 /bundle/war/src/webroot/WEB-INF/cms-biz-services.xml中增加:

        <service name="BeanFactoryService" class="com.alibaba.service.spring.DefaultBeanFactoryService">
            <property name="bean.descriptors">

                     ....................

                    <value>/cms/biz/bean/item-hsf.xml</value>
            </property>
        </service>

至此,我们已经引入了ItemQueryService的HSF服务.

4. 接下来我们就要做Servlet接口了,当然写一个servlet直接调用hsf也是可以的,但是从结构考虑,我们还是先本地封装一层先.

但是首先,需要对 /all/project.xml 中需要增加对ItemQueryService的支持:

    <projects name="taobao/itemcenter" version="1.9.5">
     <project id="taobao/itemcenter/itemcenter-client"/>
     <project id="taobao/itemcenter/itemcenter-common"/>
    </projects>

并在/biz/project.xml和/web/project.xml中增加:

<?xml version="1.0" encoding="GB2312"?>

<project id="tbcms/web" extends="../all/project.xml">
    <build>
        <dependencies>
                  ............
        <include uri="taobao/itemcenter/itemcenter-client"/>
        <include uri="taobao/itemcenter/itemcenter-common"/>

        </dependencies>
    </build>
</project>

命令行模式下执行:antx reactor goals=eclipse来执行对依赖包的装载.(前提是对/antx/repository.project/taobao/itemcenter/进行SVN更新)

本地封装: 在/biz/src/java/com/ark/cms/biz/util/item/下创建ItemService.java接口:

package com.ark.cms.biz.util.item;

import com.taobao.item.domain.DbRoute;
import com.taobao.item.domain.query.ItemIdDO;
import com.taobao.item.domain.result.ItemResultDO;
import com.taobao.item.exception.IcException;
/**
 * 根据id取得商品信息
 * @author duxing
 *
 */
public interface ItemService {
 public ItemResultDO getItemById(ItemIdDO itemId,DbRoute mainDbRoute) throws IcException;
}
 

在biz/src/java/com/ark/cms/biz/util/item/impl/下 ItemServiceImpl.java进行实现:

package com.ark.cms.biz.util.item.impl;

import com.ark.cms.biz.util.item.ItemService;
import com.taobao.item.domain.DbRoute;
import com.taobao.item.domain.query.ItemIdDO;
import com.taobao.item.domain.query.QueryItemOptionsDO;
import com.taobao.item.domain.result.ItemResultDO;
import com.taobao.item.exception.IcException;
import com.taobao.item.service.ItemQueryService;

/**
 * 根据id取得商品信息 实现
 * @author duxing
 *
 */

public class ItemServiceImpl implements ItemService {

 private ItemQueryService itemQueryService;

 public void setItemQueryService(ItemQueryService itemQueryService) {
  this.itemQueryService = itemQueryService;
 }

 @SuppressWarnings("deprecation")
 public ItemResultDO getItemById(ItemIdDO itemId, DbRoute mainDbRoute) throws IcException {
  QueryItemOptionsDO options = null;
  return itemQueryService.queryItemById(itemId, options, mainDbRoute);
 }

}
然后将此接口移交给spring,在 /bundle/war/src/webroot/META-INF/autoconf/item-hsf-xml.vm中增加 

<bean id="itemService" class="com.ark.cms.biz.util.item.impl.ItemServiceImpl"></bean>

至此,我们已经在spring中产生一个itemService

5.接下来创建servlet

在/web/src/java/com/ark/cms/web/下创建ItemServiceServlet.java

因为servlet中不能直接用set形式让spring来set itemService进来,所以只能采用一下方法获取itemService:

  BeanFactoryService beanFactory = (BeanFactoryService) BizServiceManager.getInstance().getService(BeanFactoryService.SERVICE_NAME);
  ItemService itemService = (ItemService) beanFactory.getBean("itemService");

完整代码如下:

package com.ark.cms.web;

import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.service.spring.BeanFactoryService;
import com.ark.cms.biz.core.BizServiceManager;
import com.ark.cms.biz.util.item.ItemService;
import com.taobao.item.domain.DbRoute;
import com.taobao.item.domain.ItemDO;
import com.taobao.item.domain.query.ItemIdDO;
import com.taobao.item.domain.result.ItemResultDO;
import com.taobao.item.exception.IcException;


/**
 * 根据id取得商品大图的接口
 * @author duxing
 *
 */
public class ItemServiceServlet extends HttpServlet {

 private static final long serialVersionUID = -3348559907279438489L;

 @Override
 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
// http://item.taobao.com/auction/item_detail-db1-67af640ba3f16a2006cd63f1f...
// long itemId=4399800173l;

  String item_id = request.getParameter("item_id");

  String xid = request.getParameter("xid");
  DbRoute mainDbRoute=DbRoute.getDbRouteByXid(xid);

  ItemIdDO itemIDDO=new ItemIdDO();
  if(item_id!=null){
   itemIDDO.setItemIdStr(item_id);
  }
  if(request.getParameter("item_num_id")!=null){
   Long item_num_id = Long.valueOf(request.getParameter("item_num_id"));
   itemIDDO.setItemId(item_num_id);
  }
  if(request.getParameter("id")!=null){
   Long id = Long.valueOf(request.getParameter("id"));
   itemIDDO.setItemId(id);
  }
// 两种id的传入方式
// itemIDDO.setItemId(itemId);
// itemIDDO.setItemIdStr("67af640ba3f16a2006cd63f1f5dddc271");

  ItemResultDO itemResultDO;
  BeanFactoryService beanFactory = (BeanFactoryService) BizServiceManager.getInstance().getService(BeanFactoryService.SERVICE_NAME);
  ItemService itemService = (ItemService) beanFactory.getBean("itemService");
  try {
   itemResultDO=itemService.getItemById(itemIDDO, mainDbRoute);
  } catch (IcException e) {
   e.printStackTrace();
   itemResultDO=new ItemResultDO();
  }

  ItemDO itemDO=itemResultDO.getItem();
  byte[] result="".getBytes();
  if(itemDO!=null){
   result=itemDO.getPictUrl().getBytes();
  }
  response.setContentType("text/xml;charset=gb2312");
  response.setContentLength(result.length);
  OutputStream out = response.getOutputStream();
  out.write(result);
  out.flush();

 }
}
6.servlet写好了之后我们就要配置进WEBX了:

在 /bundle/war/src/webroot/META-INF/autoconf/web.xml.vm中增加:

      <servlet-mapping>

        <servlet-name>ItemServiceServlet</servlet-name>
        <url-pattern>/item/query</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>ItemServiceServlet</servlet-name>
        <servlet-class>com.ark.cms.web.ItemServiceServlet</servlet-class>
    </servlet>

7.至此,开发完成 

命令行模式下执行:antx reactor goals=clean,default来对项目重新编译打包.重启本地服务器进行测试.

对/item/query接口进行post的时候触发此servlet.

分享到:
评论

相关推荐

    taobao-hsf.sar

    "taobao-hsf.sar"文件是HSF框架的一个打包文件,其后缀名"SAR"代表Service Archive,类似于Java中的WAR或EAR文件,是HSF服务的容器。SAR文件通常包含了HSF服务的所有必要组件,如配置文件、服务接口类、实现类、依赖...

    taobao-hsf.tgz

    淘宝HSF(High Speed Service Framework)是阿里巴巴开源的一款高性能、轻量级的服务框架,主要用于构建大规模分布式服务系统。HSF全称为High Speed Service Framework,它基于Java语言开发,旨在提高服务调用的效率...

    淘宝HSF使用说明

    淘宝的HSF框架,用户手册,有兴趣的人欢迎下载~内部文档哦~

    Springboot+HSF分布式服务框架+EDAS注册中心,实现发布订阅模式

    HSF,全称High Speed Service Framework,是阿里巴巴内部广泛使用的高性能RPC框架。HSF支持服务治理,包括服务注册、服务发现、负载均衡、熔断、降级等,为微服务架构提供了坚实的基础。HSF通过接口定义、服务提供者...

    淘宝好舒服 taobao-hsf

    "淘宝好舒服"(Taobao-HSF)是一个专为阿里巴巴集团内部设计的高性能服务框架,全称为High Speed Service。这个框架主要用于实现企业级的服务化架构,提供高效、稳定、灵活的服务调用解决方案。HSF是淘宝核心的服务...

    taobao-HSF的两种安装方案

    标题中的“taobao-HSF”指的是淘宝的High Speed Service(HSF)框架,它是一个高性能、高可用的服务治理框架,主要用于阿里巴巴集团内部的分布式服务调用。HSF提供了包括服务发现、服务调用、负载均衡、熔断保护等一...

    taobao-hsf

    【标题】"taobao-hsf" 是一个与阿里巴巴云服务相关的技术组件,它主要用于构建分布式服务框架。在阿里云的生态系统中,HSF(High Speed Service Framework)是为大规模分布式服务设计的一种高性能、高可用的服务化...

    淘宝技术框架分析报告.doc

    淘宝技术框架分析报告中,讨论了淘宝在技术架构方面的设计和实现,涵盖了CDN技术、多数据中心策略、LVS技术、Session框架、HSF框架等方面的内容。 首先,淘宝使用CDN技术来解决不同运营商网络之间的互访性能问题,...

    阿里hsf接口 sar包

    在描述中提到的"taobao-hsf.sar1.zip"和"taobao-hsf.sar.zip",很可能是两个不同版本或者不同配置的HSF服务 SAR 包。开发者可能根据实际场景选择合适的SAR包,例如在遇到调用问题时,尝试更换不同版本的SAR包可能会...

    HSF服务框架共28页.pdf.zip

    HSF(High Speed Service Framework)是阿里巴巴开源的一款高性能、轻量级的服务框架,主要用于构建分布式服务系统。HSF是基于Java开发的,它提供了一种简单、高效的方式来进行服务的发布、消费和服务治理。在本...

    HSF项目例子IDEA 与 eclipse 开发环境说明

    HSF(High Speed Service Framework,高速服务框架)是阿里巴巴开源的一款高性能、轻量级的服务治理框架,主要用于构建分布式服务系统。HSF使得开发者能够轻松地将业务服务包装为高可用、可扩展的服务,并且提供了...

    HSF实现原理讲解

    HSF 框架的原理讲解,主要包含了知识点:rpc,动态代理,HSF可以作为微服务的基础框架进行二次开发

    纯Java的高性能长连接RPC解决方案.docx

    首先,HSF框架是一个高性能远程通信框架,底层基于Netty实现TCP通信,对上层进行封装,提供易于使用和高度可扩展能力。HSF框架的核心组件包括Channel、ChannelGroup、ChannelHandler等。 Channel是HSF框架中的一个...

    阿里巴巴中间件hsf介绍

    内部分享的hsf使用介绍文档(无涉密信息),有兴趣的同学可以看看

    HSF and 编码规范

    HSF(High Speed Service Framework,高速服务框架)是阿里巴巴开源的一款分布式服务框架,它基于Java语言,主要用于构建高性能、高可用的微服务体系。HSF旨在简化服务的开发、调用和治理,使得开发者可以专注于业务...

    taobao tomcat

    1. **HSF (High Speed Service Framework)**:HSF是淘宝内部开发的一款高性能、轻量级的RPC框架,用于实现服务化架构中的服务调用。HSF.sar是HSF服务在Tomcat中的实现形式,它使得Tomcat能够直接支持HSF服务的发布和...

    EDAS-HSF-BOOT

    HSF(High Speed Service Framework)是阿里云EDAS中的核心组件,它是一个高性能、轻量级的Java服务框架,用于构建微服务架构。HSF-BOOT则是一个帮助开发者快速启动HSF服务的引导项目,它简化了HSF服务的开发流程,...

    分布式服务框架原理与实践(Dubbo,HSF)_李林锋著

    《分布式服务框架原理与实践(Dubbo,HSF)_李林锋著》这本书深入探讨了分布式服务框架的关键技术和实际应用,主要聚焦于两个知名的开源框架——Dubbo和HSF。这两者都是实现高效率、可扩展的分布式服务的核心工具,尤其...

Global site tag (gtag.js) - Google Analytics