日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

淘寶(taobao)HSF框架

 hmtomyang 2012-04-12

淘寶(taobao)HSF框架

作者:menghe  來源:博客園  發(fā)布時(shí)間:2010-12-16 22:19  閱讀:613 次  原文鏈接   [收藏]  

一、背景

      隨著網(wǎng)站訪問量增加,僅僅靠增加機(jī)器已不能滿足系統(tǒng)的要求,于是需要對應(yīng)用系統(tǒng)進(jìn)行垂直拆分和水平拆分。在拆分之后,各個(gè)被拆分的模塊如何通信?如何保證性能?如何保證各個(gè)應(yīng)用都以同樣的方式交互?這就需要一種負(fù)責(zé)各個(gè)拆分的模塊間通信的高性能服務(wù)框架(HSF)。

二、HSF做的事情

 

1. 標(biāo)準(zhǔn)Service方式的RPC

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

    2). TCP/IP通信:

           IO方式:nio,采用mina框架

           連接方式:長連接

           服務(wù)器端有限定大小的連接池

           WebService方式

    3). 序列化:hessian序列化機(jī)制

  •  

    2. 軟件負(fù)載體系

        采用軟件實(shí)現(xiàn)負(fù)載均衡,支持隨機(jī)、輪詢、權(quán)重、按應(yīng)用路由等方式。軟件負(fù)載均衡沒有中間點(diǎn),通過配置中心統(tǒng)一管理。配置中心收集服務(wù)提供者和消費(fèi)者的注冊信息,以推送的方式發(fā)送到服務(wù)消費(fèi)者直接使用,不經(jīng)過中間點(diǎn);注冊中心可以感應(yīng)服務(wù)器的狀態(tài),出現(xiàn)failover時(shí),實(shí)現(xiàn)注冊信息重新推送。

    3. 模塊化、動態(tài)化

    4. 服務(wù)治理

        服務(wù)治理利用注冊中心實(shí)現(xiàn)服務(wù)信息管理(服務(wù)提供者、調(diào)用者信息查詢)、服務(wù)依賴關(guān)系分析、服務(wù)運(yùn)行狀況感知、服務(wù)可用性保障,如:路由調(diào)整、流量分配、服務(wù)端降級、調(diào)用端降級等

     

    本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/marine2010/archive/2010/03/21/5401366.aspx

    背景: WEBX -- 阿里巴巴網(wǎng)站所采用的WEB應(yīng)用框架.

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

    需求: 根據(jù)商品ID取得商品信息

    載體: TBCMS系統(tǒng)

    實(shí)現(xiàn)步驟: 1. 創(chuàng)建 /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./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],含義為調(diào)用此服務(wù)時(shí)需要采用異步調(diào)用的方法名列表,默認(rèn)為空集合,即所有方法都采用同步調(diào)用-->
       <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調(diào)用版本"/>

    同時(shí)在 <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>

    至此,我們已經(jīng)引入了ItemQueryService的HSF服務(wù).

    4. 接下來我們就要做Servlet接口了,當(dāng)然寫一個(gè)servlet直接調(diào)用hsf也是可以的,但是從結(jié)構(gòu)考慮,我們還是先本地封裝一層先.

    但是首先,需要對 /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>

    命令行模式下執(zhí)行:antx reactor goals=eclipse來執(zhí)行對依賴包的裝載.(前提是對/antx/repository.project/taobao/itemcenter/進(jìn)行SVN更新)

    本地封裝: 在/biz/src/java/com/ark/cms/biz/util/item/下創(chuàng)建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;
    /**
     * 根據(jù)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進(jìn)行實(shí)現(xiàn):

    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;

    /**
     * 根據(jù)id取得商品信息 實(shí)現(xiàn)
     * @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>

    至此,我們已經(jīng)在spring中產(chǎn)生一個(gè)itemService

    5.接下來創(chuàng)建servlet

    在/web/src/java/com/ark/cms/web/下創(chuàng)建ItemServiceServlet.java

    因?yàn)閟ervlet中不能直接用set形式讓spring來set itemService進(jìn)來,所以只能采用一下方法獲取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;


    /**
     * 根據(jù)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寫好了之后我們就要配置進(jìn)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.至此,開發(fā)完成 

    命令行模式下執(zhí)行:antx reactor goals=clean,default來對項(xiàng)目重新編譯打包.重啟本地服務(wù)器進(jìn)行測試.

    對/item/query接口進(jìn)行post的時(shí)候觸發(fā)此servlet.

      本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多