自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

架構(gòu)設(shè)計(jì):一種遠(yuǎn)程調(diào)用服務(wù)的設(shè)計(jì)構(gòu)思(zookeeper的一種應(yīng)用實(shí)踐)

移動(dòng)開發(fā) 開發(fā)
遠(yuǎn)程調(diào)用是系統(tǒng)與系統(tǒng)之間的通信機(jī)制,它的另一種理解就是進(jìn)程間的通信。做分布式系統(tǒng)的開發(fā),遠(yuǎn)程調(diào)用技術(shù)是其核心技術(shù)。遠(yuǎn)程調(diào)用技術(shù)可以將一組計(jì)算機(jī)系統(tǒng)形成一個(gè)網(wǎng)絡(luò)系統(tǒng),對(duì)外提供整體服務(wù),那么這一群的計(jì)算機(jī)系統(tǒng)就構(gòu)成了一個(gè)更大型,性能更高的計(jì)算機(jī)系統(tǒng)。

在深入學(xué)習(xí)zookeeper我想先給大家介紹一個(gè)和zookeeper相關(guān)的應(yīng)用實(shí)例,我把這個(gè)實(shí)例命名為遠(yuǎn)程調(diào)用服務(wù)。通過對(duì)這種應(yīng)用實(shí)例的描述,我們會(huì)對(duì)zookeeper應(yīng)用場(chǎng)景會(huì)有深入的了解。

遠(yuǎn)程調(diào)用是系統(tǒng)與系統(tǒng)之間的通信機(jī)制,它的另一種理解就是進(jìn)程間的通信。做分布式系統(tǒng)的開發(fā),遠(yuǎn)程調(diào)用技術(shù)是其核心技術(shù)。遠(yuǎn)程調(diào)用技術(shù)可以將一組計(jì)算機(jī)系統(tǒng)形成一個(gè)網(wǎng)絡(luò)系統(tǒng),對(duì)外提供整體服務(wù),那么這一群的計(jì)算機(jī)系統(tǒng)就構(gòu)成了一個(gè)更大型,性能更高的計(jì)算機(jī)系統(tǒng)。

我在前面的博客里介紹了一種分布式網(wǎng)站的架構(gòu)設(shè)計(jì),其中就有一個(gè)使用netty技術(shù)編寫的組件作為前端系統(tǒng)和服務(wù)端系統(tǒng)通信的媒介。在一個(gè)大型的互聯(lián)網(wǎng)公司里會(huì)有很多這樣的網(wǎng)站系統(tǒng),如果每一個(gè)網(wǎng)站都像我博客里所論述的進(jìn)行開發(fā),那么對(duì)于系統(tǒng)通信維護(hù)和管理,以及每個(gè)系統(tǒng)網(wǎng)絡(luò)資源的分配管理就會(huì)造成一定的問題,對(duì)于這樣的問題,我舉個(gè)例子可能大家會(huì)更明白些,比如一個(gè)互聯(lián)網(wǎng)公司有數(shù)個(gè)對(duì)外提供服務(wù)的網(wǎng)站,有的網(wǎng)站訪問量很大,有的相對(duì)較小,但是公司的寬帶資源是有限的,那么我們就希望動(dòng)態(tài)的管理和分配這些資源,如果我們網(wǎng)站的通信功能和網(wǎng)站都是緊耦合的,那么調(diào)配這些資源的工作就會(huì)比較復(fù)雜和繁瑣,也很容易出問題。這樣的問題還會(huì)還有很多,我這里不做細(xì)致分析了。做軟件開發(fā)時(shí)候,有個(gè)原則,如果某個(gè)功能是可以通用的,該功能很需要統(tǒng)一管理時(shí)候,我們就應(yīng)該把這個(gè)功能抽取成一個(gè)獨(dú)立的系統(tǒng)或組件,并且這個(gè)系統(tǒng)或組件賦予一些增強(qiáng)級(jí)的功能特性,這樣必定對(duì)整個(gè)系統(tǒng)的健壯性、可用性以及效率上有所提升。

