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

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

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

    慘淡人生,平淡生活

    The Feature Is Stupid

    2009年3月3日 #

    實現web服務的三個誤區 讀后感

    我的消息吃了我的服務器!Kyle指出,通常,Web服務開發者開始經歷“內存溢出”的錯誤或者奇怪的“性能問題”時,總是會發現服 務器擁有極高的處理負載,CPU使用率接近100%,以及較低的吞吐量和高網絡延遲。導致這些癥狀的典型原因是非常大的(有時會達到50 MB或者更大)消息。而且,這些大消息往往包含了非常大的、作為XML消息主體的、采用base-64編碼的二進制編碼信息。導致其發生的原因通常是:

    ……開發者不理解技術的局限性:XML處理對解決許多問題都有用,但是你必須認識到消息是要被解析的——并且在大多數……產品中,這就意味著許多或者所有的消息都會駐留在內存中。

    Kyle建議采用如下方法來改善這種情況:

    • 不要發送冗余信息。在許多情況下,發送二進制數據時,你可能會發現消息高度重復。如果是這樣,你可能就要考慮在HTTP層面使用壓縮技術來改善你的網絡延遲。雖然這不會幫助你處理負載,但可能有助于減輕其中一個問題。
    • 在XML消息體中,根本不要嵌入二進制信息。這是較好的解決方法,還有幾種不同的途徑可以實現這一效果。比如,你可以使用帶有附件的SOAP或者消息傳輸優化機制(MTOM)繞過解析開銷,盡管這無助于網絡延遲問題。
    • ……還有一個更好的辦法,使用SOAP根本不發送大的二進制blob。替代方法,通過受控的文件傳輸系統,使用一個“帶外數據”傳輸……或者“聲明標簽(claim Check,參見《EIP模式》或這里)”模式,避免在SOAP和HTTP上發送大的二進制文件。




    任何一種技術都有它使用的環境,在做架構設計的時候一定要避免因為個人的偏好,無意識的舍棄某些選擇。 一種簡單的方法論是,根據需要達到的目的,列出所有可能的實現方案,最后做出決定。


    不好意思,你的數據正在顯示。根據Kyle所說,另一個典型的Web服務的“性能問題” 是,使用Web服務的層面非常、非常低——通常Web服務跟一個SQL語句相關,這是因為:

    誤解了SOA架構原則。一個優秀SOA架構的關鍵原則是你的服務應該具有高復用性。

    根據Kyle所說,這些情況通常發生在:

    ……如果設計是根據現有代碼“自上而下”衍生出服務,這類服務就會出現;通常,開發者會看著他們現有的架構圖并且決定將架構中的每一層(包括表現層)轉變成服務集。

    相反,在SOA架構的正確位置使用粗粒度的Web服務會更好。再次強調,檢查一個架構的標準分層模型,通常在架構中會有一個明確定義的地方已經封裝 了系統業務邏輯。可以使用“遠程門面模式(Remote Facade Pattern)”來包裝這些服務,以便用合適的方式來暴露基于模型的服務。



    同樣是可以利用方法論來避免問題,但對于粒度的把握就是一個經驗的問題。




    模式(Schema)?我們不需要任何發臭的模式! Kyle指出,通常開發者試圖重用現有代碼來生成和解析作為Web服務實現基礎的XML。這些實現通常使用XML解析器來編組/解組消息,同時使用 Java HTTP類來發送和接收XML文檔。使用Web服務時,通用的方法是,創建使用模式元素的WSDL文檔,使XML不受阻地通過,然后在現有代碼中對它們進 行解析。

    這個問題的癥狀是組織沒有看到SOA承諾的好處,而且維護他們的解決方案似乎比以前使用Web服務的時候更難(而不是更容易)

    簡單的解決方案是,每當寫Web服務時,不管使用WS-*標準還是使用REST方法,都要確保你創建了代表你文檔結構的完整準確的XML模式。

    如果你正在構建WS-* Web服務,那么這個XML應該被包含在描述你的Web服務的WSDL之中。即使你在使用REST方法,擁有易于訪問的XML模式將鼓勵你的服務被重用。






    posted @ 2009-03-16 14:55 季失羽 閱讀(224) | 評論 (0)編輯 收藏

    如何看懂Java混淆后的反編譯代碼(轉)

    如何看懂Java混淆后的反編譯代碼

    作者:dozb

    一般情況下Java應用的開發者為了保護代碼不被別人抄襲,在生成class文件的時候都java文件進行了混淆,這種class文件用反編譯工具得到的結果很難看懂,并且不能進行編譯。本文從研究的角度,淺析如何讀懂這種反編譯過來的文件。

    例子一:賦值
    反編譯過來的代碼如下:
            Node node;
            Node node1 = _$3.getChildNodes().item(0);
            node1;
            node1;
            JVM INSTR swap ;
            node;
            getChildNodes();
            0;
            item();
            getChildNodes();
            0;
            item();
            getNodeValue();
            String s;
            s;
    原始語句:
            Node node;
            Node node1 = currDocument.getChildNodes().item(0);
     node = node1;
            String s = node.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
    注解:
            JVM INSTR swap ; //賦值語句
    練習:
            String s1;
            String s8 = node.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
            s8;
            s8;
            JVM INSTR swap ;
            s1;
            10;
            Integer.parseInt();
            int i;
            i;

       
    例子二:不帶參數創建對象
    反編譯過來的代碼如下:
            JVM INSTR new #244 <Class CrossTable>;
            JVM INSTR dup ;
            JVM INSTR swap ;
            CrossTable();
            CrossTable crosstable;
            crosstable;

    原始語句:
            CrossTable crosstable = new CrossTable();
    注解:
    練習:
            JVM INSTR new #246 <Class Database>;
            JVM INSTR dup ;
            JVM INSTR swap ;
            Database();
            Object obj;
            obj;

    例子三:帶參數創建對象
    反編譯過來的代碼如下:
            JVM INSTR new #262 <Class StringBuffer>;
            JVM INSTR dup ;
            JVM INSTR swap ;
            String.valueOf(s2);
            StringBuffer();
            s.substring(j, i);
            append();
            s6;
            append();
            toString();
            s2;
     
    原始語句:
     s2 = (new StringBuffer(String.valueOf(s2))).append(s.substring(j, i)).append(s6).toString();
    注解:
     此語句實際上是:s2 += s.substring(j, i) + s6;
    練習:

    例子四:for循環
    反編譯過來的代碼如下:
            int k = 0;
              goto _L4
    _L8:
     ...
     k++;
    _L4:
            if(k < as.length) goto _L8; else goto _L7

    原始語句:
     for(int k=0;k < as.length;k++)
     {
         ...
     }
    注解:

    例子五:while循環
    反編譯過來的代碼如下:
            String s1 = "";
              goto _L1
    _L3:
            JVM INSTR new #262 <Class StringBuffer>;
            JVM INSTR dup ;
            JVM INSTR swap ;
            String.valueOf(s1);
            StringBuffer();
            _$2(resultset, s, l);
            append();
            toString();
            s1;
    _L1:
            if(resultset.next()) goto _L3; else goto _L2

    原始語句:
     String s1 = "";
     while(resultset.next())
     {
      s1 = s1 + resultSetToString(resultset, s, l);

     }

    posted @ 2009-03-03 09:59 季失羽 閱讀(1647) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 午夜在线免费视频| 老司机午夜精品视频在线观看免费| 国产日韩久久免费影院| 亚洲国产精品一区二区三区久久| 亚洲欧美日韩综合久久久| 久久久久国产精品免费免费搜索| 亚洲av成人一区二区三区| 国产情侣激情在线视频免费看| 久久亚洲精品无码VA大香大香| 久久精品无码专区免费青青| 亚洲综合激情视频| 国产91免费视频| 久久亚洲精品专区蓝色区| 女人18毛片免费观看| 亚洲AV日韩AV永久无码色欲 | 久久久久久影院久久久久免费精品国产小说 | 日韩精品内射视频免费观看| 亚洲综合精品一二三区在线| 欧洲乱码伦视频免费| 亚洲国产综合AV在线观看| 四虎精品亚洲一区二区三区| 国产黄色免费观看| 亚洲人成网站影音先锋播放| 免费在线视频你懂的| 麻豆亚洲AV成人无码久久精品 | 亚洲理论电影在线观看| 99re6在线视频精品免费下载 | 成人福利在线观看免费视频| 亚洲国产日韩在线视频| h视频在线观看免费网站| 亚洲精品乱码久久久久蜜桃 | 亚洲国产精品国自产拍电影| 免费无码A片一区二三区 | 亚洲综合激情另类小说区| 热99re久久免费视精品频软件| 久久精品无码专区免费| 亚洲乱码在线播放| 亚洲精品乱码久久久久久不卡| 久久爰www免费人成| 亚洲av色香蕉一区二区三区 | 中文毛片无遮挡高潮免费|