分析分布式服務框架

出處:http://www.cnblogs.com/zhangs1986/?

技術是為需求而服務的,分布式服務框架也同樣如此,它不是憑空誕生的,也是因為有這樣的需求才會有分布式服務框架這么樣的東西誕生,在這篇blog中來詳細的分析分布式服務框架誕生的原因(其實也是需要用分布式服務框架的應用場景,這里隱含的意思就是并不是什么應用都需要分布式服務框架的)、分布式服務框架需要提供的feature以及實現這些feature可選的技術方案。
其實這篇blog應該寫在實現分布式服務框架系列blog之前,:),不廢話了,來看為什么會需要分布式服務框架,在一個不斷發展的大型應用中,系統的業務和功能不斷的增加,同時技術在不斷的發展、團隊在不斷的變化,很容易造成的現象就是:各個子系統、模塊實現的技術五花八門,部署時各子系統的方式和要求不同,各個子系統之間的交互方式和方法不統一。這種現象帶來的問題就是整個系統感覺很混亂,不過技術畢竟是不斷的發展,因此各子系統、模塊的具體實現技術要完全限制應該是不太可能的,也沒必要,但會希望系統對外提供的功能能采用統一的部署以及交互方法,這樣的話每個子系統能保持其黑盒的實現方式,其他子系統不想也不需要關心它的實現方式,只需要能夠統一的方式調用到它們提供的功能就可以了,這是出現的第一個需求。
起初整個應用部署在一臺機器上,但隨著系統的功能越來越多,不得不不斷的增加機器以減輕服務器的壓力,但很快就出現瓶頸,不得不把應用分層部署,這樣可以撐一段時間,在撐過一段時間后發現再度出現瓶頸,于是希望能夠再度的把系統進行劃分,這個時候就變成了希望能夠以非常細的粒度來部署了,而不是把一堆的功能都部署在同一臺機器上,這樣帶來的好處是系統的重用性能夠再度的增強,服務器的壓力能夠有效的降低,使得系統可以以較低的成本繼續保持Scable(就像google),其實這也是ebay的演變過程,大家可以去看看那個著名的ebay架構演變的PPT,還有一篇中文的ebay是怎樣煉成的。
從上面的需求場景描述中可以看出,需要分布式服務框架的場景并不是很多,這里還有一種場景沒去提及,那就是對于一個大型企業而言,由于需要用到的軟件多種多樣,其實也是有分布式服務框架的需求的,但還是有些不同,因為要去滿足那種場景的方法可以更為簡單。
分析下分布式服務框架的應用場景,可以得知,分布式服務框架的誕生目的主要有兩個:
1、約束需要對外提供的功能,保證其以一個統一的方式來對外提供和獲取;
2、分布式的部署細粒度的功能。
在確定了這兩個目的后,來詳細的分析下為了達到這兩個目的,需要提供些什么feature。
要約束對外提供的功能,保證以統一的方式來對外提供和獲取,首先需要制定的標準是功能到底以什么方式來對外提供,這里首先誕生了服務這個很好很形象的名詞,對外提供的功能其實也就是為別人提供的服務了,那么服務里到底有些什么呢,面向接口自然是首選,所以服務都以接口方式來提供,另外可能就是會有一些服務的元信息了,如服務的名稱、描述、依賴、所在機器等等;接著要完成的就是如何把各子系統對外提供的功能定義成服務呢,這里要求分布式服務框架能提供強大的集成能力,例如子系統是采用spring來實現,那么就需要支持能把spring的bean直接定義成服務;定義服務完成了,這個時候要解決的問題就是其他的子系統怎么知道有這些服務的存在呢,因此需要提供一個統一的服務的注冊中心,同時相應的帶來的問題就是各個服務應用端怎么來查找這些服務,怎么調用這些服務,這也是分布式服務框架需要解決的,在提供了上面的這些feature后,第一個需求就可以基本實現了。
分布式的部署細粒度的功能,這個在第一個需求達成的情況下,直接就可以實現了,因為分布式服務框架對服務應用端的粒度并沒有要求,可粗可細,只是分布式的部署細粒度的功能其實潛在的帶來了另外的需求,那就是怎么樣把這些細粒度的服務直接組裝來滿足業務的需求,這也是分布式服務框架應該提供的功能;同時,還要注意的一點是,當變成細粒度的分布式部署的場景時,系統的穩定性和性能是會受到影響的,對于大型應用來講這兩點偏偏又是非常重要的,分布式服務框架需要對此進行考慮。

.......................................................咖啡一杯,休息一下.......................................................