而我在分布式網(wǎng)站里所描述的通信技術(shù),就是遠(yuǎn)程調(diào)用技術(shù)的一種,遠(yuǎn)程調(diào)用技術(shù)就是客戶端和服務(wù)端的通信技術(shù),它可以當(dāng)做cs架構(gòu)技術(shù)的一種,在java里有很多優(yōu)秀的框架實(shí)現(xiàn)遠(yuǎn)程調(diào)用,例如java自帶的RMI,spring自帶的Httpinvoker,webservice技術(shù)等等。但是現(xiàn)有的這些技術(shù)滿足不了互聯(lián)網(wǎng)公司的遠(yuǎn)程調(diào)用需求,今天我將講述一套我自己構(gòu)思的一套遠(yuǎn)程調(diào)用技術(shù),這個(gè)是借鑒了一些我們公司的類似軟件的做法。

該框架主要是針對(duì)java的,其他語言目前不能支持。首先我要總結(jié)遠(yuǎn)程調(diào)用技術(shù)要包括那些技術(shù),它們分別是:

  • 通信技術(shù):遠(yuǎn)程調(diào)用就是通過網(wǎng)絡(luò)技術(shù)將不同系統(tǒng)構(gòu)成一個(gè)整體,因此通信技術(shù)是其重點(diǎn),通信技術(shù)我這里選擇的是netty技術(shù),Netty提供異步的、事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架和工具,用以快速開發(fā)高性能、高可靠性的網(wǎng)絡(luò)服務(wù)器和客戶端程序。Netty會(huì)讓我們開發(fā)通信程序變得簡(jiǎn)單,高效,其效率也是非常好的,同時(shí)它還支持多種不同的網(wǎng)絡(luò)協(xié)議。
  • 序列化和反序列化技術(shù):java的序列化技術(shù)是指將對(duì)象轉(zhuǎn)換為byte數(shù)據(jù),這些數(shù)據(jù)可以被還原為java對(duì)象,這種還原的過程就是反序列化了,該機(jī)制可以自動(dòng)處理不同操作系統(tǒng)之間的差異,例如window下序列化的對(duì)象,可以在linux上進(jìn)行重新構(gòu)建。Java的jdk里自帶了一個(gè)序列化和反序列化機(jī)制,熟悉hadoop的人知道hadoop設(shè)計(jì)了一套序列化和反序列化機(jī)制,為什么hadoop作者不選擇使用java自帶的序列化機(jī)制,這是因?yàn)閖ava序列化機(jī)制非常復(fù)雜,復(fù)雜帶來效率低下,java的序列化機(jī)制還有一個(gè)重要的缺點(diǎn)就是它序列化的二進(jìn)制數(shù)據(jù)會(huì)非常大,因?yàn)閖ava序列化時(shí)候會(huì)附帶太多該對(duì)象的相關(guān)信息,過大的數(shù)據(jù)量就會(huì)影響網(wǎng)絡(luò)傳輸?shù)男?,因此hadoop自己設(shè)計(jì)了一套序列化和反序列化機(jī)制,hadoop不同節(jié)點(diǎn)之間的通信也是一種遠(yuǎn)程調(diào)用機(jī)制,因此我們發(fā)現(xiàn)好的序列化和反序列化技術(shù)對(duì)于遠(yuǎn)程調(diào)用是相當(dāng)重要的。我們公司的遠(yuǎn)程調(diào)用框架序列化技術(shù)有兩種一種就是java自帶的序列化和反序列化機(jī)制,一種是hessian技術(shù),它是一種更加高效的序列化和反序列化技術(shù)。
  • 壓縮技術(shù):做網(wǎng)絡(luò)編程,最稀缺的資源就是寬帶資源,如果傳輸數(shù)據(jù)過大,那么對(duì)數(shù)據(jù)的壓縮就會(huì)顯得十分重要,這里我推薦一個(gè)壓縮技術(shù)snappy,它是一種高效的壓縮和解壓縮包,google公司內(nèi)部廣泛使用的一種壓縮技術(shù)。
  • 高并發(fā)的技術(shù):遠(yuǎn)程調(diào)用技術(shù)一定會(huì)是多線程,只有這樣才能滿足多個(gè)并發(fā)的處理請(qǐng)求,java在1.5的版本里提供了一個(gè)Executor框架,它在線程開發(fā)里引入了任務(wù)的概念,使得多線程的程序開發(fā)會(huì)更加合理和可控,關(guān)于executor的技術(shù)大家可以看看一本經(jīng)典的書籍《java并發(fā)編程實(shí)踐》。想讓線程更加有效率,池技術(shù)也是并不可少的,apache的common-pool是一個(gè)非常好的池技術(shù),我們可以將線程都預(yù)先創(chuàng)建好,然后放入到common-pool池里進(jìn)行管理。
  • 非侵入式:這個(gè)也可以叫做松耦合,對(duì)于java的web開發(fā),最好的解耦方式就是使用spring技術(shù),當(dāng)我們系統(tǒng)里把遠(yuǎn)程調(diào)用框架引入后,配置好相關(guān)的參數(shù),我們可以把用于遠(yuǎn)程調(diào)用的方法定義在spring的配置文件里,那么在程序里調(diào)用的時(shí)候,利用spring直接獲取這個(gè)bean,那么對(duì)于遠(yuǎn)程調(diào)用的開發(fā)就和我們?cè)赼ction里調(diào)用server的方法沒啥區(qū)別了。下面是一段實(shí)例代碼:
    1. <!-- 服務(wù)提供者配置 --> 
    2. <bean id="serverProvider" class="cn.com.sharpxiajun.RmifSpringProviderBean"
    3.     <property name="interface" value="cn.com.ITest"></property><!-- 遠(yuǎn)程調(diào)用的接口 --> 
    4.     <property name="target" ref="clsTest"></property><!-- clsTest實(shí)現(xiàn)ITest的實(shí)現(xiàn)類,clsTest這里是一個(gè)bean的id值 --> 
    5. </bean> 
    6.  
    7. <!-- 服務(wù)調(diào)用者配置 --> 
    8. <bean id="clientConsumer" class="cn.com.sharpxiajun.RmifSpringConsumerBean"
    9.     <property name="interface" value="cn.com.clsTest"></property><!-- value就是Provider定義的target的接口實(shí)現(xiàn)類 --> 
    10.     <property name="seriaType" value="hessian"></property><!--序列化方式  --> 
    11.     <property name="compress" value="true"></property><!-- 壓縮標(biāo)記 --> 
    12. </bean> 
  • 負(fù)載均衡:分布式系統(tǒng)都離不開負(fù)載均衡,好的負(fù)載均衡可以充分利用好不同服務(wù)器的計(jì)算資源,提供系統(tǒng)的并發(fā)量和運(yùn)算能力,對(duì)于網(wǎng)站而言(我們公司現(xiàn)在網(wǎng)站服務(wù)器不是太多)少于10臺(tái)服務(wù)器可以使用兩種策略:一種是簡(jiǎn)單輪詢,比如有6臺(tái)服務(wù)端,我們會(huì)把第一個(gè)請(qǐng)求給第一臺(tái)服務(wù)器,第二個(gè)請(qǐng)求給第二臺(tái),依次類推,等6臺(tái)循環(huán)完畢,又從第一臺(tái)開始;第二種是隨機(jī)方式,即使用random函數(shù),當(dāng)然更多的服務(wù)器我就不知道有什么輪詢機(jī)制比較好,希望有知道的童鞋可以給我推薦下。

