ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>热re99久久精品国99热蜜月,欧美亚洲国产激情,中文字幕在线观看网站http://www.aygfsteel.com/coolfiry/认认真真做äh,兢兢业业做事!zh-cnSun, 29 Jun 2025 02:01:40 GMTSun, 29 Jun 2025 02:01:40 GMT60API¾|‘关作用、方案及如何选择http://www.aygfsteel.com/coolfiry/archive/2018/01/05/433005.htmlCoolfiryCoolfiryFri, 05 Jan 2018 05:42:00 GMThttp://www.aygfsteel.com/coolfiry/archive/2018/01/05/433005.htmlhttp://www.aygfsteel.com/coolfiry/comments/433005.htmlhttp://www.aygfsteel.com/coolfiry/archive/2018/01/05/433005.html#Feedback0http://www.aygfsteel.com/coolfiry/comments/commentRss/433005.htmlhttp://www.aygfsteel.com/coolfiry/services/trackbacks/433005.html在这½‹‡æ–‡ç« ä¸­ž®†æˆ‘们一èµäh¥æŽ¢è®¨å½“前的API¾|‘关的作用ã€?nbsp;

一、API¾|‘关的用å¤?/span>

API¾|‘关我的分析中会用到以下三种场景ã€?nbsp;

  1. Open APIã€?span style="margin: 0px; padding: 0px; line-height: 21px;"> ä¼ä¸šéœ€è¦å°†è‡ªèínæ•°æ®ã€èƒ½åŠ›ç­‰ä½œäØ“å¼€å‘åã^台向外开放,通常会以rest的方式向外提供,最好的例子ž®±æ˜¯æ·˜å®å¼€æ”‘Öã^台、腾讯公司的QQ开攑Öã^台、微信开攑Öã^台ã€?Open API开攑Öã^台必然涉及到客户应用的接入、API权限的管理、调用次数管理等åQŒå¿…然会有一个统一的入口进行管理,˜q™æ­£æ˜¯API¾|‘关可以发挥作用的时候ã€?/span>
  2. 微服务网兟뀂微服务的概忉|œ€æ—©åœ¨2012òq´æå‡ºï¼Œåœ¨Martin Fowler的大力推òq¿ä¸‹åQŒå¾®æœåŠ¡åœ?014òq´åŽå¾—到了大力发展ã€?在微服务架构中,有一个组件可以说是必不可ž®‘çš„åQŒé‚£ž®±æ˜¯å¾®æœåŠ¡ç½‘å…»I¼Œå¾®æœåŠ¡ç½‘å…›_¤„理了负蝲均衡åQŒç¼“存,路由åQŒè®¿é—®æŽ§åˆÓž¼ŒæœåŠ¡ä»£ç†åQŒç›‘控,日志½{‰ã€‚API¾|‘关在微服务架构中正是以微服务网关的íw«ä†¾å­˜åœ¨ã€?nbsp;
  3. API服务½Ž¡ç†òq›_°ã€‚上˜q°çš„微服务架构对企业来说有可能实施上是困隄¡š„åQŒä¼ä¸šæœ‰å¾ˆå¤šé—ç•™¾pȝ»ŸåQŒè¦å…¨éƒ¨æŠ½å–为微服务器改动太大,对企业来说成本太高。但是由于不同系¾lŸé—´å­˜åœ¨å¤§é‡çš„API服务互相调用åQŒå› æ­¤éœ€è¦å¯¹¾pȝ»Ÿé—´æœåŠ¡è°ƒç”¨è¿›è¡Œç®¡ç†ï¼Œæ¸…æ™°åœ°çœ‹åˆ°å„¾pȝ»Ÿè°ƒç”¨å…³ç³»åQŒå¯¹¾pȝ»Ÿé—´è°ƒç”¨è¿›è¡Œç›‘控等ã€?API¾|‘关可以解决˜q™äº›é—®é¢˜åQŒæˆ‘们可以认为如果没有大规模的实施微服务架构åQŒé‚£ä¹ˆå¯¹ä¼ä¸šæ¥è¯´å¾®æœåŠ¡ç½‘å…›_°±æ˜¯ä¼ä¸šçš„API服务½Ž¡ç†òq›_°ã€?/span>

二、API¾|‘关在企业整体架构中的地ä½?/span>

一个企业随着信息¾pȝ»Ÿå¤æ‚度的提高åQŒå¿…然出现外部合作伙伴应用、企业自íw«çš„公网应用、企业内¾|‘应用等åQŒåœ¨æž¶æž„上应该将˜q™ä¸‰¿Uåº”用区别开åQŒä¸‰¿Uåº”用的安排¾U§åˆ«ã€è®¿é—®æ–¹å¼ä¹Ÿä¸ä¸€æ —÷€?因此在我的设计中ž®†è¿™ä¸‰ç§åº”用分别用不同的¾|‘å…³˜q›è¡ŒAPI½Ž¡ç†åQŒåˆ†åˆ«æ˜¯åQšAPI¾|‘å…³åQˆOpenAPI合伙伙伴应用åQ‰ã€API¾|‘å…³åQˆå†…部应用)、API¾|‘å…³åQˆå†…部公¾|‘应用)ã€?/span>

 

三、企业中在如何应用API¾|‘å…³

1、对于OpenAPI使用的API¾|‘关来说åQŒä¸€èˆ¬åˆä½œä¼™ä¼´è¦ä»¥åº”用的形式接入到OpenAPIòq›_°åQŒåˆä½œä¼™ä¼´éœ€è¦åˆ° OpenAPIòq›_°ç”Œ™¯·åº”用ã€?因此在OpenAPI¾|‘关之外åQŒéœ€è¦æœ‰ä¸€ä¸ªé¢å‘合作伙伴的使用的åã^台用于合作伙ä¼ß_¼Œ˜q™å°±è¦æ±‚OpenAPI¾|‘关需要提供API¾l™è¿™ä¸ªç”¨æˆ·åã^台进行访问ã€?如下架构:

 