繼續,上面分析完畢后產生了分布式服務框架的基本Feature,來總結看看,并同時對其進行可選的實現技術的分析:
1、服務模型
????? 在服務模型中需要詳細定義服務模型包含了哪些信息,而這些信息也就決定了服務在發布時需要提供的信息,同時也是為服務查找和調用提供的信息。
2、服務的注冊中心
????? 服務的注冊中心在分布式服務框架中充當的就是服務信息的存儲場所的作用,同時它還需要提供的一個重要的功能就是查找服務,這兩個最重要功能最重要的就是穩定、高效以及支持Cluster。
????? 存儲服務信息上可采用數據庫存儲、分布式文件系統存儲等,查找服務需要的就是支持高效的查找,這個要根據服務的查找方法等來建立相應的緩存和索引,這里需要注意的是在cluster情況下的處理,選用數據庫存儲或分布式文件系統存儲自然是不會有cluster的問題的。
????? 另外一個需要確定的就是服務應用端怎么調用服務注冊中心提供的管理接口,可采用的技術有JNDI、JMS、WebService等等N多種實現方式,可以根據具體的性能要求、實現方法、需求等來進行選擇。
????? 從擴展方面去看,服務的注冊中心應該提供多種服務應用端和注冊中心的交互協議的選擇、擴展。
3、發布服務的方式,支持Spring、EJB3等等
????? 支持直接的把服務應用端的功能發布為服務,發布的方式更多的是xml、annotation等方式,就是一種很不錯的設計,所以要根據服務應用端采用的技術而定,常見的如spring、EJB,這個完全根據分布式服務框架所面對的應用場景而定,如果你的服務應用端都是基于Spring的,那么就可以暫時只提供Spring的方式了。
??????注冊服務方面的技術基本也不用選擇,因為它其實是根據服務應用端采用的技術而決定的,相當于提供一個集成的接口而已,由此接口去完成和服務中心的交互。
????? 但這里有個關鍵的實現技術需要選擇,就是把服務以什么方式對外提供,例如有JNDI、Webservice、JMS等等,就像Spring中的HessianServiceExporter,這里需要的是服務框架本身支持好這些協議,至于到底要實現多少種也是根據需求來看了,而各種協議的實現可以選用協議對應的成熟產品,如jndi有jboss jnp,也可以自己根據需求實現。
????? 也許在spring中我們可以這么來發布service:
??????<hsf:service>
??????????????<ref bean="Spring Bean"/>??????????????
????????????? <metainfo:jndi server=""?interface="服務接口名" name="簡要名稱" desc="服務功能描述"/>
????????????? <!--以jndi的方式對外提供-->
????????????? <publish:jndi server="">
??????????????????????? <property name=""></property>
????????????? </publish:jndi>
????????????? <!--以hessianservice的方式對外提供-->
????????????? <publish:hessian server=""/>
????????????? <!--以jms的方式對外提供-->
????????????? <publish:jms server="" queue=""/>
????? </hsf:export>
4、查找服務和調用服務的方式,支持Spring、EJB3等等
????? 查找服務和調用服務方面,需要做到的就是能夠讓服務應用端透明的使用遠程的服務,所以其實也是和服務應用端采用的技術相關的。
????? 當然,它本身需要提供以各種協議和服務中心通訊,以各種協議調用遠端服務的支持,另外就是同步、異步的支持等,還需要從高效性去考慮。
????? 對于使用者來說則比較簡單,也許在Spring中我們可以這么來調用遠端的service:
??????<bean id="loginService" class="HSFObjectFactoryBean">
????????????? <hsf:service>
????????????????????? <import:jndi?server="" interface="">
??????????????????????????????<!--可用于過濾查找的服務-->
????????????????????????????? <property name=""></property>
??????????????????????</import:jndi>
??????????????</hsf:service>
??????</bean>
5、服務的組裝
????? 服務的組裝需要提供的就是將服務中心的服務進行組裝,以實現復雜的業務需求,這里面需要包括容錯等等的支持,同樣,高效性也是這里面的重點。
????? 可選用的技術有采用事件框架、jbpm等。
6、穩定性和性能
??????通常來講,需要用到分布式服務框架的應用在穩定性和性能方面都會有很高的要求,當然,穩定性更多的是通過避免Single Point的方式來提供,但同時軟件層面也應該盡量避免無謂的錯誤,從技術角度上來講可以采取fail-fast的思想來實現。
????? 性能方面,需要根據使用時的壓力情況來決定,如查找服務時太慢,需要考慮提升服務中心查找服務的效率,增加索引,使用分布式存儲等等都是可采用的方式,提升性能的方面其實可采用的方案是非常多的,但每種技術幾乎都是需要非常專業的人才去實現的。

