<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ALL is Well!

    敏捷是一條很長的路,摸索著前進著

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      30 隨筆 :: 23 文章 :: 71 評論 :: 0 Trackbacks

    本文為原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處BlogJava

    在上一篇 Hessian構(gòu)建分布式系統(tǒng)應(yīng)用 的基礎(chǔ)上,我們對程序進行改進。
    現(xiàn)在有以下比較突出的問題:
    a.如果hessian服務(wù)端我要做的業(yè)務(wù)很多,怎么辦?
    我要定義很多個接口,然后再寫實現(xiàn)類,最煩的是還要配置它。
    我的設(shè)想是,hessian服務(wù)只提供一個歸口,再此對外的接口實現(xiàn)中反射調(diào)用具體的業(yè)務(wù)類。

    b.客戶端在調(diào)用時,每次調(diào)用遠程接口都要用以下代碼嗎:

    String url = "http://localhost:8080/HessianService/remote/service";
    HessianProxyFactory factory 
    = new HessianProxyFactory();
    ServiceRemote rmt 
    = (ServiceRemote) factory.create(ServiceRemote.class, url);


    顯然是不需要的。
    我們可以通過加入緩存的方式對其進行改良,我們也可以通過Spring在客戶端管理它。

    一、完善hessian服務(wù)端實現(xiàn):
    1.首先修改ServiceRemote接口:

    package com.al;

    import java.util.Map;

    @SuppressWarnings(
    "unchecked")
    public interface ServiceRemote  {
        
    public Map callService(String target, Map inputMap) throws Exception;
    }

    callService為統(tǒng)一入口,在此做如下約定:
    1)target字符串為要調(diào)用的service的完整類路徑+要調(diào)用的方法。
    2)service的方法均用以下方法簽名:
    public Map ***(Map inputMap);
    入?yún)镸ap,返回值也為Map,基本可以滿足所有情況了。(至少入?yún)镸ap,很適合調(diào)用iBatis來對DB進行操作。)

    2.修改接口實現(xiàn)類Service,此類不做具體業(yè)務(wù),而是反射調(diào)用具體業(yè)務(wù)類:

    package com.al;

    import java.lang.reflect.Method;
    import java.util.Map;

    import org.apache.commons.beanutils.MethodUtils;
    import org.apache.commons.lang.StringUtils;

    @SuppressWarnings(
    "unchecked")
    public class Service implements ServiceRemote {

        
    public Map callService(String target, Map inputMap) throws Exception {
            String className 
    = StringUtils.substringBeforeLast(target, ".");
            String methodName 
    = StringUtils.substringAfterLast(target, ".");
            Class serviceClass 
    = loadClass(className);
            Method method 
    = getMethod(serviceClass, methodName, Map.class);
            
    // 提供訪問效率
            method.setAccessible(true);
     
    // 調(diào)用具體業(yè)務(wù)類
            return (Map) method.invoke(serviceClass.newInstance(), inputMap);
        }

        
        
    private static <T> Class<T> loadClass(String className) throws ClassNotFoundException {
                
    return (Class<T>) getClassLoader().loadClass(className);
        }

        
        
    private static ClassLoader getClassLoader() {
            
    return Thread.currentThread().getContextClassLoader();
        }

        
        
    private static Method getMethod(Class<?> cls, String name, Class<?> parameterTypes) {
            
    return MethodUtils.getAccessibleMethod(cls, name, parameterTypes);
        }

    }

     

    3.舉個例子,服務(wù)端提供業(yè)務(wù)類DisplayUserService.java

    package com.al.service;

    import java.util.HashMap;
    import java.util.Map;

    @SuppressWarnings(
    "unchecked")
    public class DisplayUserService {
        
    public static final String selectUsers = "com.al.service.DisplayUserService.selectUsers";
        
    public static final String deleteUser = "com.al.service.DisplayUserService.deleteUser";
        
        
    public Map selectUsers(Map inputMap) {
            Map ret 
    = new HashMap();
            
    // 數(shù)據(jù)庫操作取得用戶列表 省略
            ret.put("User""User");
            
    return ret;
        }

        
        
    public Map deleteUser(Map inputMap) {
            
    // 數(shù)據(jù)庫操作取得用戶列表 省略
            return null;
        }

    }


    所有其他配置不變,請參考上一篇 Hessian構(gòu)建分布式系統(tǒng)應(yīng)用 。


    二、客戶端代碼的修改:
    1.加入spring進行管理:
    application.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
        
    <bean id="serviceRemote" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
            
    <property name="serviceUrl" value="http://localhost:8080/HessianService/remote/service" />
            
    <property name="serviceInterface" value="com.al.ServiceRemote" />
        
    </bean>
    </beans>

     

    2.客戶端如下調(diào)用即可:

    package com.ai.client;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import com.al.ServiceRemote;
    import com.al.service.DisplayUserService;

    public class ClientTest {
        
    public static void main(String[] args) throws Exception {
            ClassPathXmlApplicationContext cxt 
    = new ClassPathXmlApplicationContext("application.xml");
            ServiceRemote rmt 
    = (ServiceRemote)cxt.getBean("serviceRemote");
            System.out.println(rmt.callService(DisplayUserService.selectUsers, 
    null));
        }

    }


    另外一種方法是自己實現(xiàn)緩存。
    也就是第一次調(diào)用遠程代碼時生成ServiceRemote對象,將其保存在靜態(tài)的容器(HashMap)中,
    每次準(zhǔn)備調(diào)用此遠程代碼時,先判斷容器中是否有ServiceRemote對象,有則直接將其取出并使用即可,要注意的就是在這個容器上的同步問題。
    具體實現(xiàn)就不做了,很簡單。

    在項目中,對于客戶端代碼來講,還是有許多工作要做的:
    1) 如果我們要調(diào)用多個遠程服務(wù)怎么辦?
    我們要提供一個統(tǒng)一調(diào)用,將遠程調(diào)用的動作封裝起來,讓使用的人不知道自己調(diào)用了不同的遠程服務(wù)。
    只要調(diào)用某個方法、傳入?yún)?shù)即可。

    2) 如何方便開發(fā)員調(diào)試遠程的服務(wù)代碼?
    在做分布式系統(tǒng)開發(fā)的時候,如果每修改一下應(yīng)用層的service,就要對其進行發(fā)布,然后再去調(diào)用看是否已OK,那效率會很低。

    3) 如何管理多方調(diào)用的遠程服務(wù)?

    4) 如何提高遠程調(diào)用的效率?
    是否可以通過對 對象進行緩存、方法是否也可以緩存?甚至是對調(diào)用結(jié)果進行緩存?

    5) 等等..
    這些在具體的項目中都是不得不考慮的問題。以后再慢慢討論吧。

    posted on 2010-10-17 22:10 李 明 閱讀(1704) 評論(1)  編輯  收藏 所屬分類: J2EESpring

    評論

    # re: Hessian構(gòu)建分布式系統(tǒng)應(yīng)用[續(xù)][未登錄] 2012-08-11 15:07 哈哈
    目前我正考慮類似的方式構(gòu)建一個系統(tǒng)出現(xiàn)了一下問題:
    1.如你所說,如果只采用一個暴露接口,當(dāng)訪問量比較大時是不是有性能問題呢?
    2.服務(wù)端的業(yè)務(wù)異常信息如何返回給客戶端?比如,當(dāng)Insert一條數(shù)據(jù),ID重復(fù),目前我是返回一個錯誤碼給客戶端,客戶端根據(jù)錯誤碼得到相應(yīng)信息


    希望多多交流  回復(fù)  更多評論
      

    主站蜘蛛池模板: 亚洲中文字幕第一页在线| 亚洲国产精品毛片av不卡在线 | 日本免费污片中国特一级| 亚洲国产成人久久精品动漫 | 亚洲国产精品VA在线观看麻豆| 最近免费中文字幕大全免费版视频 | 四虎影视大全免费入口| 中出五十路免费视频| 亚洲导航深夜福利| 亚洲XX00视频| 麻豆国产精品免费视频| av电影在线免费看| 激情亚洲一区国产精品| 亚洲午夜福利AV一区二区无码| 久久午夜免费视频| 国产免费小视频在线观看| 日韩精品免费视频| 羞羞视频免费网站入口| 亚洲一区精品中文字幕| 亚洲A丁香五香天堂网| 最近中文字幕免费mv视频7| 中国一级特黄的片子免费| 亚洲国产成人精品无码区花野真一| 久久精品国产亚洲网站| 国产a不卡片精品免费观看| 亚洲一级毛片免费看| 久久WWW免费人成—看片| 亚洲人成影院在线高清| 亚洲gv猛男gv无码男同短文| 国产成人免费a在线视频app | 16女性下面无遮挡免费| 香蕉视频在线免费看| 亚洲av日韩aⅴ无码色老头| 亚洲春色另类小说| 亚洲av无码一区二区三区不卡| 免费在线黄色网址| 免费高清小黄站在线观看| 69免费视频大片| 无码人妻一区二区三区免费看 | 免费高清A级毛片在线播放| 中日韩亚洲人成无码网站|