﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-上善若水-文章分类-Ajax</title><link>http://www.blogjava.net/bourn/category/25427.html</link><description> 反者道之动，弱者道之用。
 天下万物生于有，有生于无。</description><language>zh-cn</language><lastBuildDate>Sat, 20 Oct 2007 22:47:08 GMT</lastBuildDate><pubDate>Sat, 20 Oct 2007 22:47:08 GMT</pubDate><ttl>60</ttl><item><title>AJAX应用的客户端负载均衡问题探究</title><link>http://www.blogjava.net/bourn/articles/153531.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Wed, 17 Oct 2007 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/153531.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/153531.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/153531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/153531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/153531.html</trackback:ping><description><![CDATA[<p>
作者
<strong>Gavin Terrill</strong>译者
<strong>王翔(Vision Wang)</strong>
发布于
2007年10月10日 下午8时48分
</p>
<dl><dt>社区</dt><dd><a href="http://www.infoq.com/cn/architecture" name="architecture" id="1,390" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">Architecture</a></dd><dt>主题</dt><dd><a href="http://www.infoq.com/cn/ria" name="ria" id="777" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">RIA</a>,</dd><dd><a href="http://www.infoq.com/cn/performance-scalability" name="performance-scalability" id="754" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">性能和扩展性</a></dd></dl>
<p>今天，当我们选择负载均衡时，大部分Web应用集群选择基于软件或硬件的服务器端方案，而<a href="http://www.digital-web.com/">《Digital Web Magazine》</a>最近发表的<a href="http://www.digital-web.com/articles/client_side_load_balancing/">一篇文章</a>讨论了一家公司如何在<a href="http://www.amazon.com/gp/browse.html?node=201590011">EC2</a>支持的应用中实现客户端负载均衡。</p>
<p>文章从负载均衡方案的需求谈起：</p>
<blockquote>
<li>需要在应用服务器集群中分担负载；</li>
<li>温和地应对单个服务器的宕机；</li>
<li>确保在最终用户端可以把这组服务器视为一个单独的服务器。</li>
</blockquote>
<p>作者朱磊（音译 Lei Zhu）分析了我们常用的服务端负载均衡手段——循环DNS（<a href="http://en.wikipedia.org/wiki/Round_robin_DNS">Round Robin DNS</a>），文中提到：</p>
<blockquote>很不幸，循环DNS的主要弱点是不能满足上面提到的第二个需求，当两台服务器中的一台宕机时，DNS服务器仍然会继续把请求发给它，这导致一半用户无法获得响应。</blockquote>
<p>他还指出集群前端软、硬件专用方案的不足：负载均衡器（Load
Balancer）自己总有一个响应数量上限，尽管可以通过循环DNS配合专用负载均衡器解决这一问题，但维护一个专用负载均衡器需要额外投入数万美元，
而且通常后备负载均衡器只有在主设备出现故障后才会发挥作用。</p>
<p>在客户端负载均衡概念的介绍中，作者请读者考虑关于桌面应用如何负载均衡的问题：</p>
<blockquote>桌面程序随机选择一台服务器，然后尝试获取数据，如果服务器不可用或没有在预设的时间内响应，那么就选择另一台服务器，直到可以
提取数据。桌面应用与Web应用不同的是，前者是独立于服务器，可以在客户端通过对服务器访问的负载均衡实现应用的可扩展性，而后者把客户端代码
（JavaScript或Flash WSF）保存在提供数据和资源的服务器上。</blockquote>
<p>为了把概念延伸到Web应用，作者剖析了典型AJAX应用的关键组成：</p>
<blockquote>
<li>客户端代码：JavaScript/Flash客户端的SWF；</li>
<li>资源：图片、级联样式表、音频和视频文件、HTML文档；</li>
<li>服务端代码：用于反馈客户端所需数据的后台逻辑。</li>
</blockquote>
<p>其中1、2两类内容相对静止，一般不像第3类那样有负载均衡的需要。关注于第3类组成，作者建议采用可靠的服务器或者像亚马逊<a href="http://aws.amazon.com/s3">S3那样的服务</a>，它描绘的策略如下：</p>
<blockquote>就像桌面应用一样，我们可以把一个应用服务器列表嵌到客户端代码里，Web客户端包括一个称为Servers.XML的文件，它保存了可用服务器的列表。客户端通过AJAX或者Flash访问列表中的每一个服务器，直到找到一台可响应的。</blockquote>
<p>尽管浏览器可以禁止客户端代码向它所来源的那些服务器之外的服务器发起服务端调用，但作者还是建议采用Flash或JavaScript的方案解决这个问题。采用客户端负载均衡有两个好处：</p>
<blockquote>
<li><strong>不需要额外的服务器设备，&#8220;不需要专用负载均衡设备，无需配置负载均衡硬件或确认备份功能和主负载均衡器是否正常工作&#8221;；</strong></li>
<li><strong>服务器可以被物理隔离，&#8220;由于是客户端选择服务器而不是由一个固定的负载均衡器重定向调用，所以服务器的位置不受限制&#8221;。</strong></li>
</blockquote>
<p>文章结尾，作者介绍了上述技术如何在亚马逊的EC2和S3基础上构造一个叫<a href="http://www.voxlite.com/">VoxLite</a>的具有高可用性和可扩展性的视频资讯应用，不过作者并没有架构出一个没有单点故障的负载均衡方案。</p>
<blockquote>很多Web应用会面向特定区域，通过一个动态DNS支持的EC2实例实现调用的负载均衡。如果提供负载均衡的这个实例出现故障，在动态DNS映像到另一个EC2实例前，整个系统就不可用了。</blockquote>
<p>为了克服这个问题，VoxLite通过向S3发起HTTP GET调用获得可用的服务器列表，该列表由EC2实例的一系列任务维护：</p>
<ol>
    <li>加载并解析<a href="http://s3.amazonaws.com/voxlite/?prefix=servers">http://s3.amazonaws.com/voxlite/?prefix=servers</a>。</li>
    <li>如果当前运行实例没有被列出来，就向一批EC2实例的关键服务器各发送一个空文件；</li>
    <li>通过测试到亚马逊内部Web服务IP地址的连接情况，可以验证该批其他服务器的是否运行正常，如果无法建立连接就把该服务器从这批服务器的列表中删掉。</li>
