架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)
遠程調(diào)用是系統(tǒng)與系統(tǒng)之間的通信機制,它的另一種理解就是進程間的通信。做分布式系統(tǒng)的開發(fā),遠程調(diào)用技術是其核心技術。遠程調(diào)用技術可以將一組計算機系統(tǒng)形成一個網(wǎng)絡系統(tǒng),對外提供整體服務,那么這一群的計算機系統(tǒng)就構(gòu)成了一個更大型,性能更高的計算機系統(tǒng)。
我在前面的博客里介紹了一種分布式網(wǎng)站的架構(gòu)設計,其中就有一個使用netty技術編寫的組件作為前端系統(tǒng)和服務端系統(tǒng)通信的媒介。在一個大型的互聯(lián)網(wǎng)公司里會有很多這樣的網(wǎng)站系統(tǒng),如果每一個網(wǎng)站都像我博客里所論述的進行開發(fā),那么對于系統(tǒng)通信維護和管理,以及每個系統(tǒng)網(wǎng)絡資源的分配管理就會造成一定的問題,對于這樣的問題,我舉個例子可能大家會更明白些,比如一個互聯(lián)網(wǎng)公司有數(shù)個對外提供服務的網(wǎng)站,有的網(wǎng)站訪問量很大,有的相對較小,但是公司的寬帶資源是有限的,那么我們就希望動態(tài)的管理和分配這些資源,如果我們網(wǎng)站的通信功能和網(wǎng)站都是緊耦合的,那么調(diào)配這些資源的工作就會比較復雜和繁瑣,也很容易出問題。這樣的問題還會還有很多,我這里不做細致分析了。做軟件開發(fā)時候,有個原則,如果某個功能是可以通用的,該功能很需要統(tǒng)一管理時候,我們就應該把這個功能抽取成一個獨立的系統(tǒng)或組件,并且這個系統(tǒng)或組件賦予一些增強級的功能特性,這樣必定對整個系統(tǒng)的健壯性、可用性以及效率上有所提升。
而我在分布式網(wǎng)站里所描述的通信技術,就是遠程調(diào)用技術的一種,遠程調(diào)用技術就是客戶端和服務端的通信技術,它可以當做cs架構(gòu)技術的一種,在java里有很多優(yōu)秀的框架實現(xiàn)遠程調(diào)用,例如java自帶的RMI,spring自帶的Httpinvoker,webservice技術等等。但是現(xiàn)有的這些技術滿足不了互聯(lián)網(wǎng)公司的遠程調(diào)用需求,今天我將講述一套我自己構(gòu)思的一套遠程調(diào)用技術,這個是借鑒了一些我們公司的類似軟件的做法。
該框架主要是針對java的,其他語言目前不能支持。首先我要總結(jié)遠程調(diào)用技術要包括那些技術,它們分別是:
?
6.負載均衡:分布式系統(tǒng)都離不開負載均衡,好的負載均衡可以充分利用好不同服務器的計算資源,提供系統(tǒng)的并發(fā)量和運算能力,對于網(wǎng)站而言(我們公司現(xiàn)在網(wǎng)站服務器不是太多)少于10臺服務器可以使用兩種策略:一種是簡單輪詢,比如有6臺服務端,我們會把第一個請求給第一臺服務器,第二個請求給第二臺,依次類推,等6臺循環(huán)完畢,又從第一臺開始;第二種是隨機方式,即使用random函數(shù),當然更多的服務器我就不知道有什么輪詢機制比較好,希望有知道的童鞋可以給我推薦下。
我這里設計的遠程調(diào)用框架,除了以上的功能外,我希望它還能有心跳管理機制,超時管理機制,服務分級管理,就是根據(jù)服務的重要性或者系統(tǒng)的繁忙度可以調(diào)節(jié)網(wǎng)絡資源。
哈哈,講了這么久估計有童鞋可能有點煩了,不是說應用zookeeper的實例嗎?怎么還沒見到zookeeper的影子。別著急,zookeeper馬上就要上場了。
還是以我前面博客里寫分布式網(wǎng)站講起,服務端系統(tǒng)我們可以當做服務提供者,前端系統(tǒng)當做服務調(diào)用者,提供者可以類比商戶,調(diào)用者可以類比客戶,商戶和客戶可以直接進行交易,這種直接交易方式非常原始甚至還會有風險,現(xiàn)代社會商戶和客戶直接的交易十分高效,高效的原因是因為有一個規(guī)范的大市場,商戶和客戶的交易在市場里進行的,這樣交易會變得更加安全和高效,我設計的分布式框架最大的特點就是提供了一個類似市場的角色,它來管理服務提供者和服務調(diào)用者,我把這個功能模塊稱為遠程調(diào)用管理組件。
遠程調(diào)用管理組件是本框架的核心,它的主要作用是接收服務端提供者的注冊的通知,該通知一般是接口以及該接口的實現(xiàn)類還有服務器的ip地址,管理組件會將這些通知記錄下來,并且根據(jù)配置對這些服務程序進行分組和標記,注冊好的信息管理組件會將這些信息推送到服務調(diào)用者。遠程調(diào)用管理組件還包含心跳機制,這個心跳機制是針對服務提供者,通過心跳機制檢測服務提供者的健康狀況,管理組件不會檢測服務調(diào)用者的健康狀態(tài),因為這個沒必要,因為本框架的使用還是調(diào)用者直接去請求提供者,邏輯上是沒必要關心調(diào)用者的狀態(tài),這和bs架構(gòu)里瀏覽器一樣,我們不會去關心瀏覽器用戶是不是存在。服務提供者、服務調(diào)用者和遠程調(diào)用管理組件的關系如下圖所示:
遠程調(diào)用框架運行的過程是:當服務提供者啟動時候,它會將自己的ip地址和注冊的方法傳輸?shù)竭h程調(diào)用管理組件,管理組件接收到注冊信息會將這些信息存儲下來,存儲技術就是使用zookeeper,存儲成功后,管理組件會將成功通知傳回給服務提供者,同時管理組件還會通過心跳檢測服務提供者是否健康;當服務調(diào)用者啟動時候,它會向管理組件請求服務提供者信息,管理組件接收到請求后會將相關信息推送給服務調(diào)用者。在實際系統(tǒng)運行時候,服務調(diào)用者直接和服務提供者進行通信交互了,通信方式是netty,如果調(diào)用者和提供者有相關變化,都會先通知服務管理組件,服務管理組件會將相關變更信息推送給相應的系統(tǒng)。
?
遠程調(diào)用管理組件主要是通過zookeeper實現(xiàn),zookeeper擁有一個層次的命名空間,它的模型是一個樹狀結(jié)構(gòu),樹狀結(jié)構(gòu)是一個強大的數(shù)據(jù)類型,它幾乎能存儲所有不同的數(shù)據(jù)類型,我們通過zookeeper將這些信息保存起來,便于我們管理整個遠程調(diào)用框架,同時zookeeper還是高可靠的,這個我在前面zookeeper文章里講到了,這樣就保證了整個遠程調(diào)用框架的穩(wěn)定性,實際應用中我們會將組件編譯成一個jar包,不同的項目直接引用這個jar包,這樣管理組件服務端和服務的提供者和調(diào)用者就聯(lián)系起來。至于提供者和調(diào)用者的通信機制是直接進行,因為我們將通信程序集成在jar包里,只不過相應的管理機制抽取到外部服務端進行統(tǒng)一管理。
?
這就是我設計的遠程調(diào)用框架,可惜的是,這個構(gòu)思我還沒有真正實現(xiàn)過,今天拿出來是想體現(xiàn)zookeeper的實際應用,為我后面講解zookeeper做鋪墊,至于是否可行,看以后有沒有機會開發(fā)個類似的系統(tǒng),到時估計還有很多意想不到的問題要解決。
總結(jié)
以上是生活随笔為你收集整理的架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 寻线仪使用方法图解
- 下一篇: 内存条上的数字代表的意义