我這里設(shè)計(jì)的遠(yuǎn)程調(diào)用框架,除了以上的功能外,我希望它還能有心跳管理機(jī)制,超時(shí)管理機(jī)制,服務(wù)分級(jí)管理,就是根據(jù)服務(wù)的重要性或者系統(tǒng)的繁忙度可以調(diào)節(jié)網(wǎng)絡(luò)資源。

哈哈,講了這么久估計(jì)有童鞋可能有點(diǎn)煩了,不是說應(yīng)用zookeeper的實(shí)例嗎?怎么還沒見到zookeeper的影子。別著急,zookeeper馬上就要上場(chǎng)了。

還是以我前面博客里寫分布式網(wǎng)站講起,服務(wù)端系統(tǒng)我們可以當(dāng)做服務(wù)提供者,前端系統(tǒng)當(dāng)做服務(wù)調(diào)用者,提供者可以類比商戶,調(diào)用者可以類比客戶,商戶和客戶可以直接進(jìn)行交易,這種直接交易方式非常原始甚至還會(huì)有風(fēng)險(xiǎn),現(xiàn)代社會(huì)商戶和客戶直接的交易十分高效,高效的原因是因?yàn)橛幸粋€(gè)規(guī)范的大市場(chǎng),商戶和客戶的交易在市場(chǎng)里進(jìn)行的,這樣交易會(huì)變得更加安全和高效,我設(shè)計(jì)的分布式框架最大的特點(diǎn)就是提供了一個(gè)類似市場(chǎng)的角色,它來管理服務(wù)提供者和服務(wù)調(diào)用者,我把這個(gè)功能模塊稱為遠(yuǎn)程調(diào)用管理組件。