</ol>
<p>根据你的需求，客户端负载均衡在统一负载均衡的架构下，提供了一个有趣且具创新性的选择。作者总结道：</p>
<blockquote>通过在客户端负载均衡中采用S3和EC2，可以简化搭建一个具有弹性、扩展性、健壮性Web应用的工作。</blockquote>
<p><strong>查看英文原文：</strong><a href="http://www.infoq.com/news/2007/10/clientsideloadbalancing">Client side load balancing of Ajax applications</a></p>
<img src ="http://www.blogjava.net/bourn/aggbug/153531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-10-17 12:49 <a href="http://www.blogjava.net/bourn/articles/153531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实际项目中的Ajax</title><link>http://www.blogjava.net/bourn/articles/141683.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Fri, 31 Aug 2007 04:12:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/141683.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/141683.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/141683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/141683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/141683.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;"><br />
</span></p>
<p><span style="font-family: 宋体;">上一个项目使用的是</span><span>spring
MVC</span><span style="font-family: 宋体;">；</span> <span style="font-family: 宋体;">客户需要做</span>Ajax<span style="font-family: 宋体;">应用；所以就找了一些资料研究了一下，比如</span>DWR<span style="font-family: 宋体;">，</span>dojo<span style="font-family: 宋体;">，</span> prototype<span style="font-family: 宋体;">，</span>JSON-RPC, trimpath <span style="font-family: 宋体;">等等，发现很多不适合我们，比如</span>DWR<span style="font-family: 宋体;">要生成客户端</span>js<span style="font-family: 宋体;">，服务器端还要部署，麻烦；</span>dojo<span style="font-family: 宋体;">又太慢了；经过一轮淘汰剩下了</span>prototype<span style="font-family: 宋体;">和</span>trimpath<span style="font-family: 宋体;">；所以最终就选这</span>2<span style="font-family: 宋体;">个了；</span></p>
<p>Prototype<span style="font-family: 宋体;">在书写普通的</span>js<span style="font-family: 宋体;">时候，有很多好处，比如简单，实用的很多函数；比如</span>$()<span style="font-family: 宋体;">系列；</span></p>
<p>Trimpath<span style="font-family: 宋体;">提供一个客户端的</span>js<span style="font-family: 宋体;">模板，如果从服务器回来的数据很复杂，要动态改变</span>Html<span style="font-family: 宋体;">元素是比较费力的事情；用</span>trimpath<span style="font-family: 宋体;">就方便许多；</span></p>
<p><span style="font-family: 宋体;">在模板语言的世界里，总有</span>2<span style="font-family: 宋体;">个东西：模板和模板中的数据；</span>trimpath<span style="font-family: 宋体;">的模板接受的数据是</span>javascript object<span style="font-family: 宋体;">，模板则定义在一个不显示的</span>textarea<span style="font-family: 宋体;">里面；</span></p>
<p><span style="font-family: 宋体;">所以有个问题就是：怎么让</span>ajax<span style="font-family: 宋体;">调用返回一个</span>javascript<span style="font-family: 宋体;">对象？</span></p>
<p><span style="font-family: 宋体;">后来，我终于发现了（想起了刘若英）</span>JSON<span style="font-family: 宋体;">；发现</span>json<span style="font-family: 宋体;">是个好东东；比</span>xml<span style="font-family: 宋体;">轻量级，又可以很容易的转换为</span>javascript<span style="font-family: 宋体;">对象，而且还有</span>java api<span style="font-family: 宋体;">；唉，开源的世界多美妙；</span></p>
<p><span style="font-family: 宋体;">所以解决方案就是，在</span>springmvc<span style="font-family: 宋体;">框架中，用</span>response<span style="font-family: 宋体;">返回</span>json string<span style="font-family: 宋体;">，给</span>ajax <span style="font-family: 宋体;">客户端，然后生成</span>javascript<span style="font-family: 宋体;">对象，然后，调用</span>trimpath<span style="font-family: 宋体;">模板，然后，动态修改页面。</span></p>
<p><span style="font-family: 宋体;">代码片段：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>public ModelAndView getClient(HttpServletRequest request,
HttpServletResponse response) throws Exception {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>JSONObject jsonObject = new JSONObject();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Client
client=clientMgr.getClientByPk(Long.parseLong(request.getParameter("clientId")));</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>jsonObject.add("client", client);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>return ajaxResponse(jsonObject, response);</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>protected ModelAndView ajaxResponse(JSONObject jsonObject,
HttpServletResponse response) throws Exception {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>response.setContentType("application/x-json;charset=UTF-8");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>response.getWriter().print(jsonObject);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>return null;</span></p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<img src ="http://www.blogjava.net/bourn/aggbug/141683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-08-31 12:12 <a href="http://www.blogjava.net/bourn/articles/141683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 Selenium 测试 Ajax 项目</title><link>http://www.blogjava.net/bourn/articles/141549.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Thu, 30 Aug 2007 15:06:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/141549.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/141549.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/141549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/141549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/141549.html</trackback:ping><description><![CDATA[<p><br></p>
<p>&nbsp;Selenium <br>
是一个由ThoughtWorks做的专门为web应用所做的非常有效的功能测试工具。Selenium <br>
的 tests <br>
直接在浏览器里跑，就像用户真的在操作一样。Selenium <br>
可运行 Windows, Linux, 和 Macintosh
的各种浏览器， 如 <br>
Internet Explorer, Mozilla 和 Firefox。 <br>
....... </p>
<p>访问链接： <br>
<a href="http://forum.springside.org.cn/viewthread.php?tid=195&amp;extra=page%3D1" target="_blank">http://forum.springside.org.cn/viewthread.php?tid=195&amp;extra=page%3D1</a>
</p>
<br> <img src ="http://www.blogjava.net/bourn/aggbug/141549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-08-30 23:06 <a href="http://www.blogjava.net/bourn/articles/141549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ajax开发技术</title><link>http://www.blogjava.net/bourn/articles/141547.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Thu, 30 Aug 2007 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/141547.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/141547.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/141547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/141547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/141547.html</trackback:ping><description><![CDATA[<p>我们项目中用到的ajax技术，主要包括prototype.js, <br>
trimpath JST，JSON，java
reflection等； <br>
&nbsp; [trimpath JST： <br>
<a href="http://trimpath.com/project/wiki/JavaScriptTemplates" target="_blank">http://trimpath.com/project/wiki/JavaScriptTemplates</a>]
<br>
&nbsp; [JSON： <a href="http://www.json.org/js.html" target="_blank">http://www.json.org/js.html</a>] </p>
<p>通常的处理流程：用prototype.js发出ajax请求，并注册一个用于处理返回结果的回调函数，请求被spring的controller捕获，
<br>
&nbsp; controller处理请求并将结果转成JSON <br>
Object(而非ModelAndView),并用response对象返回； </p>
<p>回调函数，将拿到返回的对象并把它转成javascript对象，然后用Trimpath <br>
JST模版技术将返回的对象和模版合并，得到合并后的 </p>
<p>html代码，然后将html代码赋值给一个div来显示；结束； <br>
&nbsp; java reflection技术用于将java bean转成JSON对象； </p>
<p>&nbsp;</p>
<br>  <img src ="http://www.blogjava.net/bourn/aggbug/141547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-08-30 23:05 <a href="http://www.blogjava.net/bourn/articles/141547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>