??? 上面分析的feature只是分布式服務框架的基本feature了,一個強大的分布式服務框架的話實現的東西會比這個多很多(例如提供服務管理端、監控端、IDE等),不過主要會是細節上,在具備了這些基礎feature的情況下,細節就決定了高低了,:)。
分布式服務框架的引入也許會降低些性能,但應用的適當的話,則能充分發揮服務器性能,并且很大程度的降低系統Scable的成本,至于開發效率的話我不覺得是分布式服務框架需要解決的問題。
服務框架其實對于所有應用而言幾乎都是需要的,而且非分布式的服務框架可選的是有很多的,但分布式服務框架可選的目前基本是沒有,所以如果不是應用真的需要,沒有必要去實現分布式服務框架(就像在企業應用模式里Martin Fowler講的一樣,盡量不要分布式,:)),因為分布式服務框架對于技術層面還是有挺高的要求的,說簡單點呢,就是高效的存儲、查找策略+高效的通訊策略+滿足需求的服務模型+強大的集成能力構成了分布式服務框架的核心技術實現。

ps:在寫完這篇blog后,發現自己在基于OSGi實現分布式服務框架(四)里面寫OSGi不適合其實是個不準確的詞,因為在服務的應用端其實是可以采用OSGi的,不過以分布式服務框架而言,OSGi是沒有什么適用的場景,除了服務模型可參考外,但在服務應用端而言,OSGi仍然是個很好的選擇。

原文引自?http://www.blogjava.net/BlueDavy/archive/2008/01/24/177533.html

轉載于:https://www.cnblogs.com/firejava/p/6424494.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259553.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259553.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259553.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PL/SQL注冊碼

code:j6stndb9tk72xfbhbqczcdqnjd8lyj466n number:882851 ps&#xff1a;xs374ca轉載于:https://www.cnblogs.com/myblogslh/p/4203173.html

遞歸--基于回溯和遞歸的八皇后問題解法

八皇后問題是在8*8的棋盤上放置8枚皇后&#xff0c;使得棋盤中每個縱向、橫向、左上至右下斜向、右上至左下斜向均只有一枚皇后。八皇后的一個可行解如圖所示&#xff1a; 思路 對于八皇后的求解可采用回溯算法&#xff0c;從上至下依次在每一行放置皇后&#xff0c;進行搜索&a…

matlab emf 讀取,20140219-Emf_Demo EMF 矢量圖 可以讀取和保存EMF 的封閉類 非常實用 matlab 238萬源代碼下載- www.pudn.com...

文件名稱: 20140219-Emf_Demo下載收藏√ [5 4 3 2 1 ]開發工具: Visual C文件大小: 6312 KB上傳時間: 2014-07-10下載次數: 2詳細說明&#xff1a;EMF 矢量圖 可以讀取和保存EMF矢量圖的封閉類非常實用-EMF EMF vector can read and save the class very useful vector cl…

orcale 之 集合操作

集合操作就是將兩個或者多個 sql 查詢的結果合并成復合查詢。常見的集合操作有UNION(并運算)、UNION ALL、INTERSECT(交運算)和MINUS(差運算)。 UNION UNION 運算可以將多個查詢結果集相加,形成一個結果集, 其結果相當于集合運算的并運算. UNION 可以將第一個查詢結果的所有行與…

PDFMate PDF Converter Pro

http://www.pdfmate.com轉載于:https://www.cnblogs.com/scgw/p/4203999.html

linux 廣播

廣播是一臺主機向局域網內的所有主機發送數據。這時&#xff0c;同一網段的所有主機都能接收到數據。發送廣播包的步驟大致如下: (1)確定一個發送廣播的接口&#xff0c;如eth0 (2)確定廣播的地址&#xff0c;通過ioctl函數&#xff0c;請求碼設置為SIOCGIFBRDADDR得到廣播的地…

thinkphp5.1 php7,空白目錄 · 細數ThinkPHP5.1.7版本新特性 · 看云

>[danger] 官方已經在前不久發布了ThinkPHP5.1.7版本&#xff0c;5.1版本相較于5.0版本而言&#xff0c;本身更加嚴謹和規范&#xff0c;更接近主流設計思想。近半年來&#xff0c;5.1版本更新頻繁&#xff0c;此次最新版本更是帶來了很多的新特性。正在或者打算使用5.1版本…

JS中popup.js

為什么80%的碼農都做不了架構師&#xff1f;>>> //popup class 顯示彈出窗口&#xff0c;。/*以下為使用popup對象&#xff0c;傳入相應的配置參數&#xff0c;彈出不同類型的窗口 function ShowIframe() //顯示iframe { var popnew P…

