惨淡人生,平淡生活

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 季失羽 阅读(217) | 评论 (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 季失羽 阅读(1640) | 评论 (0)编辑 收藏