1. 程式人生 > >架構設計:一種遠端呼叫服務的設計構思(zookeeper的一種應用實踐)

架構設計:一種遠端呼叫服務的設計構思(zookeeper的一種應用實踐)

在深入學習zookeeper我想先給大家介紹一個和zookeeper相關的應用例項,我把這個例項命名為遠端呼叫服務。通過對這種應用例項的描述,我們會對zookeeper應用場景會有深入的瞭解。

  遠端呼叫是系統與系統之間的通訊機制,它的另一種理解就是程序間的通訊。做分散式系統的開發,遠端呼叫技術是其核心技術。遠端呼叫技術可以將一組計算機系統形成一個網路系統,對外提供整體服務,那麼這一群的計算機系統就構成了一個更大型,效能更高的計算機系統。

  我在前面的部落格裡介紹了一種分散式網站的架構設計,其中就有一個使用netty技術編寫的元件作為前端系統和服務端系統通訊的媒介。在一個大型的網際網路公司裡會有很多這樣的網站系統,如果每一個網站都像我部落格裡所論述的進行開發,那麼對於系統通訊維護和管理,以及每個系統網路資源的分配管理就會造成一定的問題,對於這樣的問題,我舉個例子可能大家會更明白些,比如一個網際網路公司有數個對外提供服務的網站,有的網站訪問量很大,有的相對較小,但是公司的寬頻資源是有限的,那麼我們就希望動態的管理和分配這些資源,如果我們網站的通訊功能和網站都是緊耦合的,那麼調配這些資源的工作就會比較複雜和繁瑣,也很容易出問題。這樣的問題還會還有很多,我這裡不做細緻分析了。做軟體開發時候,有個原則,如果某個功能是可以通用的,該功能很需要統一管理時候,我們就應該把這個功能抽取成一個獨立的系統或元件,並且這個系統或元件賦予一些增強級的功能特性,這樣必定對整個系統的健壯性、可用性以及效率上有所提升。

  而我在分散式網站裡所描述的通訊技術,就是遠端呼叫技術的一種,遠端呼叫技術就是客戶端和服務端的通訊技術,它可以當做cs架構技術的一種,在java裡有很多優秀的框架實現遠端呼叫,例如java自帶的RMI,spring自帶的Httpinvoker,webservice技術等等。但是現有的這些技術滿足不了網際網路公司的遠端呼叫需求,今天我將講述一套我自己構思的一套遠端呼叫技術,這個是借鑑了一些我們公司的類似軟體的做法。

  該框架主要是針對java的,其他語言目前不能支援。首先我要總結遠端呼叫技術要包括那些技術,它們分別是:

  1. 通訊技術:遠端呼叫就是通過網路技術將不同系統構成一個整體,因此通訊技術是其重點,通訊技術我這裡選擇的是netty技術,Netty提供非同步的、事件驅動的網路應用程式框架和工具,用以快速開發高效能、高可靠性的網路伺服器和客戶端程式。Netty會讓我們開發通訊程式變得簡單,高效,其效率也是非常好的,同時它還支援多種不同的網路協議。
  2. 序列化和反序列化技術:java的序列化技術是指將物件轉換為byte資料,這些資料可以被還原為java物件,這種還原的過程就是反序列化了,該機制可以自動處理不同作業系統之間的差異,例如window下序列化的物件,可以在linux上進行重新構建。Java的jdk裡自帶了一個序列化和反序列化機制,熟悉hadoop的人知道hadoop設計了一套序列化和反序列化機制,為什麼hadoop作者不選擇使用java自帶的序列化機制,這是因為java序列化機制非常複雜,複雜帶來效率低下,java的序列化機制還有一個重要的缺點就是它序列化的二進位制資料會非常大,因為java序列化時候會附帶太多該物件的相關資訊,過大的資料量就會影響網路傳輸的效率,因此hadoop自己設計了一套序列化和反序列化機制,hadoop不同節點之間的通訊也是一種遠端呼叫機制,因此我們發現好的序列化和反序列化技術對於遠端呼叫是相當重要的。我們公司的遠端呼叫框架序列化技術有兩種一種就是java自帶的序列化和反序列化機制,一種是hessian技術,它是一種更加高效的序列化和反序列化技術。
  3. 壓縮技術:做網路程式設計,最稀缺的資源就是寬頻資源,如果傳輸資料過大,那麼對資料的壓縮就會顯得十分重要,這裡我推薦一個壓縮技術snappy,它是一種高效的壓縮和解壓縮包,google公司內部廣泛使用的一種壓縮技術。
  4. 高併發的技術:遠端呼叫技術一定會是多執行緒,只有這樣才能滿足多個併發的處理請求,java在1.5的版本里提供了一個Executor框架,它線上程開發裡引入了任務的概念,使得多執行緒的程式開發會更加合理和可控,關於executor的技術大家可以看看一本經典的書籍《java併發程式設計實踐》。想讓執行緒更加有效率,池技術也是並不可少的,apache的common-pool是一個非常好的池技術,我們可以將執行緒都預先建立好,然後放入到common-pool池裡進行管理。
  5. 非侵入式:這個也可以叫做鬆耦合,對於java的web開發,最好的解耦方式就是使用spring技術,當我們系統裡把遠端呼叫框架引入後,配置好相關的引數,我們可以把用於遠端呼叫的方法定義在spring的配置檔案裡,那麼在程式裡呼叫的時候,利用spring直接獲取這個bean,那麼對於遠端呼叫的開發就和我們在action裡呼叫server的方法沒啥區別了。下面是一段例項程式碼:
