手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2009年03月15日的文章

DBANOTES:学习 HeroKu 的架构设计

网址:

以上是作者和原文的信息。因为可能会布置一台服务器,所以对这方面就有点想法,作者是在对RUBY方面的架构进行学习和分析,但我想,对于PHP方面,应该也会有参考价值。已经开始有想法转硬件了,哈哈。说说而己……

原文如下:

这几天给我印象比较深的是 HeroKu ,提供 Ruby 快速部署环境并提供托管能力,他们的架构图做得十分漂亮,一幅图胜过千言万语,要是对 Web 架构感兴趣,都别问架构师了,看看 HeroKu 的架构估计就明白个差不多了 :)

概览图

好的架构图是画出来的,好的架构未必是设计出来的,最后架构好不好,还要看持续的改进能力。

HeroKu Overview.jpg


HTTP 反向代理

使用 Nginx , 这一层只进行 HTTP-level 的处理。Nginx 现在是不二选择。

HeroKu Reverse Proxy.jpg


HTTP Cache

对于静态内容,使用 Varnish 进行缓存。如果你在 Squid 和 Varnish 之间作选择,这里已经投了一票。

HeroKu HTTP cache.jpg


路由网(Routing Mesh)

Erlang 实现的架构组件,路由寻址,用以提升可用性和扩展性。

HeroKu Routing Mesh.jpg


动态网格(Dyno Grid)

用户部署的代码运行在这里,可以简单看成是应用服务器集群环境,只是粒度更小一点而已。

HeroKu Dyno Grid.jpg

对于 Dyno Grid 的进一步信息:

HeroKu Dyno Grid Arch.jpg

服务器操作系统是 Debian ;Ruby VM 是 MRI ,开源,C 写的;App Server 用的 Thin,他们说 Thin 比 Mongrel 更精炼;Rack,应用服务器接口;Rack 中间件,可选组件;框架,任何 Rack 兼容的都成;最后是客户托管的代码。

数据库

PostgreSQL,也可以采用远程数据库。

HeroKu Database.jpg


Memory Cache

Memcached ,居家旅行架构必备。

HeroKu Memcached.jpg

这几张图看下来,多少算是对 Ruby 环境有了一些感性认识。可以进一步查看 HeroKu 提供的文档,包含了一些代码实现上的准则。

部署是基于 Git 的。不知道大家有没有注意到 Git 在最近一年来的爆发? 超过 SVN 或许不是不可能的。

国内热炒"云计算"的,跟人家学学吧,与其整天帮着客户开发定制软件,还不如给客户提供一些弹性应用托管环境,起码看起来靠谱一些。

HeroKu ,不读 Hero-Ku, 读作 Her-oh-koo, 挺有趣

--EOF--

图的来源:HeroKu Platform Architecture

Tags: 架构

基于JQUERY制作的仿GOOGLE自动完成插件

本例子来自博客园,其实关于Autocompleted的例子,用jquery的话,是很多很多,但那都是国外的,难得有国内的例子,看到了就复制回来一份,呵呵

原文:http://www.cnblogs.com/cntlis/archive/2009/03/14/1412144.html

数据采用JSON,格式为{keylist:[{'keyname':关键字1,'keyextend':扩展文字(譬如说结果数目)},{'keyname':关键字2,'keyextend':扩展文字(譬如说结果数目)}]}  

