- 浏览: 44911 次
- 性别:
- 来自: 昆明
文章分类
最新评论
-
menghuannvxia:
请问request不同解决了吗?我现在将它的requst转成了 ...
COS文件上传组件在Struts1.X环境下的问题[SOS] -
msgtogcr:
我是个干了十多年的企业内 C/S 程序员,眼见着 C/S ...
菜鸟也谈架构之C/S三层架构的轮回 -
msgtogcr:
我是一个 C/S 程序员,干了这么多年,眼见 B/S 渐渐 ...
菜鸟也谈架构之C/S三层架构的轮回 -
msgtogcr:
我是一个 C/
菜鸟也谈架构之C/S三层架构的轮回 -
ronalke:
我是个菜鸟,也迷茫过c/s和b/s的区别,不过至少觉得b/s的 ...
菜鸟也谈架构之C/S三层架构的轮回
菜鸟也谈架构
本人06年毕业 一直做JavaWeb应用的项目 大大小小做了5、6个吧
感觉B/S结构的应用 项目实施下来都不是很理想 虽然都验收了 但我觉得这些项目也顶多能给个百分制及格分 60分
主要弊端:
(1)实时响应速度差
(尽管已经做了集群、机器是小型机)
(2)人机交互能力太弱,有些特殊的地方还不得不借助鸡勒技术ActiveX和Applet。使得B/S仅有的一点点部署方便的优势荡然无存。
(尽管现在已经有很多RIA技术手段,比如EXT、Flex等~ 但都有各种问题。论证下来实施这些技术还是性价比不够理想。)
我的想法:
C/S三层架构应该要轮回崛起了。
理论上说,B/S其实也是属于C/S三层架构的应用。但他的C这一层实在让人不爽。
扪心自问,你为什么要选择B/S来做行业应用系统(特质运行在专用网里的特定行业应用系统)
(1)、为了跟时髦。觉得JavaEE(B/S)代表了时尚潮流,代表了先进。
扯淡。JavaEE并非就得把C做成浏览器应用。评价系统优劣最直接的三要素:方便、快捷、稳定(我一客户和我说话聊的,我决定很有道理)
(2)、为了数据和业务逻辑集中,实现部署、升级的方便。
这恐怕是针对C/S原始2层架构而言.而且是因为你技术部到位不能做到完美的自动升级而把这一功能通过b/s模式变相解决吧。至于数据和业务逻辑的集中如果是C/S三层架构的话,B/S根本没有这一优势可言。C/S三成架构一样可以做到。
(3)、为了应用服务器集中、方便做集群和各种负载均衡。
C/S三层一样可以。
居然如此:我们为什么还要选择B/S 。
我的想法:
做一个c/s三层架构。总的方向还是基于Java。
方案一:用SWT/Jface和EclipseRCP技术做为UI层技术。实现一个纯粹的UI客户端。通过RPC调用JavaEE应用服务器发布的方法进行业务处理。此方案的问题:选择一种高性能且易于异构系统集成的RPC方法。(初定的方法是使用httpinvoker作为架构内部的RPC调用,并支持 webservice满足其他异构系统调用需求)不知道hprpse是否能同时兼顾高性能且易于异构系统集成?
方案二:用SWT/Jface和EclipseRCP技术做为UI层技术。实现一个纯粹的UI客户端。然后自己实现一个类似中间件或者应用服务器概念的东西,但不走http协议。考虑其他通信方式。我的业务逻辑组件也不希望再借助于Java应用服务器。而是直接将我的业务逻辑组件发布到这个中间件上作为服务提供给客户端调用。这只是偶的想法,不知具体怎么实现 不知道hprose是否能再这方面做点什么?
枪吧。。。。。。
枪托吧。。。。。。
关于部署:
EclipseRCP客户端可以考虑使用java webstart进行部署。即使不使用webstart也能够制作成安装包由用户下载自己完成安装。
而B/S应用的部署现状是什么?
虽然理论上B/S是零部署的。但事实是什么样的呢?客户端机器大部分也用于上网,客户安装了各种各样的浏览器插件。如果你的系统对客户端的人机交互要求很高或者你的系统需要和硬件交互则你可能还需要使用OCX技术和applet技术。如果你使用了这种鸡勒技术的话那部署起来将会变得极其苦不堪言。即便你进行了数字签名,理论上OCX控件能够自动下载到客户端,但由于客户端浏览器环境千差万别,零部署将变成亲自上门部署设置部署不上的尴尬局面。最后干脆重做系统。
说得在理
本人06年毕业 一直做JavaWeb应用的项目 大大小小做了5、6个吧
感觉B/S结构的应用 项目实施下来都不是很理想 虽然都验收了 但我觉得这些项目也顶多能给个百分制及格分 60分
主要弊端:
(1)实时响应速度差
(尽管已经做了集群、机器是小型机)
(2)人机交互能力太弱,有些特殊的地方还不得不借助鸡勒技术ActiveX和Applet。使得B/S仅有的一点点部署方便的优势荡然无存。
(尽管现在已经有很多RIA技术手段,比如EXT、Flex等~ 但都有各种问题。论证下来实施这些技术还是性价比不够理想。)
我的想法:
C/S三层架构应该要轮回崛起了。
理论上说,B/S其实也是属于C/S三层架构的应用。但他的C这一层实在让人不爽。
扪心自问,你为什么要选择B/S来做行业应用系统(特质运行在专用网里的特定行业应用系统)
(1)、为了跟时髦。觉得JavaEE(B/S)代表了时尚潮流,代表了先进。
扯淡。JavaEE并非就得把C做成浏览器应用。评价系统优劣最直接的三要素:方便、快捷、稳定(我一客户和我说话聊的,我决定很有道理)
(2)、为了数据和业务逻辑集中,实现部署、升级的方便。
这恐怕是针对C/S原始2层架构而言.而且是因为你技术部到位不能做到完美的自动升级而把这一功能通过b/s模式变相解决吧。至于数据和业务逻辑的集中如果是C/S三层架构的话,B/S根本没有这一优势可言。C/S三成架构一样可以做到。
(3)、为了应用服务器集中、方便做集群和各种负载均衡。
C/S三层一样可以。
居然如此:我们为什么还要选择B/S 。
我的想法:
做一个c/s三层架构。总的方向还是基于Java。
方案一:用SWT/Jface和EclipseRCP技术做为UI层技术。实现一个纯粹的UI客户端。通过RPC调用JavaEE应用服务器发布的方法进行业务处理。此方案的问题:选择一种高性能且易于异构系统集成的RPC方法。(初定的方法是使用httpinvoker作为架构内部的RPC调用,并支持 webservice满足其他异构系统调用需求)不知道hprpse是否能同时兼顾高性能且易于异构系统集成?
方案二:用SWT/Jface和EclipseRCP技术做为UI层技术。实现一个纯粹的UI客户端。然后自己实现一个类似中间件或者应用服务器概念的东西,但不走http协议。考虑其他通信方式。我的业务逻辑组件也不希望再借助于Java应用服务器。而是直接将我的业务逻辑组件发布到这个中间件上作为服务提供给客户端调用。这只是偶的想法,不知具体怎么实现 不知道hprose是否能再这方面做点什么?
评论
41 楼
rovanz
2009-12-12
要是浏览器成为类似于flash播放器一样强大的东东呢,那局限不就都没了
40 楼
rovanz
2009-12-12
legend 写道
GRDJE 写道
托吧。。。。。
枪吧。。。。。。
枪托吧。。。。。。
39 楼
free_bird816
2009-12-12
做到最后,才明白,C/S真的挺好
38 楼
pufan
2009-12-12
屁优势。
想想网游就知道,把wow用js重写一遍,能有几个人玩。
想想网游就知道,把wow用js重写一遍,能有几个人玩。
37 楼
zzy9zzy
2009-12-12
B/S结构的系统相对C/S结构有较多优势,所以在慢慢的替换C/S结构。由于Ajax和Flash等页面技术的出现,B/S系统在展现层的弱点正在得到弥补。
36 楼
nishizhutoua
2009-12-12
C/S的问题还是在于View层过于灵活.
我更倾向于用B/S的 B和C/S的S.
我更倾向于用B/S的 B和C/S的S.
35 楼
syre
2009-12-11
除了性能,还要考虑通用性。
所以我更愿意用json来传递数据。
hessian或许也是个不错的选择。不过纯文本数据更容易调试些。
所以我更愿意用json来传递数据。
hessian或许也是个不错的选择。不过纯文本数据更容易调试些。
34 楼
andot
2009-12-11
你说的没错,节约带宽可以获得更好的速度,hprose可以有效的节约带宽,不管是gzip模式下,还是非gzip模式下,数据量都要小于json。
至于数据结构,hprose支持带有类信息的对象传递,当然就包括严格的数据结构了。而且你不需要重新学习一种数据结构定义语言,直接用你所熟悉的语言就可以去定义数据结构,在复杂项目中,不但有严格数据结构定义的保证,而且可以让你少些很多代码,所以比起 protocol buffers来更占优势。
另外,上面我也补充了跟 protocol buffers 采用同样模式的序列化比较,虽然在时间上略逊于 protocol buffers,但是在数据量上 hprose 完胜。
至于数据结构,hprose支持带有类信息的对象传递,当然就包括严格的数据结构了。而且你不需要重新学习一种数据结构定义语言,直接用你所熟悉的语言就可以去定义数据结构,在复杂项目中,不但有严格数据结构定义的保证,而且可以让你少些很多代码,所以比起 protocol buffers来更占优势。
另外,上面我也补充了跟 protocol buffers 采用同样模式的序列化比较,虽然在时间上略逊于 protocol buffers,但是在数据量上 hprose 完胜。
33 楼
dualface
2009-12-11
其实我对性能的看法有点不同。虽然序列化/反序列化的速度很重要,可是以国内的网速,如果可以大幅度节约带宽反倒可以获得更好的响应速度。现在我用的 json 来传递数据,通过 gzip 压缩后传输还是很不错的。
但是我对 protocolbuf 感兴趣,性能不是考察的重点。重点是 protocolbuf 可以通过书写规格文件来定义严格的数据结构。比如我现在做的应用,由于是 json 来传递数据,所以接收到数据后需要一一检查特定的字段是否提供了值,否则以默认值代替。而 protocolbuf 可以让这件事自动完成,只需要在规格文件中定义好就行了。从 protocolbuf 规格文件生成的代码还是类型安全的,这一点我也非常喜欢。
而且项目变得复杂后,要传输的数据比较繁杂。此时有一个相对严格的数据结构定义是件好事,至少某个地方传递的数据不符合规范,查错工作进行起来更容易。
但是我对 protocolbuf 感兴趣,性能不是考察的重点。重点是 protocolbuf 可以通过书写规格文件来定义严格的数据结构。比如我现在做的应用,由于是 json 来传递数据,所以接收到数据后需要一一检查特定的字段是否提供了值,否则以默认值代替。而 protocolbuf 可以让这件事自动完成,只需要在规格文件中定义好就行了。从 protocolbuf 规格文件生成的代码还是类型安全的,这一点我也非常喜欢。
而且项目变得复杂后,要传输的数据比较繁杂。此时有一个相对严格的数据结构定义是件好事,至少某个地方传递的数据不符合规范,查错工作进行起来更容易。
32 楼
dualface
2009-12-11
不对吧,我看图表里面,除了 timeCreate 的其他各项比较中,protocol buffers 都排在前面的。
(不好意思,是我看错了。是比 java、hessian 更快,呵呵)
而且数值结果里面:
看上去也是 protocol buffers 更好哦。
但是 protocol buffers 并不单单是 rpc。我正在测试 protocol buffers,它提供的类型定义我非常喜欢。项目越复杂,对于接口间传递的数据越要有规范。通过定义统一的类型,然后生成为不同语言的对应代码,这样的机制感觉很好。
(不好意思,是我看错了。是比 java、hessian 更快,呵呵)
而且数值结果里面:
, Object create, Serialization, Deserialization, Total Time, Serialized Size hprose property mode, 203.49637, 15915.68300, 16647.07000, 32766.24937, 533 hprose field mode , 204.45847, 23397.60100, 19868.39800, 43470.45747, 522 protobuf , 350.51045, 3585.64700, 2029.22750, 5965.38495, 231
看上去也是 protocol buffers 更好哦。
但是 protocol buffers 并不单单是 rpc。我正在测试 protocol buffers,它提供的类型定义我非常喜欢。项目越复杂,对于接口间传递的数据越要有规范。通过定义统一的类型,然后生成为不同语言的对应代码,这样的机制感觉很好。
31 楼
andot
2009-12-11
<div class="quote_title">nathanlee 写道</div>
<div class="quote_div">
<br>有没有hprose VS. avro的比较结果?<br>
</div>
<p><br>我下载了 http://code.google.com/p/thrift-protobuf-compare/ 的 svn 源码,加入了 hprose 的比较程序,hprose 的比较程序写起来非常简单,hprose 提供两种序列化模式,按照熟悉或者按照字段序列化,下面是两种模式的比较程序的源码,最后又加了一种hprose自定义序列化模式,你会发现代码比 avro 的简单太多了:</p>
<pre name="code" class="java">package serializers;
import java.io.ByteArrayOutputStream;
import serializers.java.MediaContent;
import hprose.io.*;
public class HproseFieldSerializer extends StdMediaSerializer
{
public int expectedSize = 0;
public HproseFieldSerializer()
{
super("hprose field mode");
}
public MediaContent deserialize (byte[] array) throws Exception
{
return (MediaContent) HproseFormatter.unserialize(array, HproseMode.FieldMode);
}
public byte[] serialize(MediaContent content) throws Exception
{
ByteArrayOutputStream out = HproseFormatter.serialize(content, HproseMode.FieldMode);
out.close();
byte[] array = out.toByteArray();
expectedSize = array.length;
return array;
}
}
</pre>
<p> </p>
<pre name="code" class="java">package serializers;
import java.io.*;
import java.util.*;
import serializers.java.MediaContent;
import hprose.io.*;
public class HprosePropertySerializer extends StdMediaSerializer
{
public int expectedSize = 0;
public HprosePropertySerializer()
{
super("hprose property mode");
}
public MediaContent deserialize (byte[] array) throws Exception
{
return (MediaContent) HproseFormatter.unserialize(array, HproseMode.PropertyMode);
}
public byte[] serialize(MediaContent content) throws Exception
{
ByteArrayOutputStream out = HproseFormatter.serialize(content, HproseMode.PropertyMode);
out.close();
byte[] array = out.toByteArray();
expectedSize = array.length;
return array;
}
}
</pre>
<p> </p>
<pre name="code" class="java">package serializers.hprose;
import hprose.io.*;
import java.io.*;
import java.util.*;
import serializers.StdMediaSerializer;
import serializers.java.Image;
import serializers.java.Media;
import serializers.java.MediaContent;
import serializers.java.Image.Size;
import serializers.java.Media.Player;
public class HproseSerializer extends StdMediaSerializer
{
public int expectedSize = 0;
public HproseSerializer()
{
super("hprose");
}
public MediaContent deserialize (byte[] array) throws Exception
{
ByteArrayInputStream in = new ByteArrayInputStream(array);
MediaContent content = new MediaContent();
Media m = new Media();
HproseReader reader = new HproseReader(in);
m.setUri((String) reader.readString());
m.setFormat((String) reader.readString());
m.setTitle((String) reader.readString());
m.setDuration(reader.readLong());
m.setSize(reader.readLong());
m.setPersons((List<String>) reader.readList());
m.setPlayer((Player)reader.readEnum(Player.class));
content.setMedia(m);
Image i = new Image();
i.setUri((String) reader.readString());
i.setSize((Size) reader.readEnum(Size.class));
i.setTitle((String) reader.readString());
content.addImage(i);
i = new Image();
i.setUri((String) reader.readString());
i.setSize((Size) reader.readEnum(Size.class));
i.setTitle((String) reader.readString());
content.addImage(i);
return content;
}
public byte[] serialize(MediaContent content) throws Exception
{
ByteArrayOutputStream out = new ByteArrayOutputStream(expectedSize);
HproseWriter writer = new HproseWriter(out);
Media m = content.getMedia();
writer.writeString(m.getUri());
writer.writeString(m.getFormat());
writer.writeString(m.getTitle());
writer.writeLong(m.getDuration());
writer.writeLong(m.getSize());
writer.writeList(m.getPersons());
writer.writeEnum(m.getPlayer());
Image i = content.getImage(0);
writer.writeString(i.getUri());
writer.writeEnum(i.getSize());
writer.writeString(i.getTitle());
i = content.getImage(1);
writer.writeString(i.getUri());
writer.writeEnum(i.getSize());
writer.writeString(i.getTitle());
out.close();
byte[] array = out.toByteArray();
expectedSize = array.length;
return array;
}
}
</pre>
<p><br>然后编译执行时,avro 那部分代码跑不起来(估计是 svn 中的代码和类库不匹配造成的,这也可见 avro 并不稳定),于是把 BenchmarkRunner 中 avro 的两行注释掉了,加入了两行 hprose 的,下面是 hprose 跟其他几种的比较。<br><br>数据:<br><span style="font-family: courier new,courier;"><br> , Object create, Serialization, Deserialization, Total Time, Serialized Size<br>hprose property mode , 208.19696, 15773.10750, 16377.67900, 32358.98346, 533<br>hprose field mode , 205.41509, 23499.67650, 19662.78150, 43367.87309, 522<br>hprose , 203.30761, 4094.55700, 4330.77800, 8628.64261, 219<br>protobuf , 350.66806, 3547.89550, 2004.12100, 5902.68456, 231<br>thrift , 264.43733, 4101.33800, 3781.55100, 8147.32633, 353<br>hessian , 205.94288, 339238.91750, 43325.37500, 382770.23538, 541<br>kryo , 205.38027, 3535.06750, 2243.45750, 5983.90526, 236<br>kryo-optimized , 202.22821, 3276.48900, 2133.31850, 5612.03571, 217<br>java , 201.89101, 12753.18150, 56162.67250, 69117.74501, 919<br>java (externalizable) , 201.38155, 5654.45850, 15510.31400, 21366.15405, 397<br>WARN: serializer 'scala' failed round-trip test (ser+deser produces Object different from input), input=serializers.scala.MediaContent@64874d73, output=serializers.scala.MediaContent@3c5d6af4<br>scala , 141.18095, 30504.57100, 147533.80950, 178179.56145, 2024<br>json (jackson) , 202.95758, 2825.48800, 3986.98400, 7015.42958, 378<br>json/jackson-databind , 201.83787, 4683.36850, 6100.69450, 10985.90087, 465<br>JsonMarshaller , 203.79324, 11755.51900, 20995.25800, 32954.57024, 448<br>protostuff-json , 351.74195, 3190.72350, 5442.42800, 8984.89345, 448<br>protostuff-numeric-json , 346.12873, 2942.77400, 4889.71850, 8178.62123, 359<br>json/google-gson , 205.73946, 286707.15700, 334304.30100, 621217.19745, 470<br>stax/woodstox , 202.68270, 5899.47550, 9202.35400, 15304.51220, 475<br>stax/aalto , 207.46392, 4699.86200, 5960.31750, 10867.64342, 475<br>binaryxml/FI , 206.75105, 11533.04250, 14486.07900, 26225.87255, 300<br>xstream (stax with conv), 208.10167, 11326.87650, 19388.07600, 30923.05417, 399<br>javolution xmlformat , 205.25015, 5481.46200, 8320.14500, 14006.85715, 419<br>WARN: serializer 'sbinary' failed round-trip test (ser+deser produces Object different from input), input=serializers.scala.MediaContent@2a0b6efa, output=serializers.scala.MediaContent@54a2f4a6<br>sbinary , 145.60849, 3479.90650, 2419.75250, 6045.26749, 264<br></span><br><br><img src="http://chart.apis.google.com/chart?chtt=timeCreate&chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&chs=689x430&chd=t:141.18095,145.60849,201.38155,201.83787,201.89101,202.22821,202.682695,202.95758,203.307605,203.79324,205.25015,205.380265,205.415085,205.739455,205.942875,206.751045,207.46392,208.101665,208.19696,264.43733,346.128725,350.668055,351.74195&chds=0,440&chxl=0:%7Cprotostuff-json%7Cprotobuf%7Cprotostuff-numeric-json%7Cthrift%7Chprose%20property%20mode%7Cxstream%20(stax%20with%20conv)%7Cstax/aalto%7Cbinaryxml/FI%7Chessian%7Cjson/google-gson%7Chprose%20field%20mode%7Ckryo%7Cjavolution%20xmlformat%7CJsonMarshaller%7Chprose%7Cjson%20(jackson)%7Cstax/woodstox%7Ckryo-optimized%7Cjava%7Cjson/jackson-databind%7Cjava%20(externalizable)%7Csbinary%7Cscala&lklk&chdlp=t&chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&cht=bhg&chbh=10&chxt=y&nonsense=aaa.png" alt=""></p>
<p> </p>
<p><img src="http://chart.apis.google.com/chart?chtt=timeSer&chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&chs=689x430&chd=t:2825.488,2942.774,3190.7235,3276.489,3479.9065,3535.0675,3547.8955,4094.557,4101.338,4683.3685,4699.862,5481.462,5654.4585,5899.4755,11326.8765,11533.0425,11755.519,12753.1815,15773.1075,23499.6765,30504.571,286707.157,339238.9175&chds=0,69608&chxl=0:%7Chessian%7Cjson/google-gson%7Cscala%7Chprose%20field%20mode%7Chprose%20property%20mode%7Cjava%7CJsonMarshaller%7Cbinaryxml/FI%7Cxstream%20(stax%20with%20conv)%7Cstax/woodstox%7Cjava%20(externalizable)%7Cjavolution%20xmlformat%7Cstax/aalto%7Cjson/jackson-databind%7Cthrift%7Chprose%7Cprotobuf%7Ckryo%7Csbinary%7Ckryo-optimized%7Cprotostuff-json%7Cprotostuff-numeric-json%7Cjson%20(jackson)&lklk&chdlp=t&chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&cht=bhg&chbh=10&chxt=y&nonsense=aaa.png" alt=""></p>
<p> </p>
<p><img src="http://chart.apis.google.com/chart?chtt=timeDSer&chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&chs=689x430&chd=t:2004.121,2133.3185,2243.4575,2419.7525,3781.551,3986.984,4330.778,4889.7185,5442.428,5960.3175,6100.6945,8320.145,9202.354,14486.079,15510.314,16377.679,19388.076,19662.7815,20995.258,43325.375,56162.6725,147533.8095,334304.301&chds=0,65092&chxl=0:%7Cjson/google-gson%7Cscala%7Cjava%7Chessian%7CJsonMarshaller%7Chprose%20field%20mode%7Cxstream%20(stax%20with%20conv)%7Chprose%20property%20mode%7Cjava%20(externalizable)%7Cbinaryxml/FI%7Cstax/woodstox%7Cjavolution%20xmlformat%7Cjson/jackson-databind%7Cstax/aalto%7Cprotostuff-json%7Cprotostuff-numeric-json%7Chprose%7Cjson%20(jackson)%7Cthrift%7Csbinary%7Ckryo%7Ckryo-optimized%7Cprotobuf&lklk&chdlp=t&chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&cht=bhg&chbh=10&chxt=y&nonsense=aaa.png" alt=""></p>
<p> </p>
<p><img src="http://chart.apis.google.com/chart?chtt=totalTime&chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&chs=689x430&chd=t:5612.03571,5902.684555,5983.905264999999,6045.26749,7015.42958,8147.32633,8178.621225,8628.642605000001,8984.89345,10867.64342,10985.90087,14006.85715,15304.512195,21366.15405,26225.872545,30923.054165,32358.98346,32954.57024,43367.873085,69117.74501,178179.56145,382770.235375,621217.1974549999&chds=0,135142&chxl=0:%7Cjson/google-gson%7Chessian%7Cscala%7Cjava%7Chprose%20field%20mode%7CJsonMarshaller%7Chprose%20property%20mode%7Cxstream%20(stax%20with%20conv)%7Cbinaryxml/FI%7Cjava%20(externalizable)%7Cstax/woodstox%7Cjavolution%20xmlformat%7Cjson/jackson-databind%7Cstax/aalto%7Cprotostuff-json%7Chprose%7Cprotostuff-numeric-json%7Cthrift%7Cjson%20(jackson)%7Csbinary%7Ckryo%7Cprotobuf%7Ckryo-optimized&lklk&chdlp=t&chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&cht=bhg&chbh=10&chxt=y&nonsense=aaa.png" alt=""></p>
<p> </p>
<p><img src="http://chart.apis.google.com/chart?chtt=length&chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&chs=689x430&chd=t:217.0,219.0,231.0,236.0,264.0,300.0,353.0,359.0,378.0,397.0,399.0,419.0,448.0,448.0,465.0,470.0,475.0,475.0,522.0,533.0,541.0,919.0,2024.0&chds=0,964&chxl=0:%7Cscala%7Cjava%7Chessian%7Chprose%20property%20mode%7Chprose%20field%20mode%7Cstax/woodstox%7Cstax/aalto%7Cjson/google-gson%7Cjson/jackson-databind%7Cprotostuff-json%7CJsonMarshaller%7Cjavolution%20xmlformat%7Cxstream%20(stax%20with%20conv)%7Cjava%20(externalizable)%7Cjson%20(jackson)%7Cprotostuff-numeric-json%7Cthrift%7Cbinaryxml/FI%7Csbinary%7Ckryo%7Cprotobuf%7Chprose%7Ckryo-optimized&lklk&chdlp=t&chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&cht=bhg&chbh=10&chxt=y&nonsense=aaa.png" alt=""></p>
<p><br>从这个图上可以看出,hprose 对战 java、hessian 是完胜的,而且支持的序列化方式是跟 java 相同的,因此不需要单独编写任何代码(除了 hessian 其它的序列化的数据模型都是特别定义的,所以使用上比 hprose 要复杂的多),大大提高了开发效率,允许效率上也远远超过了二进制编码的 hessian。</p>
<div class="quote_div">
<br>有没有hprose VS. avro的比较结果?<br>
</div>
<p><br>我下载了 http://code.google.com/p/thrift-protobuf-compare/ 的 svn 源码,加入了 hprose 的比较程序,hprose 的比较程序写起来非常简单,hprose 提供两种序列化模式,按照熟悉或者按照字段序列化,下面是两种模式的比较程序的源码,最后又加了一种hprose自定义序列化模式,你会发现代码比 avro 的简单太多了:</p>
<pre name="code" class="java">package serializers;
import java.io.ByteArrayOutputStream;
import serializers.java.MediaContent;
import hprose.io.*;
public class HproseFieldSerializer extends StdMediaSerializer
{
public int expectedSize = 0;
public HproseFieldSerializer()
{
super("hprose field mode");
}
public MediaContent deserialize (byte[] array) throws Exception
{
return (MediaContent) HproseFormatter.unserialize(array, HproseMode.FieldMode);
}
public byte[] serialize(MediaContent content) throws Exception
{
ByteArrayOutputStream out = HproseFormatter.serialize(content, HproseMode.FieldMode);
out.close();
byte[] array = out.toByteArray();
expectedSize = array.length;
return array;
}
}
</pre>
<p> </p>
<pre name="code" class="java">package serializers;
import java.io.*;
import java.util.*;
import serializers.java.MediaContent;
import hprose.io.*;
public class HprosePropertySerializer extends StdMediaSerializer
{
public int expectedSize = 0;
public HprosePropertySerializer()
{
super("hprose property mode");
}
public MediaContent deserialize (byte[] array) throws Exception
{
return (MediaContent) HproseFormatter.unserialize(array, HproseMode.PropertyMode);
}
public byte[] serialize(MediaContent content) throws Exception
{
ByteArrayOutputStream out = HproseFormatter.serialize(content, HproseMode.PropertyMode);
out.close();
byte[] array = out.toByteArray();
expectedSize = array.length;
return array;
}
}
</pre>
<p> </p>
<pre name="code" class="java">package serializers.hprose;
import hprose.io.*;
import java.io.*;
import java.util.*;
import serializers.StdMediaSerializer;
import serializers.java.Image;
import serializers.java.Media;
import serializers.java.MediaContent;
import serializers.java.Image.Size;
import serializers.java.Media.Player;
public class HproseSerializer extends StdMediaSerializer
{
public int expectedSize = 0;
public HproseSerializer()
{
super("hprose");
}
public MediaContent deserialize (byte[] array) throws Exception
{
ByteArrayInputStream in = new ByteArrayInputStream(array);
MediaContent content = new MediaContent();
Media m = new Media();
HproseReader reader = new HproseReader(in);
m.setUri((String) reader.readString());
m.setFormat((String) reader.readString());
m.setTitle((String) reader.readString());
m.setDuration(reader.readLong());
m.setSize(reader.readLong());
m.setPersons((List<String>) reader.readList());
m.setPlayer((Player)reader.readEnum(Player.class));
content.setMedia(m);
Image i = new Image();
i.setUri((String) reader.readString());
i.setSize((Size) reader.readEnum(Size.class));
i.setTitle((String) reader.readString());
content.addImage(i);
i = new Image();
i.setUri((String) reader.readString());
i.setSize((Size) reader.readEnum(Size.class));
i.setTitle((String) reader.readString());
content.addImage(i);
return content;
}
public byte[] serialize(MediaContent content) throws Exception
{
ByteArrayOutputStream out = new ByteArrayOutputStream(expectedSize);
HproseWriter writer = new HproseWriter(out);
Media m = content.getMedia();
writer.writeString(m.getUri());
writer.writeString(m.getFormat());
writer.writeString(m.getTitle());
writer.writeLong(m.getDuration());
writer.writeLong(m.getSize());
writer.writeList(m.getPersons());
writer.writeEnum(m.getPlayer());
Image i = content.getImage(0);
writer.writeString(i.getUri());
writer.writeEnum(i.getSize());
writer.writeString(i.getTitle());
i = content.getImage(1);
writer.writeString(i.getUri());
writer.writeEnum(i.getSize());
writer.writeString(i.getTitle());
out.close();
byte[] array = out.toByteArray();
expectedSize = array.length;
return array;
}
}
</pre>
<p><br>然后编译执行时,avro 那部分代码跑不起来(估计是 svn 中的代码和类库不匹配造成的,这也可见 avro 并不稳定),于是把 BenchmarkRunner 中 avro 的两行注释掉了,加入了两行 hprose 的,下面是 hprose 跟其他几种的比较。<br><br>数据:<br><span style="font-family: courier new,courier;"><br> , Object create, Serialization, Deserialization, Total Time, Serialized Size<br>hprose property mode , 208.19696, 15773.10750, 16377.67900, 32358.98346, 533<br>hprose field mode , 205.41509, 23499.67650, 19662.78150, 43367.87309, 522<br>hprose , 203.30761, 4094.55700, 4330.77800, 8628.64261, 219<br>protobuf , 350.66806, 3547.89550, 2004.12100, 5902.68456, 231<br>thrift , 264.43733, 4101.33800, 3781.55100, 8147.32633, 353<br>hessian , 205.94288, 339238.91750, 43325.37500, 382770.23538, 541<br>kryo , 205.38027, 3535.06750, 2243.45750, 5983.90526, 236<br>kryo-optimized , 202.22821, 3276.48900, 2133.31850, 5612.03571, 217<br>java , 201.89101, 12753.18150, 56162.67250, 69117.74501, 919<br>java (externalizable) , 201.38155, 5654.45850, 15510.31400, 21366.15405, 397<br>WARN: serializer 'scala' failed round-trip test (ser+deser produces Object different from input), input=serializers.scala.MediaContent@64874d73, output=serializers.scala.MediaContent@3c5d6af4<br>scala , 141.18095, 30504.57100, 147533.80950, 178179.56145, 2024<br>json (jackson) , 202.95758, 2825.48800, 3986.98400, 7015.42958, 378<br>json/jackson-databind , 201.83787, 4683.36850, 6100.69450, 10985.90087, 465<br>JsonMarshaller , 203.79324, 11755.51900, 20995.25800, 32954.57024, 448<br>protostuff-json , 351.74195, 3190.72350, 5442.42800, 8984.89345, 448<br>protostuff-numeric-json , 346.12873, 2942.77400, 4889.71850, 8178.62123, 359<br>json/google-gson , 205.73946, 286707.15700, 334304.30100, 621217.19745, 470<br>stax/woodstox , 202.68270, 5899.47550, 9202.35400, 15304.51220, 475<br>stax/aalto , 207.46392, 4699.86200, 5960.31750, 10867.64342, 475<br>binaryxml/FI , 206.75105, 11533.04250, 14486.07900, 26225.87255, 300<br>xstream (stax with conv), 208.10167, 11326.87650, 19388.07600, 30923.05417, 399<br>javolution xmlformat , 205.25015, 5481.46200, 8320.14500, 14006.85715, 419<br>WARN: serializer 'sbinary' failed round-trip test (ser+deser produces Object different from input), input=serializers.scala.MediaContent@2a0b6efa, output=serializers.scala.MediaContent@54a2f4a6<br>sbinary , 145.60849, 3479.90650, 2419.75250, 6045.26749, 264<br></span><br><br><img src="http://chart.apis.google.com/chart?chtt=timeCreate&chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&chs=689x430&chd=t:141.18095,145.60849,201.38155,201.83787,201.89101,202.22821,202.682695,202.95758,203.307605,203.79324,205.25015,205.380265,205.415085,205.739455,205.942875,206.751045,207.46392,208.101665,208.19696,264.43733,346.128725,350.668055,351.74195&chds=0,440&chxl=0:%7Cprotostuff-json%7Cprotobuf%7Cprotostuff-numeric-json%7Cthrift%7Chprose%20property%20mode%7Cxstream%20(stax%20with%20conv)%7Cstax/aalto%7Cbinaryxml/FI%7Chessian%7Cjson/google-gson%7Chprose%20field%20mode%7Ckryo%7Cjavolution%20xmlformat%7CJsonMarshaller%7Chprose%7Cjson%20(jackson)%7Cstax/woodstox%7Ckryo-optimized%7Cjava%7Cjson/jackson-databind%7Cjava%20(externalizable)%7Csbinary%7Cscala&lklk&chdlp=t&chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&cht=bhg&chbh=10&chxt=y&nonsense=aaa.png" alt=""></p>
<p> </p>
<p><img src="http://chart.apis.google.com/chart?chtt=timeSer&chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&chs=689x430&chd=t:2825.488,2942.774,3190.7235,3276.489,3479.9065,3535.0675,3547.8955,4094.557,4101.338,4683.3685,4699.862,5481.462,5654.4585,5899.4755,11326.8765,11533.0425,11755.519,12753.1815,15773.1075,23499.6765,30504.571,286707.157,339238.9175&chds=0,69608&chxl=0:%7Chessian%7Cjson/google-gson%7Cscala%7Chprose%20field%20mode%7Chprose%20property%20mode%7Cjava%7CJsonMarshaller%7Cbinaryxml/FI%7Cxstream%20(stax%20with%20conv)%7Cstax/woodstox%7Cjava%20(externalizable)%7Cjavolution%20xmlformat%7Cstax/aalto%7Cjson/jackson-databind%7Cthrift%7Chprose%7Cprotobuf%7Ckryo%7Csbinary%7Ckryo-optimized%7Cprotostuff-json%7Cprotostuff-numeric-json%7Cjson%20(jackson)&lklk&chdlp=t&chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&cht=bhg&chbh=10&chxt=y&nonsense=aaa.png" alt=""></p>
<p> </p>
<p><img src="http://chart.apis.google.com/chart?chtt=timeDSer&chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&chs=689x430&chd=t:2004.121,2133.3185,2243.4575,2419.7525,3781.551,3986.984,4330.778,4889.7185,5442.428,5960.3175,6100.6945,8320.145,9202.354,14486.079,15510.314,16377.679,19388.076,19662.7815,20995.258,43325.375,56162.6725,147533.8095,334304.301&chds=0,65092&chxl=0:%7Cjson/google-gson%7Cscala%7Cjava%7Chessian%7CJsonMarshaller%7Chprose%20field%20mode%7Cxstream%20(stax%20with%20conv)%7Chprose%20property%20mode%7Cjava%20(externalizable)%7Cbinaryxml/FI%7Cstax/woodstox%7Cjavolution%20xmlformat%7Cjson/jackson-databind%7Cstax/aalto%7Cprotostuff-json%7Cprotostuff-numeric-json%7Chprose%7Cjson%20(jackson)%7Cthrift%7Csbinary%7Ckryo%7Ckryo-optimized%7Cprotobuf&lklk&chdlp=t&chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&cht=bhg&chbh=10&chxt=y&nonsense=aaa.png" alt=""></p>
<p> </p>
<p><img src="http://chart.apis.google.com/chart?chtt=totalTime&chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&chs=689x430&chd=t:5612.03571,5902.684555,5983.905264999999,6045.26749,7015.42958,8147.32633,8178.621225,8628.642605000001,8984.89345,10867.64342,10985.90087,14006.85715,15304.512195,21366.15405,26225.872545,30923.054165,32358.98346,32954.57024,43367.873085,69117.74501,178179.56145,382770.235375,621217.1974549999&chds=0,135142&chxl=0:%7Cjson/google-gson%7Chessian%7Cscala%7Cjava%7Chprose%20field%20mode%7CJsonMarshaller%7Chprose%20property%20mode%7Cxstream%20(stax%20with%20conv)%7Cbinaryxml/FI%7Cjava%20(externalizable)%7Cstax/woodstox%7Cjavolution%20xmlformat%7Cjson/jackson-databind%7Cstax/aalto%7Cprotostuff-json%7Chprose%7Cprotostuff-numeric-json%7Cthrift%7Cjson%20(jackson)%7Csbinary%7Ckryo%7Cprotobuf%7Ckryo-optimized&lklk&chdlp=t&chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&cht=bhg&chbh=10&chxt=y&nonsense=aaa.png" alt=""></p>
<p> </p>
<p><img src="http://chart.apis.google.com/chart?chtt=length&chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&chs=689x430&chd=t:217.0,219.0,231.0,236.0,264.0,300.0,353.0,359.0,378.0,397.0,399.0,419.0,448.0,448.0,465.0,470.0,475.0,475.0,522.0,533.0,541.0,919.0,2024.0&chds=0,964&chxl=0:%7Cscala%7Cjava%7Chessian%7Chprose%20property%20mode%7Chprose%20field%20mode%7Cstax/woodstox%7Cstax/aalto%7Cjson/google-gson%7Cjson/jackson-databind%7Cprotostuff-json%7CJsonMarshaller%7Cjavolution%20xmlformat%7Cxstream%20(stax%20with%20conv)%7Cjava%20(externalizable)%7Cjson%20(jackson)%7Cprotostuff-numeric-json%7Cthrift%7Cbinaryxml/FI%7Csbinary%7Ckryo%7Cprotobuf%7Chprose%7Ckryo-optimized&lklk&chdlp=t&chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&cht=bhg&chbh=10&chxt=y&nonsense=aaa.png" alt=""></p>
<p><br>从这个图上可以看出,hprose 对战 java、hessian 是完胜的,而且支持的序列化方式是跟 java 相同的,因此不需要单独编写任何代码(除了 hessian 其它的序列化的数据模型都是特别定义的,所以使用上比 hprose 要复杂的多),大大提高了开发效率,允许效率上也远远超过了二进制编码的 hessian。</p>
30 楼
xibaiben
2009-12-11
三层架构的CS客户端可以自动更新,并没有想象中的那么难于部署。要说客户端的界面渲染会耗费很多客户机资源,我觉得浏览器消耗的资源更多。
29 楼
cats_tiger
2009-12-11
嫌界面难用就好好学习ajax和flex吧。
28 楼
JaNer
2009-12-11
downpour 写道
选择B/S架构可能更多考虑到的是集中服务的模式。毕竟一台一台机器去安装客户端,实施起来不是特别方便。
关于部署:
EclipseRCP客户端可以考虑使用java webstart进行部署。即使不使用webstart也能够制作成安装包由用户下载自己完成安装。
而B/S应用的部署现状是什么?
虽然理论上B/S是零部署的。但事实是什么样的呢?客户端机器大部分也用于上网,客户安装了各种各样的浏览器插件。如果你的系统对客户端的人机交互要求很高或者你的系统需要和硬件交互则你可能还需要使用OCX技术和applet技术。如果你使用了这种鸡勒技术的话那部署起来将会变得极其苦不堪言。即便你进行了数字签名,理论上OCX控件能够自动下载到客户端,但由于客户端浏览器环境千差万别,零部署将变成亲自上门部署设置部署不上的尴尬局面。最后干脆重做系统。
27 楼
kunee
2009-12-11
这个要看项目了
有些界面要求高,操作复杂的用B/S是很鸡肋,见过一个页面附加了几十个JS文件的代码,浏览器一跑起来速度不敢恭维。除非浏览器要做得更牛逼一点,HTML5.0早点来吧
有些界面要求高,操作复杂的用B/S是很鸡肋,见过一个页面附加了几十个JS文件的代码,浏览器一跑起来速度不敢恭维。除非浏览器要做得更牛逼一点,HTML5.0早点来吧
26 楼
truesmile
2009-12-11
方案二比较困难吧,自己实现中间件,成本会大很多的。
25 楼
dieslrae
2009-12-11
snailq 写道
我觉得你的想法,很有问题,C/S优势,但B/S也有很大的优势
就拿,我实施过的kingdee EAS HR来说,就是一个B/S和c/S结合的项目
但实施下来,我个人感觉,用户更愿意用B/S的系统,因为c/s要安装一个客户端,虽然在三层架构的c/s
系统中业务逻辑的运算可以在中间层完成,但客户端的界面渲染,就要耗费很大客户机资源,就拿kingdee
的EAS客户端来说,差点的机器根本别想用,还谈什么处理业务了
另外,现在b/s RIA客户端的技术也很多,并且在不断成熟中,不然为什么google公司的操作系统要考虑在
chrome中操作,而核心在云端了?
这是一种趋势,其实个人的想法是,以后其实根本就不分什么b/s系统和c/s系统,Browser本身就是一个
功能强大的系统平台,随着web2.0,html5.0标准等的出现,这样的理想是可以实现的。不然google,oracle
也不会把自己的应用帮到浏览器上。
就拿,我实施过的kingdee EAS HR来说,就是一个B/S和c/S结合的项目
但实施下来,我个人感觉,用户更愿意用B/S的系统,因为c/s要安装一个客户端,虽然在三层架构的c/s
系统中业务逻辑的运算可以在中间层完成,但客户端的界面渲染,就要耗费很大客户机资源,就拿kingdee
的EAS客户端来说,差点的机器根本别想用,还谈什么处理业务了
另外,现在b/s RIA客户端的技术也很多,并且在不断成熟中,不然为什么google公司的操作系统要考虑在
chrome中操作,而核心在云端了?
这是一种趋势,其实个人的想法是,以后其实根本就不分什么b/s系统和c/s系统,Browser本身就是一个
功能强大的系统平台,随着web2.0,html5.0标准等的出现,这样的理想是可以实现的。不然google,oracle
也不会把自己的应用帮到浏览器上。
说得在理
24 楼
snailq
2009-12-11
我觉得你的想法,很有问题,C/S优势,但B/S也有很大的优势
就拿,我实施过的kingdee EAS HR来说,就是一个B/S和c/S结合的项目
但实施下来,我个人感觉,用户更愿意用B/S的系统,因为c/s要安装一个客户端,虽然在三层架构的c/s
系统中业务逻辑的运算可以在中间层完成,但客户端的界面渲染,就要耗费很大客户机资源,就拿kingdee
的EAS客户端来说,差点的机器根本别想用,还谈什么处理业务了
另外,现在b/s RIA客户端的技术也很多,并且在不断成熟中,不然为什么google公司的操作系统要考虑在
chrome中操作,而核心在云端了?
这是一种趋势,其实个人的想法是,以后其实根本就不分什么b/s系统和c/s系统,Browser本身就是一个
功能强大的系统平台,随着web2.0,html5.0标准等的出现,这样的理想是可以实现的。不然google,oracle
也不会把自己的应用帮到浏览器上。
就拿,我实施过的kingdee EAS HR来说,就是一个B/S和c/S结合的项目
但实施下来,我个人感觉,用户更愿意用B/S的系统,因为c/s要安装一个客户端,虽然在三层架构的c/s
系统中业务逻辑的运算可以在中间层完成,但客户端的界面渲染,就要耗费很大客户机资源,就拿kingdee
的EAS客户端来说,差点的机器根本别想用,还谈什么处理业务了
另外,现在b/s RIA客户端的技术也很多,并且在不断成熟中,不然为什么google公司的操作系统要考虑在
chrome中操作,而核心在云端了?
这是一种趋势,其实个人的想法是,以后其实根本就不分什么b/s系统和c/s系统,Browser本身就是一个
功能强大的系统平台,随着web2.0,html5.0标准等的出现,这样的理想是可以实现的。不然google,oracle
也不会把自己的应用帮到浏览器上。
23 楼
xly_971223
2009-12-11
html http
这些标准那么容易变?
这些标准那么容易变?
22 楼
topcode
2009-12-11
各有千秋,但总体来说,c/s的优势还没没有b/s多
Flex,Sliverlight 不都在吗
Flex,Sliverlight 不都在吗
发表评论
-
hi,men!想挑战吗?Come On!
2009-03-08 01:55 811内容已删除! -
让我悄悄的告诉你:《E3开发指南》发布啦!
2008-12-01 04:57 1145点此下载《E3开发指南》 经过将近3个月的难产,《E3开发指南 ... -
饭没了秀之E3.Table助力**省医疗保险信息系统闪亮登场
2008-09-01 20:53 11391.写在最前面 下面展示的几幅截图为项目中使用E3.Tab ... -
弱弱的发一贴:Ext.Tab without Ext.Tab
2008-08-08 05:51 22651.写在前面 最近由于公司框架中的Tab组件Bug多多,迟迟不 ... -
傻眼了吧!Ext.Grid without Ext.Grid
2008-07-21 01:23 2244E3平台QQ Group:63787587 E3系列组件在线演 ... -
E3.Tree与EXT.Layout完美整合篇
2008-05-29 15:38 2508E3在线演示地址: ... -
深入探讨Spring与Struts集成方案
2007-10-22 23:38 2495eRedLab-JaNer eRedLab@gmail.com ...
相关推荐
【B/S 三层架构详解】 B/S架构,全称为Browser/Server(浏览器/服务器)架构,是一种基于互联网的软件开发模式。在这个架构中,用户通过Web浏览器与服务器进行交互,而业务逻辑和数据存储则主要在服务器端处理。B/S...
在IT行业中,三层架构是一种常见的软件设计模式,尤其在ASP.NET开发中被广泛采用。这个“三层小实例 适合菜鸟”教程显然是为了帮助初学者理解并应用这种架构。三层架构是一种将应用程序分为三个逻辑层的方法,分别是...
菜鸟物流大数据技术架构正是为了解决这个问题,通过智能数据平台,推动合作伙伴之间的高效协作和协同,提供健壮的实时数据服务层,服务菜鸟内外各种数据产品。 菜鸟大数据建设演进从手工作坊到数据体系化,经历了多...
入职的第一天,他对软件测试这个领域知之甚少,认为测试就是寻找产品中的错误。但在与导师凯文的交流中,他逐渐了解到软件测试的真正含义和复杂性。 软件测试实际上是软件开发过程中的一个重要环节,它不仅仅是找出...
菜鸟教程(Runoob)提供的免费网上编译器! 包含C++ C C# HTML/CSS/JavaScript PHP Python等许多语言的编译器! 还有画图 进制转换等常用工具! 还有资源共享! 欢迎来到(http://c.runoob.com)!
【菜鸟实时数仓技术架构演进】 在互联网行业中,数据已成为企业的重要资产,尤其是在物流供应链领域,如菜鸟网络。实时数仓技术架构的演进对于提高数据处理速度、降低成本、确保数据一致性至关重要。菜鸟的技术团队...
简单的通讯录项目(C#+winform+SQL2005数据库,适合菜鸟学习),可实现增删改查功能,新增了设置头像、更改透明度、点击显示与收起列表等功能!!! 呵呵,小弟小试牛刀,希望各位同僚多多指教!!
c语言菜鸟必看代码c语言菜鸟必看c语言菜鸟必看代码代码
【SqlServer+jsp+mvc三层架构实现的易买网购物商城平台】是一个综合性的电商系统,采用了先进的技术栈,包括SQL Server数据库、JavaServer Pages(JSP)和Model-View-Controller(MVC)设计模式。这个平台旨在提供全...
【菜鸟实时数仓技术架构演进】 随着互联网行业的飞速发展,实时数据处理的重要性日益凸显。菜鸟网络作为物流供应链的核心企业,对数据处理的实时性和准确性有着极高的要求。传统离线数仓已经无法满足这样的需求,...
中台架构的核心价值体现——服务重用、数据层、会员中心、商品中心、交易中心、评价中心、安全支撑、菜鸟物流、搜索中心、数据服务中心、营销中心、共享服务体系构成中台核心能力监控、报警、故障处理系统、升级应用...
《菜鸟驿站包裹管理系统——C语言实现详解》 在信息技术飞速发展的今天,各种管理系统已经成为企业和组织提高效率的重要工具。在本案例中,我们将探讨一款基于C语言编程的“菜鸟驿站包裹管理系统”,它主要用于帮助...
菜鸟网络在末端业务领域的探索和实践是其技术体系中最为突出的部分之一。末端网络指的是货物配送到达最终用户手中的物流环节,这个过程往往涉及到复杂而多变的场景,对物流效率和配送成本有着直接影响。菜鸟网络通过...
### C语言入门教程:从菜鸟到专家 #### C语言简介 C语言是一种广泛使用的通用编程语言,由贝尔实验室(AT&T)的丹尼斯·里奇(Dennis Ritchie)于20世纪70年代初开发。它最初是为了构建UNIX操作系统而设计的,但...
【标题】"北大青鸟易买网项目采用三层架构思想"揭示了这个项目的核心设计原则,即三层架构。三层架构是一种常见的软件开发模式,尤其在企业级应用中广泛使用。这种架构将应用程序分为三个主要部分:表现层...
- **Before 1999**:主要采用C/S架构,随着Java及RMI/EJB 1.0的推出,服务端远程调用技术得以发展。 - **1999-2005**:B/S架构兴起,伴随着J2EE企业级组件技术(如EJB 2/JMS/JTA)的广泛应用,负载均衡技术也开始...