遠(yuǎn)程調(diào)用管理組件是本框架的核心,它的主要作用是接收服務(wù)端提供者的注冊(cè)的通知,該通知一般是接口以及該接口的實(shí)現(xiàn)類還有服務(wù)器的ip地址,管理組件會(huì)將這些通知記錄下來,并且根據(jù)配置對(duì)這些服務(wù)程序進(jìn)行分組和標(biāo)記,注冊(cè)好的信息管理組件會(huì)將這些信息推送到服務(wù)調(diào)用者。遠(yuǎn)程調(diào)用管理組件還包含心跳機(jī)制,這個(gè)心跳機(jī)制是針對(duì)服務(wù)提供者,通過心跳機(jī)制檢測(cè)服務(wù)提供者的健康狀況,管理組件不會(huì)檢測(cè)服務(wù)調(diào)用者的健康狀態(tài),因?yàn)檫@個(gè)沒必要,因?yàn)楸究蚣艿氖褂眠€是調(diào)用者直接去請(qǐng)求提供者,邏輯上是沒必要關(guān)心調(diào)用者的狀態(tài),這和bs架構(gòu)里瀏覽器一樣,我們不會(huì)去關(guān)心瀏覽器用戶是不是存在。服務(wù)提供者、服務(wù)調(diào)用者和遠(yuǎn)程調(diào)用管理組件的關(guān)系如下圖所示:

 

關(guān)系圖

遠(yuǎn)程調(diào)用框架運(yùn)行的過程是:當(dāng)服務(wù)提供者啟動(dòng)時(shí)候,它會(huì)將自己的ip地址和注冊(cè)的方法傳輸?shù)竭h(yuǎn)程調(diào)用管理組件,管理組件接收到注冊(cè)信息會(huì)將這些信息存儲(chǔ)下來,存儲(chǔ)技術(shù)就是使用zookeeper,存儲(chǔ)成功后,管理組件會(huì)將成功通知傳回給服務(wù)提供者,同時(shí)管理組件還會(huì)通過心跳檢測(cè)服務(wù)提供者是否健康;當(dāng)服務(wù)調(diào)用者啟動(dòng)時(shí)候,它會(huì)向管理組件請(qǐng)求服務(wù)提供者信息,管理組件接收到請(qǐng)求后會(huì)將相關(guān)信息推送給服務(wù)調(diào)用者。在實(shí)際系統(tǒng)運(yùn)行時(shí)候,服務(wù)調(diào)用者直接和服務(wù)提供者進(jìn)行通信交互了,通信方式是netty,如果調(diào)用者和提供者有相關(guān)變化,都會(huì)先通知服務(wù)管理組件,服務(wù)管理組件會(huì)將相關(guān)變更信息推送給相應(yīng)的系統(tǒng)。