JS代码(当成JS代码插入的时候,高亮会超时,所以,用HTML格式了一下)
  1. /**//*  
  2.  * jQuery AutoComplete  
  3.  *  
  4.  * Author: cntlis  
  5.  * http://blog.csdn.net/cntlis  
  6.  *  
  7.  * Licensed like jQuery, see http://docs.jquery.com/License  
  8.  *  
  9.  * 作者:cntlis  
  10.  * QQ:8112857  
  11.  */  
  12. $.fn.AutoComplete = function(url,option){  
  13.     var methis;  
  14.     var strKey= $(me).val();  
  15.     var strKeyBak"";  
  16.     var isShow = false;  
  17.     var doption={  
  18.         iwidth: '0px',    //下拉框的宽度  
  19.         iLengthLower: 1,    //当表单的长度大于iLengthLower小于iLengthUpper时才开始执行搜索  
  20.         iLengthUpper: 50,  
  21.         strPara: "Keyword",    //变量名称  
  22.         zIndex: 1,    //提示框的Z-INDEX值  
  23.         hasscroll: 0,    //是否出现滚动条0无1有  
  24.         hasclose: 1,    //是否拥有关闭窗口  
  25.         desfun:function(){}  
  26.     };  
  27.       
  28.     $.extend(doption,option);      
  29.     var iLengthLowerdoption.iLengthLower;  
  30.     var iLengthUpperdoption.iLengthUpper;  
  31.     var strParadoption.strPara;  
  32.     if ($("#autocomplete").length<1){$("body").append("<div id='autocomplete' class='autocompletefloor'></div>");}  
  33.     $("#autocomplete").hide();  
  34.       
  35.     $(me).keyup(function(e){keysearch(e.keyCode);});  
  36.     $(me).keydown(function(e){LineSelect(e.keyCode);});  
  37.     $(me).bind("blur",function(){  
  38.         strKeyBak= $("#autocomplete ul .selected .keyname").text();    //为click事件增加处理  
  39.         if (strKeyBak.length>0 && strKeyBak!=$(me).val()){  
  40.             $(me).val(strKeyBak);  
  41.             doption.desfun();  
  42.         };  
  43.         floorHide();  
  44.     });  
  45.       
  46.     var encode=function(v){//如果包含中文就escape,避免重复escape)  
  47.   return escape(v).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F');  
  48.  }  
  49.       
  50.     function floorHide(){  
  51.         $("#autocomplete").hide().html("");  
  52.         strKey"";  
  53.         isShow = false;  
  54.     }  
  55.       
  56.     function floorShow(){  
  57.         var p= $(me).offset();  
  58.         var w= (doption.iwidth == "0px") ? $(me).width()+2 : doption.iwidth;  
  59.         $("#autocomplete").css({  
  60.          'z-index:':doption.zIndex,  
  61.          width:w,  
  62.          top:parseInt(p.top+$(me).outerHeight())+"px",  
  63.          left:parseInt(p.left)+"px"  
  64.      }).show();  
  65.         strKey"";  
  66.         isShow = true;  
  67.     }  
  68.       
  69.     function keysearch(code){  
  70.         var strKeyNow=$(me).val();  
  71.         if(code == 38 || code == 40 || code == 13 || code == 27 || code == 9) return;    //TAB/回车、ESC、向上、向下  
  72.         if((strKey == "" || strKeyNow != strKey) && strKeyNow.length >= iLengthLower && strKeyNow.length <= iLengthUpper){  
  73.             $.ajax({  
  74.                 type: "Get",  
  75.                 dataType: "json",  
  76.                 url: url,  
  77.                 data: strPara != "" ? strPara + "=" + encode(strKeyNow) : "",  
  78.                 success: function(json){  
  79.                     jsonjson=json.keylist;  
  80.                     if (json.length>0){  
  81.                         //获取搜索数据  
  82.                         var strContent"<ul>";  
  83.                         $.each(json, function(i, n){  
  84.                             if(n.keyname.length>0){    //如果  
  85.                                 //alert(n.keyname);  
  86.                                 strContent+= '<li class="keyinfo"><span class="keyname">'+n.keyname+'</span>';  
  87.                                 try{  
  88.                                 if (n.keyextend.length>0){strContent+='<span class="keyextend">'+n.keyextend+'</span>';}  
  89.                                 }catch(E){};  
  90.                                 strContent+= '</li>';  
  91.                             };  
  92.                         });  
  93.                         if (doption.hasclose==1){  
  94.                             strContent+= '<li class="close"><span>关闭</span></li>';  
  95.                         }  
  96.                         strContent+='</ul>';  
  97.                         $("#autocomplete").html(strContent);  
  98.                         $("#autocomplete .keyinfo").mouseover(function(){$("#autocomplete .selected").removeClass("selected");$(this).removeClass("unselected").addClass("selected");}).mouseout(function(){$(this).removeClass("selected").addClass("unselected");}).click(function(){if(strKeyBak.length()>0){$(me).val(strKeyBak);}});  
  99.                         floorShow();  
  100.                     }else{  
  101.                         //没有搜索数据  
  102.                         floorHide();  
  103.                         return;  
  104.                     }  
  105.                 }  
  106.             });  
  107.             strKey=$(me).val();  
  108.         }  
  109.         if(strKey.length == 0 || strKey.length <= iLengthLower || strKey.length >= iLengthUpper) floorHide();  
  110.     }  
  111.       
  112.     function LineSelect(code){  
  113.         if(code == 27){floorHide();};//回车键、ESC键  
  114.         if(code == 13){floorHide();doption.desfun();};  
  115.         if(!isShow) return;  
  116.         ObjSelected=$("#autocomplete ul .selected");  
  117.         if (ObjSelected.length>0){    //如果已经有选定  
  118.             //alert('dasfdas');  
  119.             if(code == 38){    //向上键  
  120.                 if(ObjSelected.prev().text() != ""){    //如果不是第一个数据  
  121.                     ObjSelected.removeClass("selected").addClass("unselected").prev().removeClass("unselected").addClass("selected");  
  122.                     $(me).val($("#autocomplete ul .selected .keyname").text());  
  123.                 }else{  
  124.                     ObjSelected.removeClass("selected").addClass("unselected");  
  125.                     $("#autocomplete .keyinfo:last").removeClass("unselected").addClass("selected");  
  126.                     $(me).val($("#autocomplete ul .selected .keyname").text());  
  127.                 }  
  128.             }else if (code == 40){    //向下键  
  129.                 if(ObjSelected.next().text() != ""){    //如果不是第一个数据  
  130.                     ObjSelected.removeClass("selected").addClass("unselected").next().removeClass("unselected").addClass("selected");  
  131.                     $(me).val($("#autocomplete ul .selected .keyname").text());  
  132.                 }else{  
  133.                     ObjSelected.removeClass("selected").addClass("unselected");  
  134.                     $("#autocomplete .keyinfo:first").removeClass("unselected").addClass("selected");  
  135.                     $(me).val($("#autocomplete ul .selected .keyname").text());  
  136.                 }  
  137.             }  
  138.         }else if(code == 38){  
  139.                 $("#autocomplete .keyinfo:last").removeClass("unselected").addClass("selected");  
  140.                 $(me).val($("#autocomplete .keyinfo:last .keyname").text());  
  141.         }else if(code == 40){  
  142.                 $("#autocomplete .keyinfo:first").removeClass("unselected").addClass("selected");  
  143.                 $(me).val($("#autocomplete .keyinfo:first .keyname").text());  
  144.         }  
  145.     }  
  146. }  

 

 

