一、背景

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

  1. 淘宝分布式NOSQL框架:Tair

    Tair 分布式K-V存储方案 tair 是淘宝的一个开源项目,它是一个分布式的key/value结构数据的解决方案. 作为一个分布式系统,Tair由一个中心控制节点(config server)和一 ...

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

    KISSY 是淘宝一个开源的 JavaScript 库,包含的组件有:日历.图片放大镜.卡片切换.弹出窗口.输入建议等 一.简介 KISSY 是一款跨终端.模块化.高性能.使用简单的 JavaScri ...

  3. 【Tair】淘宝分布式NOSQL框架:Tair

    Tair是淘宝的一个开源项目,它是一个分布式的key/value结构数据的解决方案. 一.基本组成 作为一个分布式系统,Tair由一个中心控制节点(config server)和一系列的服务节点(da ...

  4. 淘宝开源任务调度框架tbschedule

    背景 分布式任务调度是非常常见的一种应用场景,一般对可用性和性能要求不高的任务,采用单点即可,例如linux的crontab,spring的quarz,但是如果要求部署多个节点,达到高可用的效果,上面 ...

  5. 笔者带你剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER)

    注:本文部分内容引用本人博客http://gao-xianglong.iteye.com/blog/1973591   前言 在开始讲解淘宝的TDDL(Taobao Distribute Data L ...

  6. 淘宝可伸缩高性能互联网架构HSF(转)

    文章转自http://blog.csdn.net/hpf911/article/details/14165865 时间过得很快,来淘宝已经两个月了,在这两个月的时间里,自己也感受颇深.下面就结合淘宝目 ...

  7. [转帖]剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER)

    剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER) 博客分类: 原博客地址: http://qq85609655.iteye.com/blog/2035176 distrib ...

  8. “淘宝技术这十年”

    "少时淘气,大时淘宝" 时势造英雄 起因eBay 易趣 在资本方面对仗,阿里想趁此崛起新项目就要求能在短时间内做出一个 个人对个人的商品交易网站(C2C)2003年4月7日-5月1 ...

  9. 淘宝分布式数据层TDDL

    剖析淘宝 TDDL ( TAOBAO DISTRIBUTE DATA LAYER ) 注:原文:http://gao-xianglong.iteye.com/blog/1973591   前言 在开始 ...

随机推荐

  1. 一致性哈希(consistent hashing)算法

    文章同步发表在博主的网站朗度云,传输门:http://www.wolfbe.com/detail/201608/341.html 1.背景        我们都知道memcached服务器是不提供分布 ...

  2. JS判断鼠标从什么方向进入一个容器

    偶然将想到的一个如何判断鼠标从哪个方向进入一个容器的问题.首先想到的是给容器的四个边添加几个块,然后看鼠标进入的时候哪个块先监听到鼠标事件.不过这样麻烦太多了.google了一下找到了一个不错的解决方 ...

  3. SQLite简易入门

    本文内容来源:https://www.dataquest.io/mission/129/introduction-to-sql 本文所用数据来源:https://github.com/fivethir ...

  4. hdu 5545 The Battle of Guandu spfa最短路

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5545 题意:有N个村庄, M 个战场: $ 1 <=N,M <= 10^5 $; 其中曹 ...

  5. Zend-MVC事件

    Zend\Mvc\MvcEvent继承自Zend\EventManager\Event,在Zend\Mvc\Application::bootstrap()执行时触发.如果你的控制器实现了Zend\M ...

  6. OJ网站程序员必备

    一. Online Judge简介: Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序多种程序(如C.C++.Pascal)源代码,系统对源代码进行编译和执行,并通过 ...

  7. C/C++ 内联函数

    内联函数具备一般函数的性质,但是不需要调用,而是在编译阶段,会用函数体替换函数名被调用的地方.可以节省调用时间(进出栈.保存上下文). 在编译层面和宏的作用相同.内联函数的展开在编译阶段,宏展开在预处 ...

  8. 使用go语言后的感受

    前两天我说过为了学习go语言去学习了一遍python,当我完成了python的学习后,昨天中午就去学习了go语言.以下简称之为golang. 我用的操作系统是windows xp,golang对xp还 ...

  9. 【个人笔记】001-PHP基础-01-PHP快速入门-01-PHP职业路线及PHP前景

    001-PHP基础-01-PHP快速入门 01-PHP职业路线及PHP前景 PHP职业路线 PHP初级工程师 1年以下 3k-6k PHP中级工程师 1-3年6k-10k PHP高级工程师 3年以上  ...

  10. 在云服务器搭建WordPress博客(五)创建和管理文章分类

    不同主题的文章划分到不同的分类,有助于访客寻找他们想要的内容,提高用户体验.所以,为你的网站创建文章分类是很有必要的.那么,WordPress系统如何创建和管理文章分类呢?今天倡萌就简单介绍一下. 创 ...