• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      分布式服務(wù)框架的設(shè)計(jì)與實(shí)現(xiàn)

      2018-05-18 07:58:30張鵬飛
      現(xiàn)代計(jì)算機(jī) 2018年10期
      關(guān)鍵詞:序列化服務(wù)端服務(wù)提供者

      張鵬飛

      (四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)

      0 引言

      隨著互聯(lián)網(wǎng)浪潮風(fēng)起云涌,互聯(lián)網(wǎng)行業(yè)發(fā)展非常迅速。在一個(gè)不斷發(fā)展的大型應(yīng)用中,新的業(yè)務(wù)功能和需求不斷增加,技術(shù)也在不斷演進(jìn),不同團(tuán)隊(duì)構(gòu)建的功能和子系統(tǒng)采用的技術(shù)構(gòu)成五花八門(mén),子系統(tǒng)之間開(kāi)發(fā)、部署和運(yùn)維也存在較大差異。如果企業(yè)內(nèi)部沒(méi)有統(tǒng)一的服務(wù)框架進(jìn)行技術(shù)層面的拉通,開(kāi)發(fā)和運(yùn)維都將會(huì)受到很大的約束。

      傳統(tǒng)垂直架構(gòu)的核心就是要對(duì)應(yīng)用進(jìn)行服務(wù)化,服務(wù)化改造使用到的核心技術(shù)就是分布式服務(wù)框架。

      1 框架設(shè)計(jì)

      分布式服務(wù)框架包括服務(wù)提供者、服務(wù)消費(fèi)者、服務(wù)注冊(cè)發(fā)現(xiàn)、序列化、服務(wù)通信、負(fù)載均衡、日志管理等組件。

      圖1

      其中,服務(wù)提供端是分布式服務(wù)框架最重要的組成部分,通過(guò)將本地服務(wù)注冊(cè)到服務(wù)注冊(cè)中心上來(lái)發(fā)布可用的服務(wù)。包含IoC組件、流量控制組件、服務(wù)發(fā)布組件等。IoC組件提供了依賴(lài)注入功能,將對(duì)象從對(duì)象提供者和使用者之間分離開(kāi)來(lái),由IoC容器管理對(duì)象依賴(lài)關(guān)系和生命周期。

      序列化:序列化是將對(duì)象轉(zhuǎn)化為字節(jié)序列的過(guò)程。反序列化是序列化的逆過(guò)程。序列化幫助我們解決了幾個(gè)問(wèn)題。第一、使不共享內(nèi)存通過(guò)網(wǎng)絡(luò)連接的系統(tǒng)之間可以進(jìn)行對(duì)象的傳輸。第二、解決遠(yuǎn)程接口調(diào)用JVM之間內(nèi)存無(wú)法共享的問(wèn)題。

      日志管理:記錄重要的框架層日志、異常鏈數(shù)據(jù),同時(shí)將日志的接口暴露出來(lái),讓業(yè)務(wù)層的程序員能根據(jù)日志來(lái)調(diào)試程序,解決潛在的問(wèn)題。

      服務(wù)配置:支持配置文件方式配置,能夠集成主流框架,能夠在框架運(yùn)行時(shí)根據(jù)不同的業(yè)務(wù)場(chǎng)景來(lái)調(diào)整服務(wù)的參數(shù)和配置。

      服務(wù)通信:提供NIO的同步請(qǐng)求響應(yīng)模式和基于消息的一異步通信方式。

      負(fù)載均衡:負(fù)載均衡的目的是將請(qǐng)求按照某種策略分布到多臺(tái)機(jī)器上,使系統(tǒng)能夠?qū)崿F(xiàn)橫向擴(kuò)展。

      框架運(yùn)行具體流程為:

      服務(wù)提供端啟動(dòng)服務(wù)器,框架將服務(wù)提供者信息(服務(wù)主機(jī)IP地址、端口號(hào)、提供的服務(wù)接口信息等)注冊(cè)到服務(wù)注冊(cè)中心。服務(wù)消費(fèi)端將服務(wù)提供信息從服務(wù)注冊(cè)中心讀取到本地緩存中,同時(shí)將服務(wù)消費(fèi)者的信息上傳到服務(wù)注冊(cè)中心去。服務(wù)消費(fèi)端使用系統(tǒng)提供的幾種軟負(fù)載均衡算法的某一種來(lái)選擇某一個(gè)服務(wù)提供者,發(fā)起服務(wù)調(diào)用命令。服務(wù)提供端收到來(lái)自服務(wù)消費(fèi)端的請(qǐng)求,使用數(shù)據(jù)序列化方案將調(diào)用數(shù)據(jù)序列化為可以在網(wǎng)絡(luò)中傳輸?shù)淖止?jié)數(shù)組,發(fā)送給服務(wù)消費(fèi)端來(lái)完成服務(wù)的調(diào)用。

      2 分布式服務(wù)框架的實(shí)現(xiàn)

      2.1 服務(wù)提供端的實(shí)現(xiàn)

      大多數(shù)使用Java來(lái)進(jìn)行開(kāi)發(fā)的系統(tǒng)都會(huì)用Spring來(lái)作為組件的容器,開(kāi)發(fā)人員也很熟悉Spring的配置。本文為了提高分布式服務(wù)框架的易用性,實(shí)現(xiàn)了該框架和Spring的集成,使用Spring管理服務(wù)的發(fā)布和引入,進(jìn)而使遠(yuǎn)程服務(wù)發(fā)布Bean與遠(yuǎn)程調(diào)用編程界面與本地Bean方法調(diào)用一致,屏蔽了遠(yuǎn)程調(diào)用服務(wù)與本地方法調(diào)用的差異性。

      服務(wù)端利用Java注解的方式將服務(wù)接口用@Rpc-Service標(biāo)注出來(lái),在框架初始化的時(shí)候,框架掃描本地包,將被標(biāo)注為@RpcService的類(lèi)加入到容器MapserviceBeanMap中。利用Spring提供的Bean容器,在初始化Spring上下文的時(shí)候,把service-BeanMap中的服務(wù)方法發(fā)布到服務(wù)注冊(cè)中心去。在Sping Bean生命周期的最后一步,設(shè)置完服務(wù)端Server類(lèi)后,啟動(dòng)網(wǎng)絡(luò)連接,接受客戶(hù)端的請(qǐng)求。到此為止,服務(wù)器端的初始化完成。

      服務(wù)端啟動(dòng)代碼:

      2.2 服務(wù)消費(fèi)端的實(shí)現(xiàn)

      服務(wù)請(qǐng)求消息的實(shí)體是Resquest類(lèi),該類(lèi)封裝了請(qǐng)求消息ID、請(qǐng)求版本號(hào)、請(qǐng)求接口名、請(qǐng)求方法名等信息。服務(wù)消費(fèi)端使用動(dòng)態(tài)代理的設(shè)計(jì)模式思想,客戶(hù)端調(diào)用方法時(shí)就像該方法實(shí)現(xiàn)的類(lèi)在本地一樣,Java動(dòng)態(tài)代理讀取客戶(hù)端請(qǐng)求的方法信息封裝成Request類(lèi),啟動(dòng)網(wǎng)絡(luò)連接,將Request發(fā)送到服務(wù)端去,當(dāng)調(diào)用結(jié)果正常返回或者超時(shí)發(fā)生異常時(shí)候,返回該結(jié)果。服務(wù)消費(fèi)端初始化和一次服務(wù)調(diào)用代碼如下:

      2.3 服務(wù)注冊(cè)中心的實(shí)現(xiàn)

      服務(wù)注冊(cè)中心是分布式服務(wù)框架的目錄服務(wù)器,相比于傳統(tǒng)的目錄服務(wù)器,它有如下幾個(gè)特點(diǎn)。第一,支持?jǐn)?shù)據(jù)持久化,支持集群。第二,集群中所有客戶(hù)端應(yīng)該看到同一份數(shù)據(jù),不能出現(xiàn)讀或者寫(xiě)數(shù)據(jù)不一致。第三,當(dāng)注冊(cè)中心的數(shù)據(jù)發(fā)生變更時(shí)(增加、刪除、修改)需要能將及時(shí)變化的數(shù)據(jù)通知客戶(hù)端。本文使用Zookeeper來(lái)設(shè)計(jì)服務(wù)注冊(cè)中心。Zookeeper是Apache Hadoop的一個(gè)子項(xiàng)目,它主要用來(lái)解決分不少應(yīng)用中經(jīng)常遇到的一些數(shù)據(jù)管理問(wèn)題,如統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理等。

      Zookeeper是采用樹(shù)型目錄結(jié)構(gòu)的,本文定義的注冊(cè)中心節(jié)點(diǎn)樹(shù)如圖2所示。

      第一層節(jié)點(diǎn)Key用來(lái)唯一標(biāo)識(shí)一個(gè)應(yīng)用,可以看作是該應(yīng)用的一個(gè)命名空間。第二層節(jié)點(diǎn)Service用來(lái)存粗實(shí)現(xiàn)服務(wù)的信息。第三層節(jié)點(diǎn)用來(lái)區(qū)分服務(wù)消費(fèi)端和服務(wù)提供端。最后一層存儲(chǔ)服務(wù)消費(fèi)端或者服務(wù)提供端主機(jī)IP與服務(wù)端口號(hào)。其中Key和Service是持久節(jié)點(diǎn),其他節(jié)點(diǎn)是臨時(shí)節(jié)點(diǎn)。Zookeeper持久節(jié)點(diǎn)被創(chuàng)建后,就會(huì)一直存在于Zookeeper服務(wù)器上,直到有刪除操作來(lái)主動(dòng)刪除這個(gè)節(jié)點(diǎn)。而臨時(shí)節(jié)點(diǎn)的生命周期和客戶(hù)端會(huì)話(huà)綁定在一起,客戶(hù)端會(huì)話(huà)失效,則這個(gè)節(jié)點(diǎn)就會(huì)被自動(dòng)清除。這樣就實(shí)現(xiàn)了服務(wù)的自動(dòng)上線和下線,當(dāng)提供服務(wù)的服務(wù)提供端關(guān)閉時(shí),該服務(wù)信息也會(huì)在注冊(cè)中心自動(dòng)下線。

      圖2

      2.4 服務(wù)數(shù)據(jù)的通信的實(shí)現(xiàn)

      無(wú)論是服務(wù)提供端接受調(diào)用方法,還是返回調(diào)用結(jié)果,都需要通過(guò)網(wǎng)絡(luò)來(lái)進(jìn)行傳輸。這是本地調(diào)用與遠(yuǎn)程調(diào)用最主要的區(qū)別。網(wǎng)絡(luò)模塊是影響分布式服務(wù)框架性能的關(guān)鍵模塊。本文使用來(lái)Netty來(lái)構(gòu)建網(wǎng)絡(luò)模塊。Netty是著名的NIO開(kāi)源框架,提供異步的、事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架和工具,用以快速開(kāi)發(fā)高性能、高可靠性的網(wǎng)絡(luò)服務(wù)器和客戶(hù)端程序。Netty的線程模型是基于Reactor設(shè)計(jì)的,如圖3所示。

      本文設(shè)計(jì)了Netty服務(wù)端和Netty客戶(hù)端。Netty服務(wù)端的作用是服務(wù)端業(yè)務(wù)邏輯處理器和編碼解碼處理器。Netty服務(wù)端接收客戶(hù)端發(fā)起的請(qǐng)求字節(jié)數(shù)組,然后通過(guò)解碼器NettyDecodeHandler將字節(jié)數(shù)組解碼為對(duì)應(yīng)的Java請(qǐng)求對(duì)象。然后根據(jù)解碼得到的Java請(qǐng)求對(duì)象確定服務(wù)提供者接口以及方法,最后通過(guò)使用Java反射技術(shù)來(lái)發(fā)起調(diào)用。

      圖3

      Netty客戶(hù)端發(fā)起一次服務(wù)調(diào)用,并得到調(diào)用結(jié)果,整個(gè)過(guò)程如下。第一,獲取服務(wù)提供者列表,通過(guò)某種軟負(fù)載均衡算法選擇一個(gè)服務(wù)提供者。第二,根據(jù)服務(wù)提供者信息在Netty連接池中獲取對(duì)應(yīng)的Channel連接。第三,將服務(wù)請(qǐng)求數(shù)據(jù)對(duì)象通過(guò)某種序列化協(xié)議編碼成字節(jié)數(shù)組,通過(guò)Channel發(fā)送到服務(wù)端。第四,同步等待服務(wù)返回調(diào)用結(jié)果。

      3 結(jié)語(yǔ)

      本文設(shè)計(jì)實(shí)現(xiàn)了一個(gè)輕量級(jí)的分布式服務(wù)框架,涉及通信、服務(wù)調(diào)度等。該框架能提供簡(jiǎn)潔高效的RPC調(diào)用服務(wù),對(duì)整個(gè)業(yè)務(wù)系統(tǒng)不會(huì)造成任何入侵;實(shí)現(xiàn)了序列化與反序列化引擎,軟負(fù)載均衡算法引擎,能讓用戶(hù)根據(jù)業(yè)務(wù)場(chǎng)景選擇最優(yōu)的解決方案。功能上,該框架使用同步調(diào)用、異步調(diào)用,傳輸經(jīng)過(guò)序列化的對(duì)象,當(dāng)請(qǐng)求正常返回和異常返回時(shí)都做了相應(yīng)的處理;性能上,該框架可用讓用戶(hù)根據(jù)業(yè)務(wù)場(chǎng)景選擇合適的序列化方案、負(fù)載均衡方案,使用Netty提供了針對(duì)大量消費(fèi)端連接的解決方案。但是該框架存在一些不足,例如可用在TCP協(xié)議之上自定義協(xié)議族,可提高系統(tǒng)的安全性。

      參考文獻(xiàn):

      [1]ZHOU Wan-lei.Supporting Fault-tolerant and Open Distributed Processing Using RPC[D].Australia:Deakin University,1996.

      [2]李林鋒.分布式服務(wù)框架:原理與實(shí)踐[M].北京:電子工業(yè)出版社,2006.1

      [3]查駿.基于NIO的遠(yuǎn)程調(diào)用框架的設(shè)計(jì)與實(shí)現(xiàn)[D].上海:復(fù)旦大學(xué),2012.

      [4]劉禮鳴.基于本體的服務(wù)治理平臺(tái)研究[D].上海:上海交通大學(xué),2011

      [6]A.L.Ananda.B.H.Tay,E.K.Koh.A Survey of Asynchronous Remote Procedure Calls[D].ACM SIGOPS Operating Systems Review,1992.

      [7]XIAO Xin-xiao,JIA Rui-xiang.Distributed Monitoring and Control System for Energy Saving Based on RPC[D].Qindao:Qilu University of Technology,2014.

      猜你喜歡
      序列化服務(wù)端服務(wù)提供者
      網(wǎng)絡(luò)服務(wù)提供者的侵權(quán)責(zé)任研究
      法制博覽(2020年11期)2020-11-30 03:36:52
      如何建構(gòu)序列化閱讀教學(xué)
      甘肅教育(2020年14期)2020-09-11 07:58:36
      論網(wǎng)絡(luò)服務(wù)提供者刑事責(zé)任的歸責(zé)模式一一以拒不履行網(wǎng)絡(luò)安全管理義務(wù)罪為切入點(diǎn)
      云存儲(chǔ)中基于相似性的客戶(hù)-服務(wù)端雙端數(shù)據(jù)去重方法
      新時(shí)期《移動(dòng)Web服務(wù)端開(kāi)發(fā)》課程教學(xué)改革的研究
      在Windows Server 2008上創(chuàng)建應(yīng)用
      論網(wǎng)絡(luò)服務(wù)提供者的侵權(quán)責(zé)任
      法制博覽(2017年16期)2017-01-28 00:01:59
      Java 反序列化漏洞研究
      網(wǎng)絡(luò)服務(wù)提供者第三方責(zé)任的立法審視
      湖湘論壇(2015年4期)2015-12-01 09:30:16
      作文訓(xùn)練微格化、序列化初探
      大姚县| 八宿县| 布拖县| 沅陵县| 友谊县| 西乌珠穆沁旗| 安达市| 荥经县| 高淳县| 志丹县| 庆元县| 安龙县| 原平市| 商河县| 西昌市| 九江县| 廉江市| 长垣县| 定陶县| 高邮市| 渑池县| 连城县| 长葛市| 赣榆县| 井冈山市| 常德市| 五大连池市| 上林县| 河曲县| 瑞安市| 江山市| 陈巴尔虎旗| 黄梅县| 吕梁市| 收藏| 东乡族自治县| 隆回县| 安康市| 社旗县| 旬阳县| 永宁县|