淘宝(taobao)HSF框架

http://www.cnblogs.com/mengheyun/archive/2010/12/16/1963077.html

一、背景

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

时间: 2024-08-28 18:03:55

淘宝(taobao)HSF框架的相关文章

《淘宝的Session框架》

分布式Session共享 使用Tair(key-value)存储session(其他:使用memcached存储session) 高并发下分布式问题 透明处理存储介质的故障转移 动态增删节点,减小“缓存颠簸”问题 保证数据在各个节点的分布均衡 Session 序列化和反序列化 BASE 策略 Eric A. Brewer 在 1988 年提出的 BASE 策略,即 Basically Available.Soft state.和Eventually consistent. 互联网大多数应用更强调

[KISSY5系列]淘宝全终端框架 KISSY 5--从零开始使用

KISSY 是淘宝一个开源的 JavaScript 库,包含的组件有:日历.图片放大镜.卡片切换.弹出窗口.输入建议等 一.简介 KISSY 是一款跨终端.模块化.高性能.使用简单的 JavaScript 框架. 除了完备的工具集合如 DOM.Event.Ajax.Anim 等它还提供了经典的面向对象.动态加载.性能优化解决方案作为一款全终端支持的 JavaScript 框架 KISSY 为移动终端做了大量适配和优化,让你的程序在全终端均能流畅运行 二.目录 1.KISSY5安装使用(一) 2.

【转载】淘宝架构框架发展史

转自 http://www.361way.com/taobao-architecture/1948.html      一.个人网站  2003 年 4 月 7 日,马云,在杭州,成立了一个神秘的组织.他叫来十位员工,要他们签了一份协议,这份协议要求他们立刻离开阿里巴巴,去做一个神秘的项目.这个项目要求绝对保密,老马戏称“连说梦话被老婆听到都不行,谁要是透漏出去,我将追杀到天涯海角”.这份协议是英文版的,匆忙之间,大多数人根本来不及看懂,但出于对老马的信任,都卷起铺盖离开了阿里巴巴. 他们去了一

淘宝架构框架

   一.个人网站  2003 年 4 月 7 日,马云,在杭州,成立了一个神秘的组织.他叫来十位员工,要他们签了一份协议,这份协议要求他们立刻离开阿里巴巴,去做一个神秘的项目.这个项目要求绝对保密,老马戏称"连说梦话被老婆听到都不行,谁要是透漏出去,我将追杀到天涯海角".这份协议是英文版的,匆忙之间,大多数人根本来不及看懂,但出于对老马的信任,都卷起铺盖离开了阿里巴巴. 他们去了一个神秘的据点 -- 湖畔花园小区的一套未装修的房子里,房子的主人是马云.这伙人刚进去的时候,马云给他们布

淘宝高可伸缩高性能架构的相关框架介绍

一 应用无状态(淘宝session框架) 俗话说,一个系 统的伸缩性的好坏取决于应用的状态如何管理.为什么这么说呢?咱们试想一下,假如我们在session中保存了大量与客户端的状态信 息的话,那么当保存状态信息的server宕机的时候,我们怎么办?通常来说,我们都是通过集群来解决这个问题,而通常 所说的集群,不仅有负载均衡,更重要的是要有失效恢复failover,比如tomcat采 用的集群节点广播复制,jboss采 用的配对复制等session状 态复制策略,但是集群中的状态恢复也有其缺点,那

淘宝技术发展

转载 http://blog.csdn.net/kobejayandy/article/details/8685271 目录 一.引言 二.个人网站 三.Oracle/支付宝/旺旺 四.淘宝技术发展(Java时代:脱胎换骨) 五.淘宝技术发展(Java时代:坚若磐石) 六.淘宝技术发展(Java时代:创造技术-TFS) 七.淘宝技术发展(分布式时代:服务化) 作者:赵超 一.引言 光棍节的狂欢 “时间到,开抢!”坐在电脑前早已等待多时的小美一看时间已到 2011 年 11 月 11 日零时,便迫

淘宝整体架构

一应用无状态(淘宝session框架) 假如在session中保存了大量与客户端的状态信息,保存状态信息的server宕机时 通常通过集群解决,不仅有负载均衡,更重要的是要有失效恢复failover tomcat用集群节点广播复制,jboss用配对复制等session状态复制策略,但严重影响系统的伸缩性,不能通过增加更多的机器达到良好的水平伸缩 因为集群节点间session通信随着节点的增多而开销增大,因此要想做到应用本身的伸缩性,要保证应用无状态,这样集群中的各个节点来说都是相同的,使系统更好

【淘宝技术这十年】,读后总结篇-上

一看就是一天,晚饭忘了吃了.因为里面涉及的技术确实颇有传奇色彩. 突然觉得,没有时间看书,而且需要补充技术营养的技术宅来说,勤奋的渣渣我来提供福利了,萃取一些精华分享给大家吧 --------start---------------------------------------- 1.2007年分布式文件系统TFS(TaoBao File System)---->解决淘宝文件图片资源加载慢的问题 2Tair(淘宝自行研发的分布式KV存储方案)---->宝贝快照 3.淘宝研发了TimeTunn

《淘宝技术这十年》读书笔记 (四). 分布式时代和中间件

前面两篇文章介绍了淘宝的发展历程.Java时代的变迁和淘宝开始创新技术: <淘宝技术这十年>读书笔记 (一).淘宝网技术简介及来源 <淘宝技术这十年>读书笔记 (二).Java时代的脱胎换骨和坚若磐石 <淘宝技术这十年>读书笔记 (三).创造技术TFS和Tair 这篇文章主要讲述分布式时代和中间件相关知识,包括服务化.HSF.Notify和TDDL.同时里面有我们经常遇见的编码错误等相关问题,希望文章对你有所帮助! 一. 分布式时代 1.服务化 在系统发展的过程中,架构