遠(yuǎn)程調(diào)用管理組件主要是通過zookeeper實(shí)現(xiàn),zookeeper擁有一個(gè)層次的命名空間,它的模型是一個(gè)樹狀結(jié)構(gòu),樹狀結(jié)構(gòu)是一個(gè)強(qiáng)大的數(shù)據(jù)類型,它幾乎能存儲(chǔ)所有不同的數(shù)據(jù)類型,我們通過zookeeper將這些信息保存起來,便于我們管理整個(gè)遠(yuǎn)程調(diào)用框架,同時(shí)zookeeper還是高可靠的,這個(gè)我在前面zookeeper文章里講到了,這樣就保證了整個(gè)遠(yuǎn)程調(diào)用框架的穩(wěn)定性,實(shí)際應(yīng)用中我們會(huì)將組件編譯成一個(gè)jar包,不同的項(xiàng)目直接引用這個(gè)jar包,這樣管理組件服務(wù)端和服務(wù)的提供者和調(diào)用者就聯(lián)系起來。至于提供者和調(diào)用者的通信機(jī)制是直接進(jìn)行,因?yàn)槲覀儗⑼ㄐ懦绦蚣稍趈ar包里,只不過相應(yīng)的管理機(jī)制抽取到外部服務(wù)端進(jìn)行統(tǒng)一管理。

這就是我設(shè)計(jì)的遠(yuǎn)程調(diào)用框架,可惜的是,這個(gè)構(gòu)思我還沒有真正實(shí)現(xiàn)過,今天拿出來是想體現(xiàn)zookeeper的實(shí)際應(yīng)用,為我后面講解zookeeper做鋪墊,至于是否可行,看以后有沒有機(jī)會(huì)開發(fā)個(gè)類似的系統(tǒng),到時(shí)估計(jì)還有很多意想不到的問題要解決。

(遠(yuǎn)程調(diào)用服務(wù)的設(shè)計(jì)我參考了技術(shù)友人馬德鑫的設(shè)計(jì),他曾是淘寶的技術(shù)架構(gòu)師)

責(zé)任編輯:張子龍 來源: 博客園
相關(guān)推薦

2013-09-04 12:38:56

架構(gòu)設(shè)計(jì)架構(gòu)設(shè)計(jì)構(gòu)思

2017-03-21 17:04:05

Android客戶端架構(gòu)設(shè)計(jì)

2022-03-01 09:58:10

高并發(fā)架構(gòu)開發(fā)

2012-12-25 10:48:35

IBMdW

2023-09-17 23:16:46

緩存數(shù)據(jù)庫

2020-05-06 11:29:29

UX設(shè)計(jì)釣魚攻擊用戶體驗(yàn)

2020-12-23 10:10:23

Pythonweb代碼

2022-06-22 09:44:41

Python文件代碼

2022-07-07 10:33:27

Python姿勢(shì)代碼

2020-12-09 10:15:34

Pythonweb代碼

2022-09-27 08:04:37

Adapter?設(shè)計(jì)模式

2019-07-22 15:59:21

2011-03-01 09:43:13

MapReduce架構(gòu)

2023-05-11 07:30:10

KV存儲(chǔ)GC優(yōu)化

2009-12-11 10:30:31

2015-12-18 16:15:55

架構(gòu)新型計(jì)算模型

2013-03-12 14:07:06

Java編程

2022-08-17 09:07:09

低代碼LCDP編碼

2011-02-23 09:35:25

Eclipse遠(yuǎn)程調(diào)試

2023-07-03 19:40:21

系統(tǒng)設(shè)計(jì)模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)