複製程式碼
<!-- 服務提供者配置 -->
<bean id="serverProvider" class="cn.com.sharpxiajun.RmifSpringProviderBean">
    <property name="interface" value="cn.com.ITest"></property><!-- 遠端呼叫的介面 -->
    <property name="target" ref="clsTest"></property><!-- clsTest實現ITest的實現類,clsTest這裡是一個bean的id值 -->
</bean>

<!-- 服務呼叫者配置 -->
<bean id="clientConsumer" class="cn.com.sharpxiajun.RmifSpringConsumerBean">
    <property name="interface" value="cn.com.clsTest"></property><!-- value就是Provider定義的target的介面實現類 -->
    <property name="seriaType" value="hessian"></property><!--序列化方式  -->
    <property name="compress" value="true"></property><!-- 壓縮標記 -->
</bean>
複製程式碼

  6.負載均衡:分散式系統都離不開負載均衡,好的負載均衡可以充分利用好不同伺服器的計算資源,提供系統的併發量和運算能力,對於網站而言(我們公司現在網站伺服器不是太多)少於10臺伺服器可以使用兩種策略:一種是簡單輪詢,比如有6臺服務端,我們會把第一個請求給第一臺伺服器,第二個請求給第二臺,依次類推,等6臺迴圈完畢,又從第一臺開始;第二種是隨機方式,即使用random函式,當然更多的伺服器我就不知道有什麼輪詢機制比較好,希望有知道的童鞋可以給我推薦下。

  我這裡設計的遠端呼叫框架,除了以上的功能外,我希望它還能有心跳管理機制,超時管理機制,服務分級管理,就是根據服務的重要性或者系統的繁忙度可以調節網路資源。

  哈哈,講了這麼久估計有童鞋可能有點煩了,不是說應用zookeeper的例項嗎?怎麼還沒見到zookeeper的影子。彆著急,zookeeper馬上就要上場了。

  還是以我前面部落格裡寫分散式網站講起,服務端系統我們可以當做服務提供者,前端系統當做服務呼叫者,提供者可以類比商戶,呼叫者可以類比客戶,商戶和客戶可以直接進行交易,這種直接交易方式非常原始甚至還會有風險,現代社會商戶和客戶直接的交易十分高效,高效的原因是因為有一個規範的大市場,商戶和客戶的交易在市場裡進行的,這樣交易會變得更加安全和高效,我設計的分散式框架最大的特點就是提供了一個類似市場的角色,它來管理服務提供者和服務呼叫者,我把這個功能模組稱為遠端呼叫管理元件。

  遠端呼叫管理元件是本框架的核心,它的主要作用是接收服務端提供者的註冊的通知,該通知一般是介面以及該介面的實現類還有伺服器的ip地址,管理元件會將這些通知記錄下來,並且根據配置對這些服務程式進行分組和標記,註冊好的資訊管理元件會將這些資訊推送到服務呼叫者。遠端呼叫管理元件還包含心跳機制,這個心跳機制是針對服務提供者,通過心跳機制檢測服務提供者的健康狀況,管理元件不會檢測服務呼叫者的健康狀態,因為這個沒必要,因為本框架的使用還是呼叫者直接去請求提供者,邏輯上是沒必要關心呼叫者的狀態,這和bs架構裡瀏覽器一樣,我們不會去關心瀏覽器使用者是不是存在。服務提供者、服務呼叫者和遠端呼叫管理元件的關係如下圖所示:

  遠端呼叫框架執行的過程是:當服務提供者啟動時候,它會將自己的ip地址和註冊的方法傳輸到遠端呼叫管理元件,管理元件接收到註冊資訊會將這些資訊儲存下來,儲存技術就是使用zookeeper,儲存成功後,管理元件會將成功通知傳回給服務提供者,同時管理元件還會通過心跳檢測服務提供者是否健康;當服務呼叫者啟動時候,它會向管理元件請求服務提供者資訊,管理元件接收到請求後會將相關資訊推送給服務呼叫者。在實際系統執行時候,服務呼叫者直接和服務提供者進行通訊互動了,通訊方式是netty,如果呼叫者和提供者有相關變化,都會先通知服務管理元件,服務管理元件會將相關變更資訊推送給相應的系統。

  遠端呼叫管理元件主要是通過zookeeper實現,zookeeper擁有一個層次的名稱空間,它的模型是一個樹狀結構,樹狀結構是一個強大的資料型別,它幾乎能儲存所有不同的資料型別,我們通過zookeeper將這些資訊儲存起來,便於我們管理整個遠端呼叫框架,同時zookeeper還是高可靠的,這個我在前面zookeeper文章裡講到了,這樣就保證了整個遠端呼叫框架的穩定性,實際應用中我們會將元件編譯成一個jar包,不同的專案直接引用這個jar包,這樣管理元件服務端和服務的提供者和呼叫者就聯絡起來。至於提供者和呼叫者的通訊機制是直接進行,因為我們將通訊程式整合在jar包裡,只不過相應的管理機制抽取到外部服務端進行統一管理。

  這就是我設計的遠端呼叫框架,可惜的是,這個構思我還沒有真正實現過,今天拿出來是想體現zookeeper的實際應用,為我後面講解zookeeper做鋪墊,至於是否可行,看以後有沒有機會開發個類似的系統,到時估計還有很多意想不到的問題要解決。