圖像連通域標記算法研究

搬以前寫的博客【2014-03-01 08:09】 圖像連通域標記算法研究 ConnectedComponent Labeling 最近在研究一篇復雜下背景文字檢測的論文。 “Detecting Text in Natural Scenes with Stroke Width Transform ” CPVR 2010的文章&#xff0c;它主要探討利用文字內…

lightoj 1214

lightoj 1214 Large Division &#xff08;大數除法&#xff09; 鏈接&#xff1a;http://www.lightoj.com/volume_showproblem.php?problem1214 題意&#xff1a;給定 a&#xff0c; b 兩個數&#xff0c;判斷 a 是否整除 b 。&#xff08;a 為 大數&#xff09; 思路&#…

二階振蕩衰減 matlab,基于Matlab/Simulink的二階控制系統仿真研究

1 二階控制系統模型本文引用地址&#xff1a;http://www.eepw.com.cn/article/201612/328597.htm能夠用二階微分方程描述的系統稱為二階控制系統。在控制工程實踐中&#xff0c;二階控制系統十分常見&#xff0c;例如&#xff0c;電樞控制的直流電動機&#xff0c;RLC網絡和彈簧…

CCF201409-5 拼圖(30分)

試題編號&#xff1a; 201409-5 試題名稱&#xff1a; 拼圖 時間限制&#xff1a; 3.0s 內存限制&#xff1a; 256.0MB 問題描述&#xff1a; 問題描述給出一個nm的方格圖&#xff0c;現在要用如下L型的積木拼到這個圖中&#xff0c;使得方格圖正好被拼滿&#xff0c;請問總共有…

歐幾里得算法(即輾轉相除法)的時間復雜度

本文是參考新浪博客而寫。 歐幾里得算法, 又稱輾轉相除法, 用于求兩個自然數的最大公約數. 算法的思想很簡單, 基于下面的數論等式 gcd(a, b) gcd(b, a mod b) 其中gcd(a, b)表示a和b的最大公約數, mod是模運算, 即求a除以b的余數. 代碼如下: #include <iostream> #i…

UIImageJPEGRepresentation和UIImagePNGRepresentation

在Iphone上有兩種讀取圖片數據的簡單方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函數需要兩個參數:圖片的引用和壓縮系數.而UIImagePNGRepresentation只需要圖片引用作為參數.通過在實際使用過程中,比較發現: UIImagePNGRepresenta…

C++ 0x

轉載于:https://www.cnblogs.com/iiiDragon/p/3230006.html

系列文章----.Net程序員學用Oracle系列

.Net程序員學用Oracle系列(18)&#xff1a;PLSQL Developer 攻略.Net程序員學用Oracle系列(17)&#xff1a;數據庫管理工具(SQL Plus).Net程序員學用Oracle系列(16)&#xff1a;訪問數據庫(ODP.NET).Net程序員學用Oracle系列(15)&#xff1a;DUAL、ROWID、NULL.Net程序員學用Or…

Github for Windows使用介紹

Git已經變得非常流行&#xff0c;連Codeplex現在也已經主推Git。Github上更是充斥著各種高質量的開源項目&#xff0c;比如ruby on rails&#xff0c;cocos2d等等。對于習慣Windows圖形界面的程序員來講&#xff0c;Github的使用是需要點時間和耐心的&#xff0c;然而最近Githu…

matlab中udt函數,《MATLAB信號處理超級學習手冊》——2.5 離散時間信號中的運算...

本節書摘來自異步社區《MATLAB信號處理超級學習手冊》一書中的第2章&#xff0c;第2.5節&#xff0c;作者&#xff1a;MATLAB技術聯盟 , 史潔玉著&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看2.5 離散時間信號中的運算MATLAB信號處理超級學習手冊2.5.1 離散…

iOS 將16進制顏色轉換成UIColor

很多地方我們都使用16進制顏色&#xff0c;但iPhone使用的是UIColor對象&#xff0c;不直接支持16進制顏色&#xff0c;為此&#xff0c;需要我們手動將16進制顏色轉換為UIColor - (UIColor *) hexStringToColor: (NSString *) stringToConvert {NSString *cString [[stringTo…

OBJ 文件格式

OBJ文件是一種標準的3D模型文件格式&#xff0c;很適合用于3D軟件模型之間的互導。比如在3dsMax或LightWave中建了一個模型&#xff0c;想把它調到Maya里面渲染或動畫&#xff0c;導出OBJ文件就是一種很好的選擇。目前幾乎所有知名的3D軟件都支持OBJ文件的讀寫&#xff0c;不過…