CSS代码
  1. #autocomplete{}{ border: 1px solid #000; position: absolute; }  
  2. /**//*每行的格式*/  
  3. #autocomplete li{}{ display: block; text-align: left; height: 20px; line-height: 20px; background-color: #fff; cursor: default; padding: 0 5px; clear: both; }  
  4. /**//*鼠标选中时的格式*/  
  5. #autocomplete .selected{}{ background-color: #565da9; color: #fff; overflow: hidden; }  
  6. /**//*鼠标离开时代格式*/  
  7. #autocomplete .unselected{}{ background-color: #fff; color: #666; }  
  8. /**//*关键字信息*/  
  9. #autocomplete .keyname{}{ display: block; float: left; }  
  10. /**//*关键字扩展信息*/  
  11. #autocomplete .keyextend{}{ display: block; float: right; color: green; }  
  12. #autocomplete .unselected .keyextend{}{ color: green; }  
  13. #autocomplete .selected .keyextend{}{ color: #fff; }  
  14. /**//*关闭*/  
  15. #autocomplete .close{}{ text-align: right; }  
  16. #autocomplete .close span{}{ color: blue; cursor: pointer; text-decoration: underline; }  

 

 

调用范例

$("#Keyword").AutoComplete("search.asp");


是不是很简单的?只是search.asp返回的数据要是上面所提供的格式,对于PHP来说就太方便了,只要生成相应的数组,然后json_encode一下就全出来了,呵呵

Tags: jquery, autocompleted