相關推薦

架構設計遠端呼叫服務設計構思zookeeper應用實踐

在深入學習zookeeper我想先給大家介紹一個和zookeeper相關的應用例項,我把這個例項命名為遠端呼叫服務。通過對這種應用例項的描述,我們會對zookeeper應用場景會有深入的瞭解。   遠端呼叫是系統與系統之間的通訊機制,它的另一種理解就是程序間的通訊。做分散式

接上篇,Springcloud使用feignclient遠端呼叫服務404 ,為什麼去掉context-path後,就能夠調通

一、問題回顧 如果application.properties檔案中配置了 #專案路徑 server.servlet.context-path=/pear-cache-service 則feignclient呼叫404  二、原因分析當專案中配置了相當於配置了server.servlet.context-pa

Java程式設計師從笨鳥到菜鳥七十WebService 遠端呼叫技術

原文連結:https://blog.csdn.net/c99463904/article/details/76018436 非常感謝作者 前言 隨著 web 應用程式的廣泛使用,不同應用程式之間的通訊也變得更加頻繁,如支付寶獲取銀行介面來獲取相應的賬戶資訊,各種天氣預報軟體獲

系統架構設計程序快取和快取服務,如何抉擇?

概述 我們所說的快取分為程序內部快取(系統內部快取)和 快取服務(如redis/memcache)。計算機服務從原來的單體結構,到多例項,到現在流行的微服務,快取服務變得原來越流行了。   程序快取 先說說程序快取,它將資料儲存在站點、服務的程序內。在Web的發展歷史上,這樣的方式備受歡迎

架構設計分散式結構下,服務部署釋出

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/data-manage-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/data-manage-parent) # 一、服務釋出簡介 分散式系統架

Springcloud踩坑記---使用feignclient遠端呼叫服務404