当然如果是在½Ž€å•的场景下,可能òq¶ä¸éœ€è¦æä¾›ä¸€ä¸ªé¢å‘合作伙伴的门户åQŒåªéœ€è¦ç”±å…¬å¸çš„运营äh员直接添加合作伙伴应用id/密钥½{‰ï¼Œ˜q™ç§æƒ…况下也ž®×ƒ¸éœ€è¦åˆä½œä¼™ä¼´é—¨æˆ·å­¾pȝ»Ÿã€?nbsp;

2、对于内¾|‘çš„API¾|‘å…³åQŒåœ¨èµ·åˆ°çš„ä½œç”¨ä¸Šæ¥è¯´å¯ä»¥è®¤äØ“æ˜¯å¾®æœåŠ¡¾|‘å…³åQŒä¹Ÿå¯ä»¥è®¤äؓ是内¾|‘çš„API服务æ²È†òq›_°ã€?当企业将所有的应用使用微服务的架构½Ž¡ç†èµäh¥åQŒé‚£ä¹ˆAPI¾|‘å…³ž®Þp“våˆîCº†å¾®æœåŠ¡ç½‘å…³çš„ä½œç”¨ã€?而当企业只是ž®†ç³»¾lŸä¸Ž¾pȝ»Ÿä¹‹é—´çš„调用ä‹É用rest api的方式进行访问时使用API¾|‘关对调用进行管理,那么API¾|‘关起到的就是API服务æ²È†çš„作用ã€?架构参考如下:

3、对于公司内部公¾|‘应用(如APP、公司的¾|‘ç«™åQ‰ï¼Œå¦‚æžœ½Ž¡ç†ä¸Šæ¯”较细è‡ß_¼Œåœ¨æž¶æž„上是可能由独立的API¾|‘关来处理这部分内部公网应用åQŒå¦‚果想比较½Ž€å•的处理åQŒä¹Ÿå¯ä»¥æ˜¯ä‹É用面向合作伙伴的API¾|‘å…³ã€?如果使用独立的API¾|‘å…³åQŒæœ‰ä»¥ä¸‹çš„好处:

  • é¢å‘åˆä½œä¼™ä¼´å’Œé¢å‘å…¬åæ€¸»ä½“业务的优先¾U§ä¸ä¸€æ øP¼Œä¸åŒçš„API¾|‘关可以做到业务影响的隔¼›…R€?/span>
  • 内部API使用的管理流½E‹å’Œé¢å‘合作伙伴的管理流½E‹å¯èƒ½ä¸ä¸€æ —÷€?/em>
  • 内部的API在功能扩展等斚w¢çš„需求一般会大于OpenAPI对于功能的要求ã€?/em>

åŸÞZºŽä»¥ä¸Šçš„分析,如果公司有能力,那么˜q˜æ˜¯å»ø™®®åˆ†å¼€ä½¿ç”¨åˆä½œä¼™ä¼´OPEN API¾|‘关和内部公¾|‘应用网兟ë€?/span>

四、API¾|‘关有哪些竞争方æ¡?/span>

1ã€?em id="__mceDel" style="margin: 0px; padding: 0px;">对于Open APIòq›_°çš„API¾|‘å…³åQŒæˆ‘分析只能选择API¾|‘å…³ä½œäØ“è§£å†³æ–ÒŽ¡ˆåQŒä¸šç•Œæ²¡æœ‰å‘现比较好的可以用来作为Open APIòq›_°çš„入口的其他æ–ÒŽ¡ˆã€?nbsp;

2、对于作为微服务¾|‘关的API¾|‘å…³åQŒä¸šç•Œçš„选择可以选择的解å†Ïx–¹æ¡ˆæ¯”较多åQŒä¹Ÿå–决于微服务器的实现æ–ÒŽ¡ˆåQŒæœ‰ä¸€äº›å¾®æœåŠ¡æž¶æž„çš„å®žçŽ°æ–¹æ¡ˆæ˜¯ä¸éœ€è¦å¾®æœåŠ¡¾|‘关的ã€?/em>

  • Service MeshåQŒè¿™æ˜¯æ–°å…´çš„åŸÞZºŽæ— API¾|‘关的架构,通过在客æˆïL«¯ä¸Šçš„代理完成屏蔽¾|‘络层的讉K—®åQŒè¿™æ ¯‚¾¾åˆ°å¯¹åº”用层最ž®çš„æ”¹åЍåQŒå½“前Service Meshçš„äñ”品还正在开发中åQŒåƈ没有非常成熟可直接应用的产品ã€?发展最˜q…速的产品是Istioã€?廸™®®å¤§å®¶å¯†åˆ‡å…Ïx³¨ç›¸å…³äº§å“çš„研发、业务ä‹É用进展ã€?/em>

  • åŸÞZºŽdubooæž¶æž„åQŒåœ¨˜q™ä¸ªæž¶æž„中通常是不需要网关的åQŒæ˜¯ç”±å®¢æˆïL«¯ç›´æŽ¥è®‰K—®æœåŠ¡æä¾›æ–¹ï¼Œç”±æ³¨å†Œä¸­å¿ƒå‘å®¢æˆ·ç«¯è¿”å›žæœåŠ¡æ–¹çš„åœ°å€ã€?/span>

五、API¾|‘关解决æ–ÒŽ¡ˆ

¿Uæœ‰äº‘开源解å†Ïx–¹æ¡ˆå¦‚下:

  • Kong kong是基于Nginx+Lua˜q›è¡ŒäºŒæ¬¡å¼€å‘çš„æ–ÒŽ¡ˆåQ?https://konghq.com/
  • Netflix ZuulåQŒzuul是spring cloud的一个推荐组ä»Óž¼Œhttps://github.com/Netflix/zuul
  • orange,˜q™ä¸ªå¼€æºç¨‹åºæ˜¯å›½äh开发的åQ?http://orange.sumory.com/

公有云解å†Ïx–¹æ¡ˆï¼š

  • Amazon API GatewayåQŒhttps://aws.amazon.com/cn/api-gateway/
  • 阉K‡Œäº‘API¾|‘å…³åQŒhttps://www.aliyun.com/product/apigateway/
  • 腾讯云API¾|‘å…³åQ?https://cloud.tencent.com/product/apigateway

自开发解å†Ïx–¹æ¡ˆï¼š

  • åŸÞZºŽNginx+Lua+ OpenResty的方案,可以看到Kong,orange都是åŸÞZºŽ˜q™ä¸ªæ–ÒŽ¡ˆ
  • åŸÞZºŽNetty、非é˜Õd¡žIO模型ã€?通过¾|‘ä¸Šæœçƒ¦å¯ä»¥çœ‹åˆ°å›½å†…çš„å®œäºø™´·½{‰ä¸€äº›å…¬å¸æ˜¯åŸÞZºŽ˜q™ç§æ–ÒŽ¡ˆåQŒæ˜¯ä¸€¿Uæˆç†Ÿçš„æ–ÒŽ¡ˆã€?/span>
  • åŸÞZºŽNode.js的方案ã€?˜q™ç§æ–ÒŽ¡ˆæ˜¯åº”用了Node.js天生的非é˜Õd¡žçš„特性ã€?/span>
  • åŸÞZºŽjava Servlet的方案ã€?zuulåŸÞZºŽçš„就是这¿Uæ–¹æ¡ˆï¼Œ˜q™ç§æ–ÒŽ¡ˆçš„æ•ˆçŽ‡ä¸é«˜ï¼Œ˜q™ä¹Ÿæ˜¯zuulæ€ÀL˜¯è¢«è¯Ÿç—…的原因ã€?/span>

六、企业怎么选择API¾|‘å…³

如果是要选择一‹Æ‘Ö·²æœ‰çš„API¾|‘å…³åQŒé‚£ä¹ˆéœ€è¦ä»Žä»¥ä¸‹å‡ ä¸ªæ–šw¢åŽ»è€ƒè™‘ã€?nbsp;

1、性能与可用�/span>
如果一旦采用了API¾|‘å…³åQŒé‚£ä¹ˆAPI¾|‘å…³ž®×ƒ¼šä½œäؓ企业应用核心åQŒå› æ­¤æ€§èƒ½å’Œå¯ç”¨æ€§æ˜¯å¿…须要求的ã€?/span>

  • 从性能上来è¯ß_¼Œéœ€è¦è®©¾|‘关增加的时间消耗越短越好,个äh觉得需è¦?0ms以下ã€?¾pȝ»Ÿéœ€è¦é‡‡ç”¨éžé˜Õd¡žçš„IOåQŒå¦‚epollåQŒNIO½{‰ã€‚网兛_’Œå„种依赖的交互也需要是非阻塞的åQŒè¿™æ äh‰èƒ½ä¿è¯æ•´ä½“ç³»¾lŸçš„高可用性,如:Node.js的响应式¾~–程和基于java体现的RxJavaå’ŒFutureã€?/span>
  • ¾|‘关必须支持集群部çÖvåQŒä“Q务一台服务器的crash都应该不影响整体¾pȝ»Ÿçš„可用性ã€?/span>
  • 多套¾|‘关应该支持同一½Ž¡ç†òq›_°å’ŒåŒä¸€ç›‘控中心ã€?如: 一个企业的OpenAPI¾|‘关和内部应用的多个¾pȝ»Ÿ¾Ÿ¤çš„不同的微服务¾|‘关可以在同一监控中心˜q›è¡Œç›‘控ã€?/span>

2、可扩展性、可¾l´æŠ¤æ€?/span>
一‹Æ¾äñ”品æ€ÀLœ‰ä¸èƒ½æ»¡èƒö生äñ”需求的地方åQŒå› æ­¤éœ€æ±‚思考äñ”品在如何˜q›è¡ŒäºŒæ¬¡å¼€å‘å’Œ¾l´æŠ¤åQŒæ˜¯å¦æ–¹ä¾¿å…¬å¸å›¢é˜ŸæŽ¥æ‰‹ç»´æŠ¤äñ”品ã€?nbsp;
3、需求匹配度
需要评估各API¾|‘关在需求上是否能满­‘»I¼Œå¦‚: 如果是OpenAPIòq›_°éœ€è¦ä‹É用API¾|‘å…³åQŒé‚£ä¹ˆéœ€è¦çœ‹API¾|‘关在合作伙伴应用接入、合作伙伴门户集成、访问次数限额等OpenAPI核心需求上åŽÀL€è€ƒäñ”品是否能满èƒö要求ã€?如果是微服务¾|‘å…³åQŒé‚£ä¹ˆè¦ä»Žå¾®æœåŠ¡çš„è¿¾l´ã€ç›‘控、管理等斚w¢åŽÀL€è€ƒäñ”品是否èƒö够强大ã€?/span>
4、是否开源?公司是否有自开发的能力åQ?/span>
现有的开源äñ”品如kongåQŒzuulåQŒorange都有基础的API¾|‘关的核心功能,˜q™äº›å¼€æºäñ”品大多离很好的ä‹É用有一定的距离åQŒå¦‚åQšæ²¡æœ‰æä¾›ç®¡ç†åŠŸèƒ½çš„UI界面、监控功能弱ž®ï¼Œä¸æ”¯æŒOpenAPIòq›_°åQŒæ²¡æœ‰å…¬å¸è¿è¥ä¸Ž˜qç»´çš„功能等ã€?当然开源äñ”品能获取源代码,如果公司有比较强的研发能力,能hold住这些开源äñ”品,¾lè¿‡äºŒæ¬¡å¼€å‘kong、zuul应该˜q˜æ˜¯é€‚应一些公司,不过需求注意以下一些点åQ?/span>

  • kong是基于ngnix+lua的,从公司的角度比较难于扑ֈ°èƒ½åŽ»¾l´æŠ¤˜q™ç§æž¶æž„产品的ähã€?需求评估当前公司是否有˜q™ä¸ªèƒ½åŠ›åŽÈ»´æŠ¤è¿™ä¸ªäñ”品ã€?/span>
  • zuulå› äØ“æž¶æž„çš„åŽŸå› åœ¨é«˜åÆˆå‘çš„æƒ…å†µä¸‹æ€§èƒ½ä¸é«˜åQŒåŒæ—‰™œ€è¦åŽ»åŸÞZºŽç ”究整合开源的适配zuul的监控和½Ž¡ç†¾pȝ»Ÿã€?/span>
  • orangeç”׃ºŽæ²¡æœ‰è¢«å¤§é‡ä‹É用,同时是国内个人在开源,在可持箋性和½C‘ÖŒºèµ„源上不够丰富,å‡ÞZº†é—®é¢˜åŽå¯èƒ½ä¸å®ÒŽ˜“扑ֈ°äººé—®ã€?/span>

另外kong提供企业版本的API¾|‘å…³åQŒå½“然也是基于ngnix+lua的,企业版本可以购买他们的技术支持、培训等服务、以及拥有界面的½Ž¡ç†ã€ç›‘控等功能ã€?/span>

5、公有云˜q˜æ˜¯¿Uæœ‰äº?/span>
现在的亚马逊、阿里、腾讯云都在提供基础公有云的API¾|‘å…³åQŒå½“然这些网关的基础功能肯定是没有问题,但是二次开发,扩展功能、监控功能可能就不能满èƒö部分用户的定刉™œ€æ±‚äº†ã€‚å¦å¤–å¾ˆå¤šä¼ä¸šå› ä¸ø™‡ªíw«ä¿¡æ¯å®‰å…¨çš„原因åQŒä¸èƒ½ä‹É用外¾|‘公有网的API¾|‘关服务åQŒè¿™æ ·å°±åªæœ‰é€‰æ‹©¿Uæœ‰äº‘çš„æ–ÒŽ¡ˆäº†ã€?nbsp;
在需求上如果åŸÞZºŽå…¬æœ‰äº‘çš„API¾|‘关只能做到由内部ähå‘˜äØ“å¤–ç½‘äººå‘˜ç”Œ™¯·åº”用åQŒæ— æ³•做到定制的合作伙伴门户åQŒè¿™ä¹Ÿä¸é€‚合于部分企业的需求ã€?nbsp;
å¦‚æžœä½œäØ“å¾®æœåŠ¡ç½‘å…»I¼Œå¤§å¤šæ•°æƒ…况下是希望网å…ÏxœåŠ¡å™¨å’ŒæœåŠ¡æä¾›æ–¹æœåŠ¡å™¨æ˜¯è¦åœ¨å†…ç½‘çš„ï¼Œåœ¨è¿™é‡Œæƒ…å†µä¸‹ä¹Ÿåªæœ‰ç§æœ‰äº‘çš„API¾|‘关才能满èƒö需求ã€?nbsp;

¾l¼åˆä¸Šé¢çš„分析,基础公有云的API¾|‘关只有满èƒö一部分½Ž€å•客æˆïLš„需求,对于很多企业来说¿Uæœ‰äº‘çš„API¾|‘关才是正确的选择ã€?/span>


文章作者介¾lï¼š
来自于小豹科技的架构师-专注于èÊY件研发基于åã^台性èÊY件的研发åQŒç›®å‰æˆ‘正在研发一‹Æ‘ÖŸºäºŽNetty、响应式架构的插件式的API¾|‘å…³åQŒå¸Œæœ›èƒ½å¯¹è¡Œä¸šå¸¦æ¥ä¸€äº›æ”¹å˜ã€?我希望与对OpenAPI、微服务、API¾|‘关、Service Mesh½{‰æ„Ÿå…´è¶£çš„æœ‹å‹å¤šäº¤æµã€?有兴­‘£çš„æœ‹å‹è¯·åŠ æˆ‘çš„QQ¾Ÿ?44054462ã€?/span>



]]>
虞美�李煜http://www.aygfsteel.com/coolfiry/archive/2009/01/19/251842.htmlCoolfiryCoolfiryMon, 19 Jan 2009 02:49:00 GMThttp://www.aygfsteel.com/coolfiry/archive/2009/01/19/251842.htmlhttp://www.aygfsteel.com/coolfiry/comments/251842.htmlhttp://www.aygfsteel.com/coolfiry/archive/2009/01/19/251842.html#Feedback0http://www.aygfsteel.com/coolfiry/comments/commentRss/251842.htmlhttp://www.aygfsteel.com/coolfiry/services/trackbacks/251842.html
虞美�李煜
春花¿U‹æœˆä½•时了,往事知多少åQŸå°æ¥¼æ˜¨å¤œåˆä¸œé£ŽåQŒæ•…国不堪回首月明中。雕栏玉砌应犹在åQŒåªæ˜¯æœ±é¢œæ”¹ã€‚问君能有几多愁åQŒæ°ä¼ég¸€æ±Ÿæ˜¥æ°´å‘东流ã€?#160;


]]>
雨霖é“?·æŸÏx°¸http://www.aygfsteel.com/coolfiry/archive/2009/01/19/251841.htmlCoolfiryCoolfiryMon, 19 Jan 2009 02:48:00 GMThttp://www.aygfsteel.com/coolfiry/archive/2009/01/19/251841.htmlhttp://www.aygfsteel.com/coolfiry/comments/251841.htmlhttp://www.aygfsteel.com/coolfiry/archive/2009/01/19/251841.html#Feedback0http://www.aygfsteel.com/coolfiry/comments/commentRss/251841.htmlhttp://www.aygfsteel.com/coolfiry/services/trackbacks/251841.html
雨霖é“?·æŸÏx°¸


寒蝉凄切。对长亭晚,骤雨初歇。都门帐饮无¾lªï¼Œç•™æ‹å¤„、兰舟催发。执手相看泪çœû|¼Œç«Ÿæ— è¯­å‡å™Žã€‚念åŽÕdŽ»ã€åƒé‡ŒçƒŸæ³¢ï¼Œæš®éœ­æ²‰æ²‰æ¥šå¤©é˜”ã€?
多情自古伤离别,更那堪冷落清¿U‹èŠ‚åQä»Šå®µé…’醒何处?杨柳岸、晓风残月。此åŽÈ»òqß_¼Œåº”是良辰好景虚设。便¾U‰|œ‰åƒç§é£Žæƒ…åQŒæ›´ä¸Žä½•äºø™¯´åQ?/span>

]]>
blog内容预告http://www.aygfsteel.com/coolfiry/archive/2008/12/11/245716.htmlCoolfiryCoolfiryThu, 11 Dec 2008 07:48:00 GMThttp://www.aygfsteel.com/coolfiry/archive/2008/12/11/245716.htmlhttp://www.aygfsteel.com/coolfiry/comments/245716.htmlhttp://www.aygfsteel.com/coolfiry/archive/2008/12/11/245716.html#Feedback5http://www.aygfsteel.com/coolfiry/comments/commentRss/245716.htmlhttp://www.aygfsteel.com/coolfiry/services/trackbacks/245716.html 2、java mailçš„ä‹É用基本用法和注意事项ã€?br /> 3、CXF中相关BUG的解å†Ïx–¹æ³•ã€?br /> 4、UNIX ¾|‘络¾~–程步步提升¾pÕdˆ—ã€?br />


]]>
snoop的用æ³?/title><link>http://www.aygfsteel.com/coolfiry/archive/2008/10/21/235784.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Tue, 21 Oct 2008 13:30:00 GMT</pubDate><guid>http://www.aygfsteel.com/coolfiry/archive/2008/10/21/235784.html</guid><wfw:comment>http://www.aygfsteel.com/coolfiry/comments/235784.html</wfw:comment><comments>http://www.aygfsteel.com/coolfiry/archive/2008/10/21/235784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/coolfiry/comments/commentRss/235784.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/coolfiry/services/trackbacks/235784.html</trackback:ping><description><![CDATA[转自:http://bbs.chinaunix.net/viewthread.php?tid=691982&extra=&page=1<br /> snoop 抓包<br /> <font color="Red">solaris自带snoop抓包工具,抓所有数据流</font><br /> <br /> # snoop<br /> Using device /dev/pcn0 (promiscuous mode)<br /> 192.168.8.18 -> 192.168.255.255 <font color="Red">NBT </font>NS Query Request for WORKGROUP[1c], Success<br /> 192.168.253.35 -> solaris      <font color="Red">TELNET </font>C port=1246<br />      solaris -> 192.168.253.35 TELNET R port=1246 Using device /dev/pc<br />      solaris -> 192.168.253.35 TELNET R port=1246 Using device /dev/pc<br /> 192.168.4.150 -> (broadcast)  <font color="Red">ARP </font>C Who is 192.168.4.200, 192.168.4.200 ?<br /> 192.168.4.200 -> (broadcast)  ARP C Who is 192.168.4.150, 192.168.4.150 ?<br /> #<br /> <br /> <font color="Red">æŠ“æºåœ°å€æˆ–ç›®çš„äØ“ 202.101.98.55的数据流åQ?/font><br /> <br /> # snoop 202.101.98.55<br /> Using device /dev/pcn0 (promiscuous mode)<br /> 192.168.253.35 -> dns.fz.fj.cn DNS C <a target="_blank">www.163.com.</a> Internet Addr ?<br /> dns.fz.fj.cn -> 192.168.253.35 DNS R <a target="_blank">www.163.com.</a> Internet CNAME <a target="_blank">www.cache.split.netease.com.</a><br /> <br /> #<br /> <br /> 说明åQšinternet cname åŽçš„ä¸ø™§£æž?a target="_blank">www.163.com</a>的名字时åQŒä»£è¡?a target="_blank">www.163.com</a>回答的主机的域名ã€?br /> <br /> <font color="Red">æŠ?192.168.253.35å’?02.101.98.55之间的数据流åQˆåŒå‘都抓)</font><br /> <br /> # snoop 192.168.253.35 202.101.98.55<br /> Using device /dev/pcn0 (promiscuous mode)<br /> 192.168.253.35 -> dns.fz.fj.cn DNS C <a target="_blank">www.google.com.</a> Internet Addr ?<br /> dns.fz.fj.cn -> 192.168.253.35 DNS R <a target="_blank">www.google.com.</a> Internet CNAME <a target="_blank">www.l.google.com.</a><br /> #<br /> <br /> <font color="Red">抓完存在当前目录下的capæ–‡äšgä¸­åÆˆæŸ¥çœ‹</font><br /> <br /> # snoop -o cap1 -P      -Pè¡¨ç¤ºå¤„åœ¨éžæØœæ‚æ¨¡å¼æŠ“æ•°æ®åQŒåªæŠ“å¹¿æ’­ã€ä¸»æ’­ã€ç›®çš„äØ“æœ¬æœºçš„æ•°æ?br /> Using device /dev/pcn0 (<font color="Blue">non promiscuous</font>)<br /> 15 ^C                           15的含义是åQšæ˜¾½Cºç›®å‰æŠ“了多ž®‘个数据‹¹?br /> #<br /> <br /> # snoop -i cap1<br />   1   0.00000 192.168.253.35 -> solaris      TELNET C port=1246<br />   2   0.18198 192.168.253.35 -> solaris      TELNET C port=1246<br />   3   0.37232 192.168.4.199 -> 192.168.255.255 NBT Datagram Service Type=17 Source=WB-200[20]<br />   4   0.00016            ? -> (multicast)  ETHER Type=EF08 (Unknown), size = 180bytes<br />   5   0.62546 192.168.253.35 -> solaris      TELNET C port=1246<br />   6   0.13822            ? -> (multicast)  ETHER Type=0000 (LLC/802.3), size = 52 bytes<br />   7   0.06283 192.168.253.35 -> solaris      TELNET C port=1246<br />   8   0.90301 192.168.253.35 -> solaris      TELNET C port=1246<br />   9   0.19781 192.168.253.35 -> solaris      TELNET C port=1246<br /> 10   0.81493            ? -> (multicast)  ETHER Type=0000 (LLC/802.3), size = 52 bytes<br /> 11   0.07018 192.168.253.35 -> solaris      TELNET C port=1246<br /> 12   0.19939 192.168.253.35 -> solaris      TELNET C port=1246<br /> 13   0.90151 192.168.253.35 -> solaris      TELNET C port=1246<br /> 14   0.18904 192.168.253.35 -> solaris      TELNET C port=1246<br /> 15   0.68422            ? -> (multicast)  ETHER Type=0000 (LLC/802.3), size = 52 bytes<br /> #snoop -i cap1 -p 10,12            åªçœ‹10-12条记å½?br /> <br /> #snoop -i cap1 -p10                  åªçœ‹½W?0条记å½?br /> <br /> # snoop -i cap1 -v -p101            æŸ¥çœ‹½W?0条数据流的包头的详细内容<br /> <br /> #snoop -i cap1 -v -x 0 -p101   æŸ¥çœ‹½W?0条数据流的全部的详细内容<br /> <br /> <font color="Red">抓主æœ?92.168.253.35å’?02.101.98.55之间的tcp或者udp端口53的数æ?/font><br /> <br /> # snoop 192.168.253.35 and 202.101.98.55 and \(tcp or udp\) and port 53<br /> <br /> <font color="Blue">输入åQˆçš„æ—¶å€™è¦åŠ è{义符号\</font><br /> <br /> <br /> <strong><font color="Red">snoop的详¾l†å‚æ•?/font></strong><br /> Snoop 是Solaris ¾pȝ»Ÿä¸­è‡ªå¸¦çš„工具åQ?是一个用于显½Cºç½‘¾lœé€šè®¯çš„程序, 它可捕获IP åŒ…åÆˆž®†å…¶æ˜„¡¤ºæˆ–保存到指定文äšg. (限超¾U§ç”¨æˆ·ä‹É用snoop)<br /> Snoop 可将捕获的包以一行的形式加以æ€È»“或用多行加以详细的描˜q?有调用不同的参数–v -V来实çŽ?. 在æ€È»“方式ä¸?-V ) , ž®†ä»…昄¡¤ºæœ€é«˜å±‚的相兛_è®? 例如一个NFS 包将仅显½CºNFS 信息, 其低层的RPC, UDP, IP, Ethernet 帧信息将不会昄¡¤º, 但是当加上相应的参数(-v ), ˜q™äº›ä¿¡æ¯éƒ½èƒ½è¢«æ˜¾½Cºå‡ºæ?<br /> <br /> -C<br /> <br /> -D<br /> <br /> -N<br /> <br /> -P 在非æ·äh‚模式下抓åŒ?br /> <br /> -S 抓包的时候显½Cºæ•°æ®åŒ…的大ž®?br /> <br /> -V 半详¾l†çš„æ˜„¡¤ºæŠ“的数据的信æ?br /> <br /> -t [ r | a | d ] 昄¡¤ºæ—‰™—´æˆ»I¼Œ-ta昄¡¤ºå½“前¾pȝ»Ÿæ—‰™—´åQŒç²¾¼‹®åˆ°æ¯«ç§’<br /> <br /> -v 最详细的显½Cºæ•°æ®çš„信息<br /> <br /> -x offset [ , length] ä»?6˜q›åˆ¶æˆ–ACSII方式昄¡¤ºæŸæ•°æ®çš„部分内容åQŒæ¯”å¦?-x 0,10 只显½C?-10字节<br /> <br /> #snoop -i cap1 -v -x 0 -p101 查看被抓èŽïLš„½W?01个数据流的全部内å®?br /> <br /> <br /> <strong><font color="Red">表达式:</font></strong><br /> <br /> æ ÒŽ®åœ°å€åQ?br /> <br /> #snoop x.x.x.x         IPV4çš„IP<br /> <br /> #snoop 0XX:XX:XX:XX    ETHERNETçš„MAC地址<br /> <br /> 数据的方向:<br /> <br /> from x.x.x.x 或è€?src x.x.x.x<br /> <br /> to x.x.x.x 或è€?dst x.x.x.x<br /> <br /> 可用的数据类型的关键词:<br /> <br /> ip, ip6, arp, rarp, pppoed, pppoesåQŒpppoeåQŒbroadcaståQŒmulticaståQŒappleåQŒdecnet<br /> <br /> udp, tcp, icmp, icmp6, ah, esp<br /> <br /> greater length<br />       True if the packet is longer than length.<br /> <br /> less length<br />       True if the packet is shorter than length.<br /> <br /> net net<br /> <br /> # snoop from net 192.168.1.0 抓来è‡?92.168.1.0/24的数æ?br /> <br /> # snoop from net 192.168.0.0 抓来è‡?92.168.0.0/16的数æ?br /> <br /> port xx XX为TCP或者UDP的端口号或è€?/etc/services里定义的名字<br /> <br /> #snoop to udp and port 53    抓到UDP53的数æ? <img src ="http://www.aygfsteel.com/coolfiry/aggbug/235784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/coolfiry/" target="_blank">Coolfiry</a> 2008-10-21 21:30 <a href="http://www.aygfsteel.com/coolfiry/archive/2008/10/21/235784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CXF使用中Listä½œäØ“ä¼ è¾“å‚æ•°ç›¸å…³é—®é¢˜çš„è§£å†?/title><link>http://www.aygfsteel.com/coolfiry/archive/2008/08/05/220272.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Tue, 05 Aug 2008 12:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/coolfiry/archive/2008/08/05/220272.html</guid><wfw:comment>http://www.aygfsteel.com/coolfiry/comments/220272.html</wfw:comment><comments>http://www.aygfsteel.com/coolfiry/archive/2008/08/05/220272.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/coolfiry/comments/commentRss/220272.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/coolfiry/services/trackbacks/220272.html</trackback:ping><description><![CDATA[在项目ä‹É用CXF的过½E‹ä¸­,遇到了有关Listä½œäØ“ä¼ è¾“å‚æ•°çš„æ—¶å€?如果WebService端没有明¼‹®ç»™å‡ºList的泛型类型会报错ã€?br /> 例如<br /> CXFçš„WebServiceç«¯å£æŽ¥å£çš„ä¸€ä¸ªæ–¹æ³•äØ“ä¸ºï¼š<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080;">1</span> <span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> updateMessageStatus(List</span><span style="color: #000000;"> batchIds);<br /> </span></div> <br /> å®¢æˆ·ç«¯çš„çš„è°ƒç”¨äØ“åQ?br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080;">1</span> <span style="color: #008000;">//</span><span style="color: #008000;">预先初始化cxf对象cxfObj</span><span style="color: #008000;"><br /> </span><span style="color: #008080;">2</span> <span style="color: #000000;">List</span><span style="color: #000000;"><</span><span style="color: #000000;">String</span><span style="color: #000000;">></span><span style="color: #000000;"> list</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ArrayList</span><span style="color: #000000;"><</span><span style="color: #000000;">String</span><span style="color: #000000;">></span><span style="color: #000000;">();<br /> </span><span style="color: #008080;">3</span> <span style="color: #000000;">list.add(</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /> </span><span style="color: #008080;">4</span> <span style="color: #000000;">cxfObj.updateMessageStatus(list);</span></div> <br /> <br /> 在客æˆïL«¯˜q›è¡Œè°ƒç”¨WebService时会发生错误åQŒé”™è¯¯äØ“åQšunexpected element (uri:"", local:"arg0")½{‰ï¼Œæ®åˆ†æžç”Ÿæˆçš„wsdlåQŒè¿™æ˜¯å› ä¸ºCXF在进行数据marshal时不知道要将要è{换的¾cÕdž‹ã€?br /> <br /> 解决办法æ˜?在WebService端的接口必须用List的泛型类型参敎ͼŒå¦‚:<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080;">1</span> <span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> updateMessageStatus(List</span><span style="color: #000000;"><String> batchIds);<br /> </span></div> <br /> ˜q™æ ·ž®±å®Œå…¨è§£å†³é—®é¢˜äº†ã€?br /> <img src ="http://www.aygfsteel.com/coolfiry/aggbug/220272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/coolfiry/" target="_blank">Coolfiry</a> 2008-08-05 20:09 <a href="http://www.aygfsteel.com/coolfiry/archive/2008/08/05/220272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的½W¬ä¸€ä¸ªå’Œ½W¬äºŒä¸ªunix SHELL学习½E‹åºhttp://www.aygfsteel.com/coolfiry/archive/2008/07/20/216227.htmlCoolfiryCoolfirySun, 20 Jul 2008 12:34:00 GMThttp://www.aygfsteel.com/coolfiry/archive/2008/07/20/216227.htmlhttp://www.aygfsteel.com/coolfiry/comments/216227.htmlhttp://www.aygfsteel.com/coolfiry/archive/2008/07/20/216227.html#Feedback2http://www.aygfsteel.com/coolfiry/comments/commentRss/216227.htmlhttp://www.aygfsteel.com/coolfiry/services/trackbacks/216227.html first.sh
while read line
do
        echo 
"$line"
done 
<"$1"
˜q™æ˜¯½W¬ä¸€ä¸ªshell½E‹åºž®ä¾‹å­ï¼Œž®Þq›¸å½“于一个学习其他语­a€çš„hello world了吧。用法first.sh teståQŒå°†testæ–‡äšg中的每一行输出到stdout中ã€?br />
second.sh
number=0;
while [ "$number" -lt 100 ]
do
        echo 
"$number"
        number
='expr $number + 1'
done
echo
˜q™æ˜¯½W¬äºŒä¸ªshell½E‹åºž®ä¾‹å­ï¼Œä½œç”¨æ˜¯è¾“å‡?åˆ?9的数字到stdout中。其中用到的expr的作用是使expr的参数è{åŒ–äØ“æ•°å­—òq¶ç›¸åŠ ã€‚ä¸¤ä¸ªå•å¼•å·çš„ä½œç”¨æ˜¯å¼•å·æ‰€åŒ…å›´çš„å‘½ä»¤è¢«å‘½ä×o的标准输出替换,òq¶è¾“凸™µ‹å€¼ç»™æˆ‘numberåQŒå¾—åˆîCº†å¦‚同java中number=number+1的效果ã€?br />



]]>
在ä‹É用CXF WebService框架旉™‡åˆ°çš„问题与解å†Ïx–¹æ¡?/title><link>http://www.aygfsteel.com/coolfiry/archive/2008/07/18/215882.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Fri, 18 Jul 2008 11:11:00 GMT</pubDate><guid>http://www.aygfsteel.com/coolfiry/archive/2008/07/18/215882.html</guid><wfw:comment>http://www.aygfsteel.com/coolfiry/comments/215882.html</wfw:comment><comments>http://www.aygfsteel.com/coolfiry/archive/2008/07/18/215882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/coolfiry/comments/commentRss/215882.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/coolfiry/services/trackbacks/215882.html</trackback:ping><description><![CDATA[在项目开发过½E‹ä¸­åQŒé‡åˆ°åœ¨æœ¬æœºå’Œwindows环境中部¾|²ç”¨CXF框架开发的的webService没有ä»ÖM½•问题åQŒä½†æ˜¯å½“ž®†å·¥½E‹éƒ¨¾|²åˆ°solaris çš„SUN ONE application上时åQŒå†ç”¨æœ¬æœºçš„cxf Web服务客户端访问对应的web服务æ—Óž¼Œå¦‚果传输的数据量ž®äºŽå¤§çº¦4K不会出问题,否则则会报一些数据绑定的异常如:<br /> Marshalling Error: Error writing request body to serverã€?br /> 解决˜q™ä¸ªé—®é¢˜èŠ×ƒº†æˆ‘èƒö­‘³ä¸¤å¤©æ—¶é—ß_¼ŒåŽŸå› æ˜¯æœ‰å…³CXF的资料太ž®‘了åQŒè€Œä¸”有关于这个错误的解决都必™åÖM‹É用google才能search刎ͼŒç”¨baidu完全search不到相关的资料ã€?br /> 解决æ–ÒŽ¡ˆåQ?br /> 在客æˆïL«¯çš„class-path中加上cxf.xml。cxf.xml的配¾|®å¦‚下:<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;"><?</span><span style="color: #ff00ff;">xml version="1.0" encoding="UTF-8"</span><span style="color: #0000ff;">?></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">beans </span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000;"><br />     xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;"><br />     xmlns:http</span><span style="color: #0000ff;">="http://cxf.apache.org/transports/http/configuration"</span><span style="color: #ff0000;"><br />     xmlns:jaxws</span><span style="color: #0000ff;">="http://cxf.apache.org/jaxws"</span><span style="color: #ff0000;"><br />     xsi:schemaLocation</span><span style="color: #0000ff;">="<br /> http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd<br /> http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd<br />  http://cxf.apache.org/transports/http/configuration<br /> http://cxf.apache.org/schemas/configuration/http-conf.xsd"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">http:conduit </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="*.http-conduit"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />         </span><span style="color: #0000ff;"><</span><span style="color: #800000;">http:client </span><span style="color: #ff0000;">AutoRedirect</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"> </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"></</span><span style="color: #800000;">http:conduit</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> </span></div> ˜q™ä¸ªé—®é¢˜çš„è§£å†Ïx–¹æ¡ˆæ˜¯æˆ‘在cxf的官¾|‘上找了很久才找到的åQŒè™½ç„‰™—®é¢˜è§£å†³äº†åQŒä½†æ˜¯æˆ‘感到很迷惑。主要在windows tomcat环境下没有问题,而到了SUN ONE的环境就有问题,¾lè¿‡çš„æ€è€ƒå’Œæ‰¾äº†ä¸€èµ„æ–™åQŒæˆ‘è®¤äØ“é—®é¢˜å‡ÞZºŽsolaris对于HTTP数据传输的某些限åˆÓž¼Œå¦‚果真要åŽÀLžæ¸…楚的话可能要去参看cxfçš„source code了,但是我不惌™Š±˜q™ä¸ªæ—‰™—´åŽÈ ”½I¶è¿™ä¸ªé—®é¢˜äº†ã€?br /> <br /> 我把˜q™ä¸ªè§£å†³æ–ÒŽ¡ˆå†™å‡ºæ¥ï¼Œå¸Œæœ›å¯ä»¥å¸®åŠ©åˆîC‹É用CXF的网友,也希望高手们能帮我解å†Ïxˆ‘的迷惑ã€?br /> <br /> <br /> <br /> <img src ="http://www.aygfsteel.com/coolfiry/aggbug/215882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/coolfiry/" target="_blank">Coolfiry</a> 2008-07-18 19:11 <a href="http://www.aygfsteel.com/coolfiry/archive/2008/07/18/215882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用负蝲均衡技术徏è®ùN«˜è´Ÿè²çš„网¾lœç«™ç‚?è½?http://www.aygfsteel.com/coolfiry/archive/2008/07/18/215763.htmlCoolfiryCoolfiryFri, 18 Jul 2008 06:23:00 GMThttp://www.aygfsteel.com/coolfiry/archive/2008/07/18/215763.htmlhttp://www.aygfsteel.com/coolfiry/comments/215763.htmlhttp://www.aygfsteel.com/coolfiry/archive/2008/07/18/215763.html#Feedback0http://www.aygfsteel.com/coolfiry/comments/commentRss/215763.htmlhttp://www.aygfsteel.com/coolfiry/services/trackbacks/215763.html