公司專案進行微服務改造,由之前的dubbo改用SpringCloud,微服務之間通過FeignClient進行呼叫,今天在測試的時候,eureka註冊中心有相應的服務,但feignclient就是無法調通,一直報404錯誤,排查過程如下: 一、問題:   服務提供方定義的介面如下: /** *

開發中常用的五遠端呼叫方式

開發中經常會用到遠端呼叫技術(本人常用webservice (使用CXF框架),httpclient(使用okclient框架) ),所以查查常用技術的有哪些,下面是轉的一篇內容,用於理解還可以,但是見解已經比較偏舊了,後面找找合適的資料,再寫一篇合適的 一、綜述 本文

高併發架構系列如何從0到1設計一個MQ訊息佇列

訊息佇列作為系統解耦,流量控制的利器,成為分散式系統核心元件之一。 如果你對訊息佇列背後的實現原理關注不多,其實瞭解訊息佇列背後的實現非常重要。 不僅知其然還要知其所以然,這才是一個優秀的工程師需要具備的特徵。 今天,我們就一起來探討設計一個訊息佇列背後的技術。 訊息佇列整體設計思路 主要是設計

Dubbo+Zookeeper遠端呼叫服務以及管理

   <dubbo:registry address="zookeeper://192.168.130.245:2181" check="false" subscribe="false" register=""></dubbo:registry> (adsb

Spring Cloud Alibaba基礎教程支持的幾服務消費方式RestTemplate、WebClient、Feign

功能 code vat learn master public http stp spa 通過《Spring Cloud Alibaba基礎教程:使用Nacos實現服務註冊與發現》一文的學習,我們已經學會如何使用Nacos來實現服務的註冊與發現,同時也介紹如何通過LoadB

HttpClient實現兩遠端呼叫

Http遠端呼叫兩種方式:Get 和Post請求這裡適用HttpClient實現兩種請求。Get請求:List<BasicNameValuePair> params = new ArrayList<>();params.add(new BasicNam

遠端呼叫服務(RPC)和訊息佇列(Message Queue)對比及其適用/不適用場合分析

最近考慮把公司系統重構升級,將原有的垂直MVC架構遷移為分散式系統,因此著重瞭解了下遠端呼叫服務(RPC)和訊息佇列(MQ)。RPC和MQ都是用於分散式系統的兩個關鍵技術,並且裡面都有服務提供者和消費者的概念,可在一定程度上對系統進行解耦。但對於彼此應用場景的區分還不是特別

通用的鏈表結構來自linux源代碼

個數 鏈表結構 得到 本質 還得 通用鏈表 type long long 每一個 這裏以雙向循環鏈表為例。一般定義的鏈表結構,如整數的鏈表,會用到如下結構: struct list_int { int n; struct list_int* next; stru

圖文Linux-DNS主備服務器搭建高可用

重啟 slave 配置文件 服務器 image http img -a 建立 DNS主服務器(master):192.168.127.147從服務器(slave):192.168.127.1481、首先在master和slave上安裝DNS包: 2、編輯master上的D

十五Spring Cloud 之Eureka服務註冊中心HA版

1. Eureka簡介 2. 程式碼實現 2.1涉及的模組 eureka-server-ha:通過profiles指定不同的埠來模擬多服務例項。 eureka-service:服務提供者 2.2

西部開源技術總結11月10-11月11日課程

一、基礎部分 ①字型大小標籤:使用h1-h6可以對字型大小進行簡易更改。 西部開源 西部開源 西部開源 西部開源 西部開源 西部開源 ②格式化標籤:對字型進行加粗、下劃線、傾斜更改。 西部開源 西部開源 西部開源 西部開源 ③上下標標籤:更改標籤內文字標註形式。

HTML5 CSS3 經典案例無外掛拖拽上傳圖片 支援預覽與批量

上傳基本是專案中經常出現的,一般採用:1、form提交 2、flash3、html5form提交會重新整理頁面,很難做到非同步上傳;flash可能是用得比較多了,因為可以兼顧到幾乎所有的瀏覽器,我之前一直會用jquery的uploadify作為專案中的上傳工具,uploadi

程式設計的兩方式執行Spark SQL查詢方式

現在我們來實現在自定義程式中編寫Spark SQL查詢程式。 實現查詢的方式有兩種: 方式一:通過反射推斷schema。 方式二:通過structtype直接指定schema。 我們先用方式一來實現自定義查詢。 首先建立一個team.txt檔案,內容有5列,分別是id,球隊

IT 搭框架足跡第三十步個人從零搭vue框架如何搭專案的前端

1)node裝好後; 2)選一處資料夾做父級資料夾:cmd輸入命令; 3)全域性安裝vue-cli:npm install -g vue-cli; 4)利用webpack初始化打包一個專案:vue init webpack xxx; 5)下載依賴:npm instal

經典網頁設計頂尖的個人作品集網站設計欣賞【上篇】

作為一個網頁設計師,需要經常去關注優秀的網站作品,獲取創作靈感,掌握最新的設計趨勢。在這個競爭激烈的就業市場,個人作品集網站是最好的求職工具。因此,設計師們都竭盡所能設計一個有創造性的個人作品展示網站,期望給訪客留下深刻的印象。 在此集合中,你會看到各種各樣的創意設計和新趨勢,包括精巧的佈局,令人印象深刻的