Internet的快速增长ä‹É多媒体网¾lœæœåС噍åQŒç‰¹åˆ«æ˜¯Web服务器,面对的访问者数量快速增加,¾|‘ç»œæœåŠ¡å™¨éœ€è¦å…·å¤‡æä¾›å¤§é‡åÆˆå‘è®¿é—®æœåŠ¡çš„èƒ½åŠ›ã€?例如Yahoo每天会收到数百万‹Æ¡çš„讉K—®è¯äh±‚åQŒå› æ­¤å¯¹äºŽæä¾›å¤§è´Ÿè²Web服务的服务器来讲åQŒCPU、I/O处理能力很快会成为瓶颈ã€?/p>

½Ž€å•çš„ 提高¼‹¬äšg性能òq¶ä¸èƒ½çœŸæ­£è§£å†Œ™¿™ä¸ªé—®é¢˜ï¼Œå› äؓ单台服务器的性能æ€ÀL˜¯æœ‰é™çš„,一般来è®ÔŒ¼Œä¸€å°PC服务器所能提供的òq¶å‘讉K—®å¤„理能力大约ä¸?000ä¸ªï¼Œæ›´äØ“é«˜æ¡£ 的专用服务器能够支持3000-5000ä¸ªåÆˆå‘è®¿é—®ï¼Œ˜q™æ ·çš„能力还是无法满­‘Œ™´Ÿè½½è¾ƒå¤§çš„¾|‘站的要求。尤其是¾|‘络è¯äh±‚å…ähœ‰½Hå‘性,当某些重大事件发生时åQŒç½‘ ¾lœè®¿é—®å°±ä¼šæ€¥å‰§ä¸Šå‡åQŒä»Žè€Œé€ æˆ¾|‘络瓉™¢ˆåQŒä¾‹å¦‚在¾|‘上发布的克林顿弹劾书就是很明显的例子。必™å»é‡‡ç”¨å¤šå°æœåŠ¡å™¨æä¾›¾|‘络服务åQŒåƈž®†ç½‘¾lœè¯·æ±‚分配给˜q™äº›æœåŠ¡å™?分担åQŒæ‰èƒ½æä¾›å¤„ç†å¤§é‡åÆˆå‘æœåŠ¡çš„èƒ½åŠ›ã€?/p>

当ä‹É用多台服务器来分担负载的时候,最½Ž€å•的办法是将不同的服务器用在不同的方面ã€?按提供的内容˜q›è¡Œåˆ†å‰²æ—Óž¼Œå¯ä»¥ž®†ä¸€å°æœåŠ¡å™¨ç”¨äºŽæä¾›æ–°é—»™åµé¢åQŒè€Œå¦ä¸€å°ç”¨äºŽæä¾›æ¸¸æˆé¡µé¢ï¼›æˆ–者可以按服务器的功能˜q›è¡Œåˆ†å‰²åQŒå°†ä¸€å°æœåŠ¡å™¨ç”¨äºŽæä¾›é™æ€é¡µé?讉K—®åQŒè€Œå¦ä¸€äº›ç”¨äºŽæä¾›CGI½{‰éœ€è¦å¤§é‡æ¶ˆè€—资源的动态页面访问。然而由于网¾lœè®¿é—®çš„½Hå‘性,使得很难¼‹®å®šé‚£äº›™åµé¢é€ æˆçš„负载太大,如果ž®†æœåŠ¡çš„™åµé¢åˆ†å‰² 的过¾l†å°±ä¼šé€ æˆå¾ˆå¤§‹¹ªè´¹ã€‚事实上造成负蝲˜q‡å¤§çš„页面常常是在变化中的,如果要经常按照负载变化来调整™åµé¢æ‰€åœ¨çš„æœåŠ¡å™¨ï¼Œé‚£ä¹ˆåŠ¿å¿…å¯¹ç®¡ç†å’Œ¾l´æŠ¤é€ æˆæžå¤§çš„é—® 题。因此这¿Uåˆ†å‰²æ–¹æ³•只能是大方向的调整åQŒå¯¹äºŽå¤§è´Ÿè²çš„网站,æ ÒŽœ¬çš„解军_Šžæ³•è¿˜éœ€è¦åº”ç”¨è´Ÿè½½å‡è¡¡æŠ€æœ¯ã€?/p>

负蝲均衡的思èµ\下多å?æœåŠ¡å™¨äØ“å¯¹ç§°æ–¹å¼åQŒæ¯å°æœåŠ¡å™¨éƒ½å…·å¤‡ç­‰ä»ïLš„åœîC½åQŒéƒ½å¯ä»¥å•独对外提供服务而无™åÕd…¶ä»–服务器的辅助。然后通过某种负蝲分担技术,ž®†å¤–部发送来的请求均匀分配 到对¿U°ç»“构中的某一台服务器上,而接收到è¯äh±‚的服务器都独立回应客æˆähœºçš„请求。由于徏立内容完全一致的WebæœåŠ¡å™¨åÆˆä¸å¤æ‚ï¼Œå¯ä»¥ä½¿ç”¨æœåŠ¡å™¨åŒæ­¥æ›´æ–°æˆ–è€?å…׃ín存储½Iºé—´½{‰æ–¹æ³•来完成åQŒå› æ­¤è´Ÿè½½å‡è¡¡æŠ€æœ¯å°±æˆäؓ建立一个高负蝲Web站点的关键性技术ã€?/p>

  1. åŸÞZºŽç‰¹å®šæœåС噍èÊY件的负蝲均衡

    å¾?多网¾lœåè®®éƒ½æ”¯æŒ“重定å?#8221;功能åQŒä¾‹å¦‚在HTTP协议中支持Location指ä×oåQŒæŽ¥æ”¶åˆ°˜q™ä¸ªæŒ‡ä×o的浏览器ž®†è‡ªåŠ¨é‡å®šå‘åˆ°Location指明的另一ä¸?URL上。由于发送Location指ä×o比è“v执行服务è¯äh±‚åQŒå¯¹Web服务器的负蝲要小的多åQŒå› æ­¤å¯ä»¥æ ¹æ®è¿™ä¸ªåŠŸèƒ½æ¥è®¾è®¡ä¸€¿Uè´Ÿè½½å‡è¡¡çš„æœåŠ¡å™¨ã€‚ä“Q何时å€?WebæœåŠ¡å™¨è®¤ä¸ø™‡ªå·Þp´Ÿè½½è¾ƒå¤§çš„æ—¶å€™ï¼Œå®ƒå°±ä¸å†ç›´æŽ¥å‘送回‹¹è§ˆå™¨è¯·æ±‚çš„¾|‘页åQŒè€Œæ˜¯é€å›žä¸€ä¸ªLocaction指ä×oåQŒè®©‹¹è§ˆå™¨åŽ»æœåŠ¡å™¨é›†¾Ÿ¤ä¸­çš„其他服务器ä¸?获得所需要的¾|‘页ã€?/p>

    在这¿Uæ–¹å¼ä¸‹åQŒæœåŠ¡å™¨æœ¬èín必须支持˜q™ç§åŠŸèƒ½åQŒç„¶è€Œå…·ä½“实现è“v来却有很多困难,例如一台服务器如何能保证它重定向过的服åŠ?器是比较½Iºé—²çš„,òq¶ä¸”不会再次发送Location指ä×oåQŸLocation指ä×o和浏览器都没有这斚w¢çš„æ”¯æŒèƒ½åŠ›ï¼Œ˜q™æ ·å¾ˆå®¹æ˜“在‹¹è§ˆå™¨ä¸Šå½¢æˆä¸€¿Uæ­»å¾ªçŽ¯ã€‚å›  此这¿Uæ–¹å¼å®žé™…åº”ç”¨å½“ä¸­åÆˆä¸å¤šè§ï¼Œä½¿ç”¨˜q™ç§æ–¹å¼å®žçŽ°çš„æœåŠ¡å™¨é›†ç¾¤è½¯äšg也较ž®‘。有些特定情况下可以使用CGIåQˆåŒ…括ä‹É用FastCGI或mod_perlæ‰?展来改善性能åQ‰æ¥æ¨¡æ‹Ÿ˜q™ç§æ–¹å¼åŽÕdˆ†æ‹…负载,而Web服务器仍然保持简‹zã€é«˜æ•ˆçš„ç‰ÒŽ€§ï¼Œæ­¤æ—¶é¿å…Location循环的ä“Q务将ç”Þq”¨æˆïLš„CGI½E‹åºæ¥æ‰¿æ‹…ã€?/p>

  2. åŸÞZºŽDNS的负载均è¡?/strong>

    ç”?于基于服务器软äšg的负载均衡需要改动èÊYä»Óž¼Œå› æ­¤å¸¸å¸¸æ˜¯å¾—不偿失,负蝲均衡最好是在服务器软äšg之外来完成,˜q™æ ·æ‰èƒ½åˆ©ç”¨çŽ°æœ‰æœåŠ¡å™¨èÊYä»¶çš„¿Uç§ä¼˜åŠ¿ã€‚æœ€æ—©çš„è´?载均衡技术是通过DNS服务中的随机名字解析来实现的åQŒåœ¨DNS服务器中åQŒå¯ä»¥äؓ多个不同的地址配置同一个名字,而最¾lˆæŸ¥è¯¢è¿™ä¸ªåå­—的客户机将在解析这ä¸?名字时得到其中的一个地址。因此,对于同一个名字,不同的客æˆähœºä¼šå¾—åˆîC¸åŒçš„地址åQŒä»–们也ž®Þp®¿é—®ä¸åŒåœ°å€ä¸Šçš„Web服务器,从而达到负载均衡的目的ã€?/p>

    例如如果希望使用三个Web服务器来回应对www.exampleorg.org.cnçš„HTTPè¯äh±‚åQŒå°±å¯ä»¥è®„¡½®è¯¥åŸŸçš„DNS服务器中关于该域的数据包括有与下面例子类似的¾l“æžœåQ?/p>

    www1		IN		A 		192.168.1.1
    www2		IN		A 		192.168.1.2
    www3		IN		A 		192.168.1.3
    www		IN		CNAME		www1
    www		IN		CNAME		www2
    www		IN		CNAME		www3

    此后外部的客æˆähœºž®±å¯èƒ½éšæœºçš„得到对应www的不同地址åQŒé‚£ä¹ˆéšåŽçš„HTTPè¯äh±‚也就发送给不同地址了ã€?/p>

    DNS 负蝲均衡的优ç‚ÒŽ˜¯½Ž€å•、易行,òq¶ä¸”服务器可以位于互联网的ä“Q意位¾|®ä¸ŠåQŒå½“前ä‹É用在包括Yahoo在内的Web站点上。然而它也存在不ž®‘缺点,一个缺ç‚ÒŽ˜¯ä¸?了保证DNS数据及时更新åQŒä¸€èˆ¬éƒ½è¦å°†DNS的刷新时间设¾|®çš„较小åQŒä½†å¤ªå°ž®×ƒ¼šé€ æˆå¤ªå¤§çš„额外网¾lœæµé‡ï¼Œòq¶ä¸”更改了DNS数据之后也不能立即生效;½W¬äºŒç‚?是DNS负蝲均衡无法得知服务器之间的差异åQŒå®ƒä¸èƒ½åšåˆ°ä¸ºæ€§èƒ½è¾ƒå¥½çš„æœåŠ¡å™¨å¤šåˆ†é…è¯·æ±‚ï¼Œä¹Ÿä¸èƒ½äº†è§£åˆ°æœåŠ¡å™¨çš„å½“å‰çŠ¶æ€ï¼Œç”šè‡³ä¼šå‡ºçŽ°å®¢æˆ¯‚¯·æ±‚集中在某一台服 务器上的偶然情况ã€?/p>

  3. 反向代理负蝲均衡

    使用代理服务器可以将è¯äh±‚转发¾l™å†…部的Web服务器,使用˜q™ç§åŠ é€?模式昄¡„¶å¯ä»¥æå‡é™æ€ç½‘™å늚„讉K—®é€Ÿåº¦ã€‚因此也可以考虑使用˜q™ç§æŠ€æœ¯ï¼Œè®©ä»£ç†æœåС噍ž®†è¯·æ±‚均匀转发¾l™å¤šå°å†…部Web服务器之一上,从而达到负载均衡的目的ã€?˜q™ç§ä»£ç†æ–¹å¼ä¸Žæ™®é€šçš„代理方式有所不同åQŒæ ‡å‡†ä»£ç†æ–¹å¼æ˜¯å®¢æˆ·ä½¿ç”¨ä»£ç†è®‰K—®å¤šä¸ªå¤–部Web服务器,而这¿Uä»£ç†æ–¹å¼æ˜¯å¤šä¸ªå®¢æˆ·ä½¿ç”¨å®ƒè®¿é—®å†…部Web服务器,å›?此也被称为反向代理模式ã€?/p>

    实现˜q™ä¸ªåå‘代理能力òq¶ä¸èƒ½ç®—是一个特别复杂的ä»ÕdŠ¡åQŒä½†æ˜¯åœ¨è´Ÿè²å‡è¡¡ä¸­è¦æ±‚特别高的效率,˜q™æ ·å®žçްèµäh¥ž®×ƒ¸æ˜¯ååˆ?½Ž€å•的了。每针对一‹Æ¡ä»£ç†ï¼Œä»£ç†æœåŠ¡å™¨å°±å¿…é¡»æ‰“å¼€ä¸¤ä¸ª˜qžæŽ¥åQŒä¸€ä¸ªäØ“å¯¹å¤–çš„è¿žæŽ¥ï¼Œä¸€ä¸ªäØ“å¯¹å†…çš„è¿žæŽ¥ï¼Œå› æ­¤å¯¹äºŽ˜qžæŽ¥è¯äh±‚数量非常大的时候,代理服务器的负蝲ä¹?ž®±éžå¸æ€¹‹å¤§äº†åQŒåœ¨æœ€åŽåå‘代理服务器会成为服务的瓉™¢ˆã€‚例如,使用Apacheçš„mod_rproxy模块来实现负载均衡功能时åQŒæä¾›çš„òq¶å‘˜qžæŽ¥æ•°é‡å?Apache本èínçš„åÆˆå‘è¿žæŽ¥æ•°é‡çš„é™åˆ¶ã€‚ä¸€èˆ¬æ¥è®ÔŒ¼Œå¯ä»¥ä½¿ç”¨å®ƒæ¥å¯¹è¿žæŽ¥æ•°é‡ä¸æ˜¯ç‰¹åˆ«å¤§åQŒä½†æ¯æ¬¡˜qžæŽ¥éƒ½éœ€è¦æ¶ˆè€—大量处理资源的站点˜q›è¡Œè´Ÿè²å‡è¡¡åQŒä¾‹å¦‚搜寅R€?/p>

    ä½?用反向代理的好处是,可以ž®†è´Ÿè½½å‡è¡¡å’Œä»£ç†æœåŠ¡å™¨çš„é«˜é€Ÿç¼“å­˜æŠ€æœ¯ç»“åˆåœ¨ä¸€èµøP¼Œæä¾›æœ‰ç›Šçš„æ€§èƒ½åQŒå…·å¤‡é¢å¤–的安全性,外部客户不能直接讉K—®çœŸå®žçš„æœåŠ¡å™¨ã€‚åÆˆä¸?实现èµäh¥å¯ä»¥å®žçŽ°è¾ƒå¥½çš„è´Ÿè½½å‡è¡¡ç­–ç•¥ï¼Œž®†è´Ÿè½½å¯ä»¥éžå¸¸å‡è¡¡çš„分给内部服务器,不会出现负蝲集中到某个服务器的偶然现象ã€?/p>

  4. åŸÞZºŽNAT的负载均衡技æœ?/strong>

    ¾|?¾lœåœ°å€è½¬æ¢ä¸ºåœ¨å†…部地址和外部地址之间˜q›è¡Œè½¬æ¢åQŒä»¥ä¾¿å…·å¤‡å†…部地址的计½Ž—机能访问外部网¾lœï¼Œè€Œå½“外部¾|‘ç»œä¸­çš„è®¡ç®—æœø™®¿é—®åœ°å€è½¬æ¢¾|‘关拥有的某一外部地址 æ—Óž¼Œåœ°å€è½¬æ¢¾|‘关能将其è{发到一个映ž®„的内部地址上。因此如果地址转换¾|‘关能将每个˜qžæŽ¥å‡åŒ€è½¬æ¢ä¸ÞZ¸åŒçš„内部服务器地址åQŒæ­¤åŽå¤–部网¾lœä¸­çš„计½Ž—机ž®±å„自与 自己转换得到的地址上服务器˜q›è¡Œé€šä¿¡åQŒä»Žè€Œè¾¾åˆ°è´Ÿè½½åˆ†æ‹…的目的ã€?/p>

    åœ?址转换可以通过软äšg方式来实玎ͼŒä¹Ÿå¯ä»¥é€šè¿‡¼‹¬äšg方式来实现。ä‹É用硬件方式进行操作一般称ä¸ÞZº¤æ¢ï¼Œè€Œå½“交换必须保存TCP˜qžæŽ¥ä¿¡æ¯çš„æ—¶å€™ï¼Œ˜q™ç§é’ˆå¯¹OSI¾|?¾lœå±‚的操作就被称为第四层交换。支持负载均衡的¾|‘络地址转换为第四层交换机的一¿Ué‡è¦åŠŸèƒ½ï¼Œç”׃ºŽå®ƒåŸºäºŽå®šåˆ¶çš„¼‹¬äšg芯片åQŒå› æ­¤å…¶æ€§èƒ½éžå¸¸ä¼˜ç§€åQŒå¾ˆå¤šäº¤æ¢æœºå£?¿U°å…·å¤?00MB-800MB的第四层交换能力åQŒç„¶è€Œä¹Ÿæœ‰ä¸€äº›èµ„料表明,在如此快的速度下,大部分交换机ž®×ƒ¸å†å…·å¤‡ç¬¬å››å±‚交换能力了,而仅仅支持第三层ç”?至第二层交换ã€?/p>

    然而对于大部分站点来讲åQŒå½“前负载均衡主要是解决Web服务器处理能力瓶颈的åQŒè€Œéž¾|‘络传输能力åQŒå¾ˆå¤šç«™ç‚¹çš„互联¾|‘连接带宽æ€Õd…±ä¹Ÿä¸˜q?0MBåQŒåªæœ‰æžž®‘的站点能够拥有较高速的¾|‘络˜qžæŽ¥åQŒå› æ­¤ä¸€èˆ¬æ²¡æœ‰å¿…要ä‹É用这些负载均衡器˜q™æ ·çš„æ˜‚贵设备ã€?/p>

    ä½?用èÊY件方式来实现åŸÞZºŽ¾|‘络地址转换的负载均衡则要实际的多,除了一些厂商提供的解决æ–ÒŽ³•之外åQŒæ›´æœ‰æ•ˆçš„æ–¹æ³•是使用免费的自ç”ÞpÊY件来完成˜q™é¡¹ä»ÕdŠ¡ã€‚å…¶ä¸­åŒ…æ‹?Linux Virtual Server Project中的NAT实现方式åQŒæˆ–者本文作者在FreeBSD下对natd的修订版本。一般来è®ÔŒ¼Œä½¿ç”¨˜q™ç§è½¯äšg方式来实现地址转换åQŒä¸­å¿ƒè´Ÿè½½å‡è¡¡å™¨å­?在带宽限åˆÓž¼Œåœ?00MB的快速以太网条äšg下,能得到最快达80MB的带宽,然而在实际应用中,可能只有40MB-60MB的可用带宽ã€?/p>

  5. 扩展的负载均衡技�

ä¸?面ä‹É用网¾lœåœ°å€è½¬æ¢æ¥å®žçŽ°è´Ÿè½½åˆ†æ‹…ï¼Œæ¯«æ— ç–‘é—®æ‰€æœ‰çš„¾|‘络˜qžæŽ¥éƒ½å¿…™å»é€šè¿‡ä¸­å¿ƒè´Ÿè²å‡è¡¡å™¨ï¼Œé‚£ä¹ˆå¦‚果负蝲特别大,以至于后台的服务器数量不再在是几台、十å‡?収ͼŒè€Œæ˜¯ä¸Šç™¾å°ç”šè‡Ïx›´å¤šï¼Œå³ä¾¿æ˜¯ä‹É用性能优秀的硬件交换机也回遇到瓉™¢ˆã€‚此旉™—®é¢˜å°†è½¬å˜ä¸ºï¼Œå¦‚何ž®†é‚£ä¹ˆå¤šå°æœåŠ¡å™¨åˆ†å¸ƒåˆ°å„ä¸ªäº’è”ç½‘çš„å¤šä¸ªä½¾|®ï¼Œåˆ†æ•£¾|‘络è´?担。当然这可以通过¾l¼åˆä½¿ç”¨DNSå’ŒNAT两种æ–ÒŽ³•来实玎ͼŒç„¶è€Œæ›´å¥½çš„æ–¹å¼æ˜¯ä‹É用一¿UåŠä¸­å¿ƒçš„负载均衡方式ã€?/p>

在这¿UåŠä¸­å¿ƒçš„负载均衡方式下åQŒå³å½“客戯‚¯·æ±‚发送给负蝲均衡器的时候,中心负蝲均衡器将è¯äh±‚打包òq¶å‘送给某个服务器,而服务器的回应请求不再返回给中心负蝲均衡器,而是直接˜q”回¾l™å®¢æˆøP¼Œå› æ­¤ä¸­å¿ƒè´Ÿè²å‡è¡¡å™¨åªè´Ÿè´£æŽ¥å—òq¶è{发请求,其网¾lœè´Ÿæ‹…就较小了ã€?/p>

上图来自Linux Virtual Server ProjectåQŒäؓ他们使用IP隧道实现的这¿Uè´Ÿè½½åˆ†æ‹…能力的è¯äh±‚/回应˜q‡ç¨‹åQŒæ­¤æ—¶æ¯ä¸ªåŽå°æœåŠ¡å™¨éƒ½éœ€è¦è¿›è¡Œç‰¹åˆ«çš„åœ°å€è½¬æ¢åQŒä»¥‹Æºéª—‹¹è§ˆå™¨å®¢æˆøP¼Œè®¤äؓ它的回应为正¼‹®çš„回应ã€?/p>

同样åQŒè¿™¿Uæ–¹å¼çš„¼‹¬äšg实现方式也非常昂贵,但是会根据厂商的不同åQŒå…·å¤‡ä¸åŒçš„ç‰ÒŽ®ŠåŠŸèƒ½åQŒä¾‹å¦‚对SSL的支持等ã€?/p>

ç”׃ºŽ˜q™ç§æ–¹å¼æ¯”较复杂åQŒå› æ­¤å®žçްè“v来比较困难,它的èµïL‚¹ä¹Ÿå¾ˆé«˜ï¼Œå½“å‰æƒ…å†µä¸‹ç½‘ç«™åÆˆä¸éœ€è¦è¿™ä¹ˆå¤§çš„å¤„ç†èƒ½åŠ›ã€?/font>

æ¯?较上面的负蝲均衡方式åQŒDNS最å®ÒŽ˜“åQŒä¹Ÿæœ€å¸¸ç”¨åQŒèƒ½å¤Ÿæ»¡­‘³ä¸€èˆ¬çš„需求。但如果需要进一步的½Ž¡ç†å’ŒæŽ§åˆÓž¼Œå¯ä»¥é€‰ç”¨åå‘代理方式或NAT方式åQŒè¿™ä¸¤ç§ä¹‹é—´˜q›è¡Œ 选择主要依赖¾~“冲是不是很重要åQŒæœ€å¤§çš„òq¶å‘讉K—®æ•°é‡æ˜¯å¤šž®‘等条äšg。而如果网站上对负载媄响很厉害的CGI½E‹åºæ˜¯ç”±¾|‘站自己开发的åQŒä¹Ÿå¯ä»¥è€ƒè™‘在程序中自己 使用Locaction来支持负载均衡。半中心化的负蝲分担方式臛_°‘在国内当前的情况下还不需要ã€?br /> http://galaxystar.javaeye.com/blog/50546



]]>
垃圾攉™›†æœºåˆ¶(Garbage Collection)批判http://www.aygfsteel.com/coolfiry/archive/2007/10/12/152260.htmlCoolfiryCoolfiryFri, 12 Oct 2007 02:43:00 GMThttp://www.aygfsteel.com/coolfiry/archive/2007/10/12/152260.htmlhttp://www.aygfsteel.com/coolfiry/comments/152260.htmlhttp://www.aygfsteel.com/coolfiry/archive/2007/10/12/152260.html#Feedback1http://www.aygfsteel.com/coolfiry/comments/commentRss/152260.htmlhttp://www.aygfsteel.com/coolfiry/services/trackbacks/152260.html在Java版发表这½‹‡æ–‡ç« ï¼Œä¼ég¹Žæœ‰ç‚¹æŠŠçŸ›å¤´æŒ‡å‘Java了。其实不是,GC是所有新一代语­a€å…±æœ‰çš„特征,
Python, EiffelåQŒC#åQŒRoby½{‰æ— ä¸€ä¾‹å¤–地都使用了GC机制。但既然Java中的GCæœ€ä¸ø™‘—名,所以天å¡?br /> 下来自然应该抗着ã€?/span>

˜q™ç¯‡çŸ­æ–‡æºäºŽcomp.lang.java.programmerè·Ÿcomp.lang.c++上发生的一场大辩论åQŒæ”¯æŒC++å’ŒJava
的两‹z¾ä¸åŒåŠ¿åŠ›å±•å¼€äº†æ–°ä¸–çºª½W¬ä¸€åœºå†²½Hï¼Œè·Ÿè„“发言­‘…过350åQŒä¸¤‹zùNƒ½æœ‰åè§’压é˜üc€‚C++阵营的擂ä¸ÀL˜¯
Pete BeckeråQŒACM会员åQŒDinkumware Ltd. 的技术副æ€È›‘。此君精通C++å’ŒJavaåQŒå¼€å‘过两种语言çš?br /> 核心¾cÕdº“åQŒä½†æ˜¯å´å¯¹C++狂热之极åQŒè€Œå¯¹äºŽJavaé¢‡ä¸ä»¥äØ“ç„¶ã€‚åã^时谈到Javaçš„æ—¶å€™è¿˜å¥½ï¼Œä¸€æ—¦æœ‰äºø™ƒ†
敢用Java来批判C++åQŒç«‹åˆÕd¿ä¸ä½ç«çˆ†è„¾æ°”è·›_°†å‡ºæ¥åQŒä»¥åšéŸ§ä¸æ‹”的毅力和大无畏精¼œžä¸Žå¯Òމ‹å‘¨æ—‹åQ?br /> 舌战¾Ÿ¤å„’åQŒå“ªæ€•只剩下一个äh也要血战到底。这½{‰å¥‡äººå½“真少见!我真奇怪他整天泡在usenet上,
不用工作么?他的老板P.J. Plauger如此宽宏大量åQŸJava阵营主角是一个网名Razzi的兄弟,另外æœ?br /> Sun公司大名鼎鼎的Peter van der Linden助阵åQŒå¦™è¯­è¿žç ï¼Œå¯¸åœŸå¿…争åQŒåŠ ä¸Šäh多势众,一度占据优åŠÑ€?br /> C++阵营里大拿虽然很多,但是大多数没有Pete那么多闲工夫åQŒä¾‹å¦‚Greg ComeauåQŒComeau公司老板åQ?br /> 每次来个只言片语åQŒå®žåœ¨å¸®ä¸äº†Pete多大忙。但是自从C++阵营中冒å‡ÞZ¸€ä¸ªæ— åå°å­ï¼Œ¾|‘名Courage(勇气)åQ?br /> 发动对Java GC机制的批判,形势ä¸ÞZ¹‹ä¸€å˜ã€‚C++阵营çœég¸‹å¤„于全攻之势åQŒJava阵营疲于防守åQŒåªèƒ?br /> 招架è¯ß_¼š“你们没有证据åQŒæ²¡æœ‰ç»Ÿè®¡èµ„æ–?#8221;åQŒåŞ势很被动ã€?/span>

垃圾攉™›†(GC)不是一直被Java fans用来炫耀åQŒå¼•ä»¥äØ“å‚²çš„ä¼˜ç‚¹ä¹ˆï¼Ÿæ€Žä¹ˆæˆäº†å¼Þq‚¹äº†ï¼Ÿæˆ‘大惑不解,定睛
一看,才觉得此中颇有道理�/span>

首先åQŒJava Swing库存在大量资源泄漏问题,˜q™ä¸€ç‚¹SUN非常清楚åQŒç§°ä¹‹äØ“bugsåQŒæ­£åœ¨æžåŠ›ä¿®æ­£ã€‚ä½†æ˜¯çœ‹æ?br /> ˜q™é‡Œçš„问题恐怕不仅是库编写者的疏忽åQŒå¯èƒ½æ ¹æºåœ¨äºŽæ·±å±‚的机制åQŒæœªå¿…能够轻易解冻I¼Œæžä¸å¥½è¦ä¼¤ç­‹åŠ¨éª¨ã€?br /> 不过˜q™ä¸ªé—®é¢˜ä¸æ˜¯é‚£ä¹ˆæ ÒŽœ¬åQŒC++阵营觉得如果抓住å¯ÒŽ–¹çš„å¼±ç‚ÒŽ”»å‡»ï¼Œž®Þq®—是占了上风也没什么说服力。谁
没有¾~ºç‚¹å‘¢ï¼ŸäºŽæ˜¯åå…¶é“而行之,猛烈æ”Õd‡»Java阵营觉得最得意的东西,Javaçš„GC机制本èínã€?/span>

首先来想一惻I¼Œmemory leak到底意味着什么。在C++中,new出来的对象没有deleteåQŒè¿™ž®±å¯¼è‡´äº†memory
leak。但是C++早就有了克服˜q™ä¸€é—®é¢˜çš„办法——smart pointer。通过使用标准库里设计¾_¾è‡´çš„auto_ptr
以及各种STL容器åQŒè¿˜æœ‰ä¾‹å¦‚booståº?差不多是个准标准库了)中的四个smart pointersåQŒC++
½E‹åºå‘˜åªè¦?br /> èŠ×ƒ¸Šä¸€ä¸ªæ˜ŸæœŸçš„æ—‰™—´å­¦ä¹ æœ€æ–°çš„资料åQŒå°±å¯ä»¥æ‹ç€èƒ¸è„¯è¯ß_¼š“我写çš?/span>½E‹åºæ²¡æœ‰memory leak!”ã€?/span>

相比之下åQŒJavaä¼ég¹Žæ›´ä¼˜¿U€åQŒå› ä¸ÞZ»Žä¸€å¼€å§‹ä½ ž®×ƒ¸ç”¨è€ƒè™‘什么特ŒDŠçš„æœºåˆ¶åQŒå¤§èƒ†åœ°å¾€å‰newåQŒè‡ªæœ‰GC替你
收拾ŒD‹å±€ã€‚Javaçš„GC实际上是
JVM中的一个独立线½E‹ï¼Œé‡‡ç”¨ä¸åŒçš„ç®—æ³?/span>½{–略来收集heap中那些不再有
reference指向的垃圑֯¹è±¡æ‰€å ç”¨çš„内存。但是,通常情况下,GC¾U¿ç¨‹çš„优先çñ”比较低,只有在当å‰?/span>½E‹åº
½Iºé—²çš„æ—¶å€™æ‰ä¼šè¢«è°ƒåº¦åQŒæ”¶é›†åžƒåœ¾ã€‚当ç„Óž¼Œå¦‚æžœJVM感到内存紧张了,JVM会主åŠ?/span>调用GC来收集垃圾,获取
更多的内存。请注意åQŒJavaçš„GC工作的时机是åQ?. 当前
½E‹åºä¸å¿™åQŒæœ‰½Iºé—²æ—‰™—´ã€?. ½Iºé—²å†…存不èƒöã€?br /> 现在我们考虑一¿Uå¸¸è§çš„æƒ…况åQ?/span>½E‹åºåœ¨ç´§å¼ è¿è¡Œä¹‹ä¸­ï¼Œæ²¡å“Ÿ½Iºé—²æ—‰™—´¾l™GC来运行,同时机器内存很大åQ?br /> JVM也没有感到内存不­‘»I¼Œ¾l“果是什么?对了åQŒGC形同虚设åQŒå¾—不到调用。于是,内存被不断吞噬,而那äº?br /> æ—©å·²¾lç”¨ä¸ç€çš„垃圑֯¹è±¡ä»åœ¨åœ¨å®è´µçš„内存里睡大觉。例如:

class BadGc {

    public void job1() {
        String garbage = "I am a garbage, and just sleeping in your precious memory, " +
                  "how do you think you can deal with me? Daydreaming! HAHA!!!";
        ....
    }

    public void job2() {...}

    ...
    ...

    public void job1000() {...}

    public static void main(String[] args) {
        bgc = new BadGc();
 bgc.job1();
 bgc.job2();
 ...
 bgc.job1000();
    }
}

˜qè¡Œä¸­ï¼Œè™½ç„¶garbage对象在离开job1()之后åQŒå°±å†ä¹Ÿæ²¡æœ‰ç”¨äº†ã€‚但是因ä¸?/span>½E‹åºå¿™ï¼Œå†…å­˜˜q˜å¤Ÿç”¨ï¼Œæ‰€ä»¥GCå¾?br /> 不到调度åQŒgarbage始终不会被回æ”Óž¼Œç›´åˆ°½E‹åº˜qè¡Œåˆ°bgc.job1000()时还íwºåœ¨å†…存里嘲½W‘你。没辙吧åQ?/span>

好了åQŒæˆ‘承认˜q™æ®µ½E‹åºå¾ˆå‚»ã€‚ä½†æ˜¯ä½ ä¸è¦ä»¥äØ“˜q™åªæ˜¯ç†è®ÞZ¸Šçš„假设,恰恰相反åQŒå¤§å¤šæ•°å®žç”¨ä¸­çš„Java½E‹åºéƒ½æœ‰
¾cÖM¼¼çš„æ•ˆåº”。这ž®±æ˜¯ä¸ÞZ»€ä¹ˆJava
½E‹åºç‹‚耗内存,而且好像¾l™å®ƒå¤šå°‘内存吃都不够。你èŠ×ƒ¸Šå¤§ç¬”的银子把内存
ä»?28升到256åQŒå†å‡åˆ°512åQŒç»“果是åQŒä¸€æ—¦æ‰§è¡Œå¤æ‚ä“Q务,内存˜q˜æ˜¯è¢«è½»æ˜“填满,而且多出来的˜q™äº›å†…存只是
用来装垃圾,GC˜q˜æ˜¯ä¸ç»™é¢å­åœ°åƒå‘ég¸‡å”¤ä¸å‡ºæ¥ã€‚ç­‰åˆîC½ çš„内存终于心力交瘁,GC才姗姗来˜qŸï¼Œæ”¶æ‹¾ŒD‹å±€ã€‚è€?br /> 且GCå·¥ä½œçš„æ–¹å¼ä¹Ÿå¾ˆä¸å¥½è¯„ä»øP¼Œä¸€¿Uæ–¹æ³•是一旦有æœÞZ¼šå›žæ”¶å†…å­˜åQŒå°±æŠŠæ‰€æœ‰çš„垃圾都回收。你可以惌™±¡åQŒè¿™è¦?br /> 花很长时é—?几百M的垃圑֕ŠåQ?åQŒå¦‚果你˜q™æ—¶ä¾¯æ­£åœ¨åŽ‹ä¸‹å¼€ç‚®çš„æŒ‰é’®åQŒGC却叫了暂定,好了åQŒä½ ½{‰æ­»å§ï¼å¦ä¸€
¿Uæ–¹æ³•,得到æœÞZ¼šä¹‹åŽåQŒå›žæ”¶ä¸€äº›å†…存,让JVM感到内存不那么紧张时ž®±æ”¶æ‰‹ã€‚结果呢åQŒå†…存里始终有大批垃
圾,
½E‹åºå§‹ç»ˆåœ¨åŠæ­ÖM¸‹zȝš„荡着。最后,GC可以每隔一ŒD‰|—¶é—´å°±˜qè¡Œä¸€‹Æ¡ï¼Œæ¯æ¬¡åªå›žæ”¶ä¸€éƒ¨åˆ†åžƒåœ¾åQŒè¿™æ˜¯çްåœ?br /> 大部分JVM的方式,¾l“果是内存也‹¹ªè´¹äº†ï¼Œ˜q˜åŠ¨ä¸åŠ¨æš‚åœå‡ ç™¾æ¯«ç§’ã€‚éš¾å•Šï¼

反过来看看C++利用smart pointer达成的效果,一旦某对象不再被引用,¾pȝ»ŸåˆÖM¸å®¹ç¼“åQŒç«‹åˆÕd›žæ”¶å†…存。这
通常发生在关键ä“Q务完成后的清ç?cleanup)时期åQŒä¸ä¼šåª„响关键ä“Q务的实时性,同时åQŒå†…存里所有的对象
都是有用的,¾lå¯¹æ²¡æœ‰åžƒåœ¾½Iºå å†…å­˜ã€‚æ€Žä¹ˆæ øP¼Ÿä¼ ç»Ÿã€æœ´ç´ çš„C++是不是更胜一½{¹ï¼Ÿ

据统计,目前的Java½E‹åº˜qè¡ŒæœŸé—´å ç”¨çš„内存通常为对应C++½E‹åºçš?-20倍。除了其它的原因åQŒä¸Šé¢æ‰€è¯´çš„æ˜¯ä¸€ä¸?br /> 非常主要的因素。我们对memory leak如此愤恨åQŒä¸ž®±æ˜¯å› äؓ它导致大量的内存垃圾得不到清除吗åQŸå¦‚果有äº?br /> GC之后åQŒåžƒåœ¾æ¯”以前˜q˜æ¥åŠ¿æ‘v汹,那么GC又有什么好处呢åQ?/span>

当然åQŒC++çš„smart pointer现在会ä‹É用的äºÞZ¸å¤šï¼Œæ‰€ä»¥çŽ°åœ¨çš„C++½E‹åºæ™®éå­˜åœ¨æ›´ä¸¥é‡çš„memory leak问题ã€?br /> 但是åQŒå¦‚果我奶奶跟舒马赫比赛车输掉了åQŒä½ èƒ½å¤ŸåŸ‹æ€¨é‚£è¾†èžR子么åQ?br /> http://www.594k.com/java/html/y2007m1/12051/



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÅíÉ½ÏØ| ƽÓßÏØ| Ã÷ÐÇ| ÌÆÉ½ÊÐ| ÇàÍ­Ï¿ÊÐ| ¶«ÖÁÏØ| ±ß°ÓÏØ| ÎÚÀ­ÌØÇ°Æì| ·±ÖÅÏØ| ò£ÉÏÏØ| Ñ®ÒØÏØ| ƽÂÞÏØ| É̶¼ÏØ| ¾¸ÓîÏØ| ÄÏ¿µÊÐ| ±¦Ó¦ÏØ| ÎôÑôÏØ| ±ö´¨ÏØ| À¥Ã÷ÊÐ| ÊÙ¹âÊÐ| ÉϸßÏØ| °ÍÀï| ÐÂÀÖÊÐ| ÜõÍåÇø| ÀÖɽÊÐ| ·î»¯ÊÐ| ¤´¨ÏØ| Æ½É½ÏØ| ÌïÁÖÏØ| ̨ÄÏÊÐ| ÎÂÖÝÊÐ| ÐÂÌïÏØ| ±±¾©ÊÐ| ×Þ³ÇÊÐ| ËÕÄáÌØ×óÆì| ÃñºÍ| ÐÂÒ°ÏØ| ÙÙÖÝÊÐ| Òø´¨ÊÐ| ´ó·áÊÐ| ɯ³µÏØ|