999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于REST風(fēng)格的輕量級(jí)注冊(cè)中心設(shè)計(jì)

2021-02-25 05:52:40胡喜明夏夢(mèng)瑩周慧敏
關(guān)鍵詞:數(shù)據(jù)庫(kù)功能服務(wù)

胡喜明,胡 淼,夏夢(mèng)瑩,周慧敏

(杭州電子科技大學(xué) 通信工程學(xué)院,浙江 杭州 310018)

0 引 言

RPC是當(dāng)前分布式架構(gòu)中重要的組成部分[1,2]。多個(gè)服務(wù)通過(guò)RPC框架以XML、JSON等形式進(jìn)行數(shù)據(jù)交互,降低整體系統(tǒng)的耦合性,而注冊(cè)中心是保證RPC服務(wù)間可靠通信不可或缺的組件[3]。WebService是實(shí)現(xiàn)注冊(cè)中心的一種方式,其內(nèi)部采用SOAP協(xié)議實(shí)現(xiàn)服務(wù)間通信。SOAP底層應(yīng)用XML格式進(jìn)行數(shù)據(jù)傳輸,在傳輸?shù)倪^(guò)程中需要額外標(biāo)簽的支持,而隨著SOAP協(xié)議的完善,傳輸中所需要的標(biāo)簽數(shù)量也在持續(xù)增加,使得WebService傳輸帶寬增加并且降低了系統(tǒng)的傳輸效率[4,5]。

當(dāng)前主流系統(tǒng)中多采用Zookeeper作為注冊(cè)中心,內(nèi)部以字節(jié)數(shù)組的形式對(duì)注冊(cè)信息進(jìn)行存儲(chǔ),解決了SOAP中帶寬需求增加的問(wèn)題。但是Zookeeper存在以下問(wèn)題:首先,在集群部署的情況下,Master節(jié)點(diǎn)宕機(jī)時(shí)的選舉機(jī)制一般需要耗時(shí)30 s-120 s,在此期間所有服務(wù)均不可用。其次,Zookeeper缺少可視化界面管理,無(wú)法對(duì)服務(wù)進(jìn)行細(xì)粒度治理。最后,Zookeeper運(yùn)行時(shí)受到系統(tǒng)內(nèi)存的限制,運(yùn)行中不斷產(chǎn)生的數(shù)據(jù)會(huì)使可用內(nèi)存不斷減少,進(jìn)而導(dǎo)致整體系統(tǒng)性能降低[6]。

本文提出了一種基于REST風(fēng)格的注冊(cè)中心系統(tǒng)(mRegistry)。項(xiàng)目中采用REST替代SOAP作為對(duì)外接口風(fēng)格,REST傳輸內(nèi)容以及操作方式更為簡(jiǎn)潔,其內(nèi)部實(shí)現(xiàn)了跨語(yǔ)言訪問(wèn)功能,有效解決SOAP傳輸冗余的問(wèn)題[7]。系統(tǒng)采用FreeMaker、Springboot和Mybatis框架[8],搭建了可視化后端管理頁(yè)面,實(shí)現(xiàn)服務(wù)細(xì)粒度控制。內(nèi)置數(shù)據(jù)持久化方案保證服務(wù)系統(tǒng)的穩(wěn)定高效。通過(guò)與SOAP注冊(cè)中心對(duì)比,該系統(tǒng)具有更好的并發(fā)處理能力。

1 mRegistry系統(tǒng)概述

注冊(cè)中心是RPC系統(tǒng)的核心組件,其承載著連接服務(wù)提供者與服務(wù)消費(fèi)者的任務(wù)[9]。一個(gè)完整的注冊(cè)中心應(yīng)具備功能如下:

(1)服務(wù)注冊(cè)表功能:服務(wù)注冊(cè)表是記錄當(dāng)前各個(gè)服務(wù)的信息,例如服務(wù)的名稱、ip、地址等。服務(wù)注冊(cè)表需要提供服務(wù)增加、查詢、修改、移除的功能;

(2)服務(wù)發(fā)現(xiàn)與注冊(cè):第三方應(yīng)用在接入注冊(cè)中心項(xiàng)目后,對(duì)注冊(cè)的應(yīng)用進(jìn)行保存,并開(kāi)放查詢的API功能;

(3)服務(wù)監(jiān)控:注冊(cè)中心需要對(duì)服務(wù)進(jìn)行定時(shí)檢測(cè),若發(fā)現(xiàn)服務(wù)長(zhǎng)時(shí)間無(wú)法訪問(wèn),應(yīng)該自動(dòng)對(duì)服務(wù)進(jìn)行清除;

如圖1所示為mRegistry注冊(cè)中心體系結(jié)構(gòu)圖。mRe-gistry 服務(wù)注冊(cè)中心主要包括客戶端遠(yuǎn)程API接口以及后臺(tái)管理中心。Java項(xiàng)目可通過(guò)引入對(duì)應(yīng)maven依賴并配置相關(guān)參數(shù)實(shí)現(xiàn)自動(dòng)化服務(wù)管理功能,非java語(yǔ)言或者未接入該系統(tǒng)的java程序可通過(guò)自定義REST風(fēng)格API接口實(shí)現(xiàn)服務(wù)的注冊(cè)、發(fā)現(xiàn)、監(jiān)控功能。注冊(cè)中心在接收到服務(wù)的注冊(cè)信息后通過(guò)內(nèi)部線程化機(jī)制將信息寫(xiě)入到Mysql數(shù)據(jù)庫(kù)中,隨后會(huì)定時(shí)輪循保存到本地磁盤(pán)。

圖1 mRegistry體系結(jié)構(gòu)

mRegistry注冊(cè)中心為管理員提供了完備的后臺(tái)管理頁(yè)面,通過(guò)調(diào)用內(nèi)部接口可查看當(dāng)前提供的服務(wù)數(shù)以及注冊(cè)信息,并實(shí)現(xiàn)對(duì)當(dāng)前服務(wù)的添加、修改、查看等功能。接下來(lái)針對(duì)mRegistry注冊(cè)中心中服務(wù)接口以及架構(gòu)設(shè)計(jì)進(jìn)行詳細(xì)分析。

2 mRegistry系統(tǒng)架構(gòu)設(shè)計(jì)

2.1 數(shù)據(jù)庫(kù)設(shè)計(jì)

mRegistry系統(tǒng)在收到注冊(cè)/更新請(qǐng)求后需要對(duì)當(dāng)前服務(wù)進(jìn)行數(shù)據(jù)庫(kù)更新以及本地磁盤(pán)存儲(chǔ)。項(xiàng)目中采用3個(gè)實(shí)體類(lèi)分別對(duì)應(yīng)數(shù)據(jù)庫(kù)中3張表結(jié)構(gòu),見(jiàn)表1~表3,m_re-gister 表主要搭載在管理頁(yè)面,可通過(guò)管理員后臺(tái)對(duì)其進(jìn)行編輯修改。m_register_data表主要記錄當(dāng)前運(yùn)行中的注冊(cè)信息,在服務(wù)停止后通過(guò)異步處理的方式清除無(wú)效的服務(wù),同時(shí)更新m_register表中的地址信息。m_register_message表主要作為變更操作記錄表,系統(tǒng)將服務(wù)變更信息存入表中作為當(dāng)前操作記錄,內(nèi)部通過(guò)線程化機(jī)制定時(shí)檢測(cè)當(dāng)前表中是否存在數(shù)據(jù),在檢測(cè)到記錄表中的數(shù)據(jù)后,會(huì)按順序?qū)⒆兏畔⒏碌奖镜卮疟P(pán),保證本地?cái)?shù)據(jù)與數(shù)據(jù)庫(kù)一致。

表1 m_register歷史注冊(cè)信息

表2 m_register_data當(dāng)前服務(wù)注冊(cè)信息

表3 m_register_message信息更改記錄

2.2 mRegistry對(duì)外接口設(shè)計(jì)

mRegistry對(duì)外提供了基于REST風(fēng)格的API調(diào)用接口,REST采用面向資源協(xié)議實(shí)現(xiàn)資源抽象化,并通過(guò)統(tǒng)一資源標(biāo)志符(uniform resource locator,URI)以及 HTTP 規(guī)范所定義的GET、POST、PUT、DELETE實(shí)現(xiàn)資源的訪問(wèn)。其操作方式更為簡(jiǎn)潔,充分發(fā)揮了HTTP訪問(wèn)的特性。由于REST內(nèi)置了跨語(yǔ)言訪問(wèn)功能,非JAVA項(xiàng)目以及未接入該系統(tǒng)的JAVA項(xiàng)目也可以實(shí)現(xiàn)接口的訪問(wèn)。為保證開(kāi)放性接口的安全性,接口調(diào)用中需要設(shè)置相應(yīng)的令牌進(jìn)行權(quán)限校驗(yàn),防止外部非法訪問(wèn)。如圖2所示,注冊(cè)中心對(duì)外提供服務(wù)注冊(cè)與續(xù)約、服務(wù)發(fā)現(xiàn)、服務(wù)下線、服務(wù)監(jiān)控的功能。

圖2 外部API功能結(jié)構(gòu)

(1)服務(wù)注冊(cè)與續(xù)約

系統(tǒng)啟動(dòng)后,服務(wù)提供者會(huì)向注冊(cè)中心發(fā)送注冊(cè)請(qǐng)求,請(qǐng)求的內(nèi)容包括校驗(yàn)令牌、服務(wù)訪問(wèn)地址以及業(yè)務(wù)名稱。注冊(cè)中心收到JSON格式數(shù)據(jù)后,通過(guò)Jackson序列化工具將數(shù)據(jù)反序列化為輸出對(duì)象。系統(tǒng)調(diào)用內(nèi)部驗(yàn)證方法對(duì)數(shù)據(jù)進(jìn)行格式以及令牌權(quán)限的校驗(yàn),校驗(yàn)不通過(guò)返回權(quán)限不足的提示信息。對(duì)于通過(guò)校驗(yàn)的數(shù)據(jù),為保證在高并發(fā)模式下的接口安全性,服務(wù)內(nèi)部采用Volatile關(guān)鍵字聲明的阻塞隊(duì)列registryQueue進(jìn)行數(shù)據(jù)保存,該隊(duì)列底層采用JAVA多線程的ReetrantLock鎖機(jī)制,保證數(shù)據(jù)在高并發(fā)下的線程安全。為保證服務(wù)響應(yīng)性能,數(shù)據(jù)存儲(chǔ)到registryQueue隊(duì)列后并非直接進(jìn)行持久化存儲(chǔ),而是等待內(nèi)部線程進(jìn)行處理。系統(tǒng)可通過(guò)異步回調(diào)數(shù)據(jù)向客戶端返回注冊(cè)成功信息,不需要等待內(nèi)部完成注冊(cè)。

(2)服務(wù)的發(fā)現(xiàn)

服務(wù)消費(fèi)者向mRegistry發(fā)送服務(wù)發(fā)現(xiàn)請(qǐng)求,通過(guò)傳入服務(wù)注冊(cè)的KEY、業(yè)務(wù)標(biāo)識(shí)、環(huán)境標(biāo)識(shí)來(lái)唯一的確定所需要的服務(wù)。同服務(wù)注冊(cè)相同,需要先對(duì)數(shù)據(jù)進(jìn)行反序列化以及格式校驗(yàn)。由于數(shù)據(jù)最終將持久化同步到本地磁盤(pán),因此系統(tǒng)會(huì)采用服務(wù)注冊(cè)的KEY、業(yè)務(wù)標(biāo)識(shí)、環(huán)境標(biāo)識(shí)生成文件存儲(chǔ)路徑,通過(guò)JAVA文件流將文件信息從本地磁盤(pán)加載到內(nèi)存中,最終將數(shù)據(jù)以KEY-VALUE形式返回,其中KEY為服務(wù)參數(shù)名,VALUE對(duì)應(yīng)服務(wù)提供者所提供的接口信息列表。該接口主要針對(duì)非JAVA項(xiàng)目以及未接入該項(xiàng)目的程序進(jìn)行臨時(shí)調(diào)用。為提高響應(yīng)速度,采用 redis 對(duì)查詢數(shù)據(jù)進(jìn)行緩存,并設(shè)置相應(yīng)的過(guò)期時(shí)間。當(dāng)下一次查詢相同服務(wù)時(shí)可直接從redis中獲取,減少磁盤(pán)訪問(wèn)次數(shù)。

(3)服務(wù)下線

服務(wù)下線功能是服務(wù)提供者主動(dòng)向注冊(cè)中心提交的下線請(qǐng)求。通過(guò)傳入的業(yè)務(wù)標(biāo)識(shí),業(yè)務(wù)地址以及服務(wù)名稱唯一的確定所要下線的服務(wù)。在接口通過(guò)校驗(yàn)后,系統(tǒng)內(nèi)部采用Volatile關(guān)鍵字聲明的removeQueue隊(duì)列,將通過(guò)校驗(yàn)后的信息加入到隊(duì)列中,后續(xù)交給內(nèi)部線程去執(zhí)行下線操作。

(4)服務(wù)監(jiān)控

該接口主要用在調(diào)用注冊(cè)請(qǐng)求時(shí)監(jiān)控當(dāng)前服務(wù)是否更新地址信息。服務(wù)調(diào)用者傳入業(yè)務(wù)標(biāo)識(shí)、地址以及服務(wù)名稱進(jìn)行接口調(diào)用。該接口會(huì)應(yīng)用Spring框架中的DeferredResult類(lèi)作為返回值,該類(lèi)主要為了處理耗時(shí)操作,在沒(méi)有超過(guò)所設(shè)置的時(shí)間范圍或者未調(diào)用setResult方法時(shí),接口不返回。系統(tǒng)通過(guò)異步請(qǐng)求的形式設(shè)置相應(yīng)的心跳時(shí)間對(duì)監(jiān)聽(tīng)的接口進(jìn)行檢測(cè),同時(shí)將信息存儲(chǔ)在key-value所表示的Map中。系統(tǒng)每次調(diào)用心跳接口時(shí)調(diào)用方都會(huì)主動(dòng)阻塞10 s,直至阻塞超時(shí)或服務(wù)注冊(cè)信息變動(dòng)時(shí)響應(yīng)。該接口為自動(dòng)化管理提供心跳服務(wù)。

2.3 mRegistry對(duì)外接口處理模塊設(shè)計(jì)

對(duì)外接口處理模塊主要針對(duì)REST接口所注冊(cè)的服務(wù)進(jìn)行存儲(chǔ)、更新以及實(shí)時(shí)監(jiān)控操作。為了提高系統(tǒng)的整體性能,該模塊采用并發(fā)編程思想中的線程池技術(shù),在不影響主線程運(yùn)行的情況下實(shí)現(xiàn)內(nèi)部操作線程化,提高系統(tǒng)響應(yīng)速度。其中主要分為服務(wù)注冊(cè)處理、服務(wù)下線處理、檢測(cè)服務(wù)更新以及心跳檢測(cè)。

(1)服務(wù)注冊(cè)處理

在2.2節(jié)的服務(wù)注冊(cè)API中可以看到,當(dāng)調(diào)用對(duì)外開(kāi)放接口后數(shù)據(jù)將存儲(chǔ)在registryQueue隊(duì)列中,為了保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的一致性,采用線程池技術(shù)開(kāi)啟多個(gè)線程對(duì)隊(duì)列中的數(shù)據(jù)進(jìn)行處理。服務(wù)注冊(cè)處理流程如下,系統(tǒng)通過(guò)registryQueue隊(duì)列獲取當(dāng)前隊(duì)列存儲(chǔ)數(shù)據(jù),若隊(duì)列為空則進(jìn)行下一個(gè)循環(huán)繼續(xù)監(jiān)聽(tīng)隊(duì)列,否則將隊(duì)列中的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中。添加完成后將該服務(wù)狀態(tài)從本地磁盤(pán)中讀取出來(lái),對(duì)服務(wù)的注冊(cè)信息進(jìn)行封裝并與Mysql數(shù)據(jù)庫(kù)中數(shù)據(jù)作對(duì)比,將產(chǎn)生變化的信息存入m_registry_message中等待后續(xù)本地磁盤(pán)數(shù)據(jù)同步。

(2)服務(wù)下線處理

為降低服務(wù)響應(yīng)的延時(shí),服務(wù)下線階段同樣采用線程池技術(shù),開(kāi)啟多個(gè)線程進(jìn)行輪循處理。需要做下線操作的服務(wù)信息均存儲(chǔ)在2.2節(jié)所提到的removeQueue隊(duì)列中,系統(tǒng)會(huì)輪循檢測(cè)隊(duì)列是否存在信息,將檢測(cè)到的信息與數(shù)據(jù)庫(kù)進(jìn)行對(duì)比并移除對(duì)應(yīng)服務(wù)。服務(wù)移除后需要對(duì)在m_registry_message表中記錄當(dāng)前操作信息,等等后續(xù)線程處理。

(3)檢測(cè)服務(wù)更新處理

服務(wù)更新檢測(cè)是為了將服務(wù)注冊(cè)以及服務(wù)下線的數(shù)據(jù)進(jìn)行本地磁盤(pán)同步。當(dāng)前服務(wù)中更新的數(shù)據(jù)都存儲(chǔ)在 m_registry_message 表中,系統(tǒng)首先會(huì)對(duì)數(shù)據(jù)庫(kù)表中數(shù)據(jù)進(jìn)行獲取,將獲取到的數(shù)據(jù)進(jìn)行狀態(tài)監(jiān)測(cè),對(duì)于鎖定的服務(wù)將地址置空。系統(tǒng)將監(jiān)測(cè)后的數(shù)據(jù)按順序進(jìn)行本地磁盤(pán)同步。該功能中為保證客戶端服務(wù)查詢的可靠性,采用廣播的形式對(duì)客戶進(jìn)行通知服務(wù),線程的輪詢操作為用戶提供了秒級(jí)通知的效果。在變更信息的同時(shí)會(huì)對(duì)數(shù)據(jù)庫(kù)中過(guò)期信息進(jìn)行清理,使得外部監(jiān)控接口在監(jiān)測(cè)到數(shù)據(jù)更改時(shí)可以得到正確的返回結(jié)果。

(4)心跳檢測(cè)處理

服務(wù)注冊(cè)處理線程中應(yīng)用registryQueue與線程池技術(shù)進(jìn)行服務(wù)的注冊(cè),在檢測(cè)到當(dāng)前服務(wù)信息存在時(shí),將會(huì)對(duì)注冊(cè)時(shí)間進(jìn)行更新,保證當(dāng)前注冊(cè)信息的有效性。注冊(cè)中心內(nèi)部設(shè)置心跳檢測(cè)時(shí)間,若數(shù)據(jù)庫(kù)中時(shí)間與心跳時(shí)間的總和小于當(dāng)前時(shí)間即可認(rèn)為當(dāng)前服務(wù)已經(jīng)失效,此時(shí)需要清除 m_registry_data表中的信息。為了保證在調(diào)用服務(wù)發(fā)現(xiàn)API時(shí),本地?cái)?shù)據(jù)查詢到最新的數(shù)據(jù),在清除表中信息后需要對(duì)當(dāng)前操作進(jìn)行本地磁盤(pán)同步處理。

2.4 mRegistry后臺(tái)管理中心設(shè)計(jì)

如圖3所示,后臺(tái)管理中心主要分為服務(wù)展示、服務(wù)管理以及使用說(shuō)明3部分。管理員通過(guò)輸入賬號(hào)密碼實(shí)現(xiàn)后臺(tái)的登錄,為保證服務(wù)的安全性系統(tǒng),系統(tǒng)采用MD5加密模式對(duì)輸入賬號(hào)進(jìn)行校驗(yàn)。登陸成功后系統(tǒng)生成對(duì)應(yīng)Token令牌存儲(chǔ)在Redis中并返回前端,每次在操作管理界面功能時(shí)都需要進(jìn)行令牌校驗(yàn)。該存儲(chǔ)模式主要為了實(shí)現(xiàn)單點(diǎn)登錄功能以及解決集群環(huán)境下的Session不一致現(xiàn)象。圖4為登錄成功后顯示的后臺(tái)管理頁(yè)面,在運(yùn)行報(bào)表標(biāo)簽中可以查看當(dāng)前系統(tǒng)中正在運(yùn)行的注冊(cè)服務(wù)數(shù)量以及當(dāng)前系統(tǒng)注冊(cè)的人員數(shù)量,方便管理人員進(jìn)行數(shù)據(jù)統(tǒng)計(jì)。服務(wù)注冊(cè)標(biāo)簽為該后臺(tái)管理的核心功能,其中主要包括對(duì)服務(wù)的增加、修改、刪除以及禁用功能,管理員還可以通過(guò)輸入業(yè)務(wù)標(biāo)識(shí)、環(huán)境標(biāo)識(shí)以及注冊(cè)的key進(jìn)行服務(wù)的精確查找。在使用教程界面中主要對(duì)該系統(tǒng)的功能點(diǎn)進(jìn)行了描述,同時(shí)還提供了完整的使用說(shuō)明,方便管理人員使用。

圖3 后臺(tái)管理功能結(jié)構(gòu)

圖4 系統(tǒng)管理員界面

目前傳統(tǒng)Web頁(yè)面設(shè)計(jì)主要采用HTML+CSS+JSP框架。JSP功能比較強(qiáng)大,可以在頁(yè)面上編寫(xiě)處理邏輯代碼,但隨著頁(yè)面功能的擴(kuò)展,邏輯代碼的復(fù)雜度提高,且在第一次執(zhí)行的時(shí)候還需要進(jìn)行編譯轉(zhuǎn)換操作,增加了系統(tǒng)的維護(hù)難度。項(xiàng)目中采用FreeMaker模板引擎技術(shù),該技術(shù)主要用在MVC模型中,遵循模板+數(shù)據(jù)=頁(yè)面的形式,模板只負(fù)責(zé)數(shù)據(jù)在頁(yè)面中的表現(xiàn),不涉及任何的邏輯代碼,而所有的邏輯都是由數(shù)據(jù)模型來(lái)處理。用戶最終看到的輸出是模板和數(shù)據(jù)模型合并后的結(jié)果,真正實(shí)現(xiàn)了前后端分離開(kāi)發(fā)。應(yīng)用模板引擎技術(shù)開(kāi)發(fā)提高了代碼復(fù)用率以及頁(yè)面的加載速度[10,11]。

2.5 客戶端服務(wù)優(yōu)化

對(duì)于接入mRegistry的RPC框架,直接調(diào)用對(duì)外API接口無(wú)法實(shí)現(xiàn)自動(dòng)化服務(wù)上下線通知功能,因此在項(xiàng)目中封裝了客戶端輔助類(lèi),該類(lèi)將遠(yuǎn)程API接口封裝為服務(wù)注冊(cè)、發(fā)現(xiàn)、移除方法,使得RPC框架在接入注冊(cè)中心時(shí)可以自動(dòng)對(duì)服務(wù)進(jìn)行更新。并且該類(lèi)內(nèi)部使用Redis對(duì)服務(wù)注冊(cè)信息進(jìn)行緩存,避免在服務(wù)發(fā)現(xiàn)時(shí)的多次IO操作。

功能的實(shí)現(xiàn)分為兩部分:

(1)系統(tǒng)啟動(dòng)后在后臺(tái)服務(wù)端開(kāi)啟一個(gè)服務(wù)注冊(cè)相關(guān)的守護(hù)線程,該線程可以保證在客戶端關(guān)閉連接時(shí)也進(jìn)行關(guān)閉處理。線程對(duì)接收到的服務(wù)注冊(cè)信息進(jìn)行輪循處理,將數(shù)據(jù)每隔10 s進(jìn)行數(shù)據(jù)庫(kù)更新,這里主要更新該注冊(cè)信息的updateTime字段,該字段為后續(xù)服務(wù)下線做預(yù)處理;

(2)在開(kāi)啟服務(wù)注冊(cè)線程的同時(shí)也采用守護(hù)線程的模式開(kāi)啟服務(wù)發(fā)現(xiàn)線程,保證服務(wù)結(jié)束后線程的釋放。服務(wù)在第一次調(diào)用服務(wù)發(fā)現(xiàn)方法時(shí)會(huì)將當(dāng)前服務(wù)信息的服務(wù)名稱作為key服務(wù)地址作為value存入Redis中并設(shè)置過(guò)期時(shí)間,后續(xù)的查詢操作均不需要進(jìn)行本地磁盤(pán)查詢,可通過(guò)服務(wù)名稱從Redis中獲取對(duì)應(yīng)地址。為防止過(guò)快訪問(wèn)導(dǎo)致性能下降,會(huì)先判斷Redis變量中數(shù)據(jù)是否存在,若沒(méi)有數(shù)據(jù)則將線程暫停3 s。在檢測(cè)Redis中存在服務(wù)信息后,通過(guò)編寫(xiě)REST風(fēng)格的HTTP請(qǐng)求訪問(wèn)服務(wù)監(jiān)控API。對(duì)外服務(wù)監(jiān)控API中設(shè)置了最長(zhǎng)等待時(shí)間為30 s,HTTP在調(diào)用監(jiān)控API接收到返回結(jié)果時(shí),如果為FALSE,則讓當(dāng)前線程休眠10 s再次進(jìn)行調(diào)用,避免失敗重試請(qǐng)求次數(shù)過(guò)多。由于10 s的睡眠時(shí)間限制,在經(jīng)過(guò)3次心跳檢測(cè)訪問(wèn)后如果當(dāng)前監(jiān)控API回復(fù)默認(rèn)響應(yīng)則表示當(dāng)前服務(wù)已經(jīng)停止,此時(shí)數(shù)據(jù)庫(kù)中該服務(wù)的數(shù)據(jù)在時(shí)間上已經(jīng)符合刪除條件,即心跳時(shí)間與服務(wù)UpdateTime字段的時(shí)間總和小于當(dāng)前時(shí)間。系統(tǒng)通過(guò)調(diào)用服務(wù)查詢API,刷新當(dāng)前Redis中的數(shù)據(jù),自動(dòng)將下線數(shù)據(jù)移除。系統(tǒng)循環(huán)執(zhí)行上述操作,在提高整體查詢服務(wù)的速度的同時(shí)實(shí)現(xiàn)服務(wù)的自動(dòng)化管理。

Redis進(jìn)行服務(wù)緩存時(shí)容易出現(xiàn)緩存雪崩的情況,主要原因是大量的服務(wù)緩存數(shù)據(jù)在同一時(shí)間過(guò)期失效,此時(shí)大量請(qǐng)求直接訪問(wèn)數(shù)據(jù)庫(kù)導(dǎo)致數(shù)據(jù)庫(kù)無(wú)法承受當(dāng)前壓力而出現(xiàn)性能下降甚至崩潰。系統(tǒng)通過(guò)對(duì)key值設(shè)置不同的緩存時(shí)間來(lái)解決該問(wèn)題,通過(guò)Random函數(shù)在原始默認(rèn)緩存時(shí)間的基礎(chǔ)上添加隨機(jī)數(shù),使得注冊(cè)的服務(wù)在內(nèi)存中的失效時(shí)間散列化。

2.6 mRegistry集群設(shè)計(jì)

集群化部署可以提升系統(tǒng)的容災(zāi)以及高可用能力,在分布式系統(tǒng)中注冊(cè)中心均需要以集群的形式搭建。如圖5所示,項(xiàng)目中采用 Nginx搭建注冊(cè)中心集群,通過(guò)更改Nginx配置文件文件中的upstream屬性為不同的注冊(cè)中心分配地址[12-14]。通過(guò)Nginx內(nèi)置的負(fù)載均衡策略為不同的端口設(shè)置權(quán)重,實(shí)現(xiàn)后臺(tái)服務(wù)器負(fù)載的均衡分配。在該模式下若當(dāng)前訪問(wèn)的注冊(cè)中心出現(xiàn)宕機(jī)情況,Nginx會(huì)對(duì)節(jié)點(diǎn)進(jìn)行自動(dòng)切換,解決了Zookeeper集群模式選舉時(shí)間過(guò)長(zhǎng)導(dǎo)致的服務(wù)不可用問(wèn)題。

圖5 nginx集群框架

在搭建集群時(shí)需保證連接相同的數(shù)據(jù)庫(kù)實(shí)例,同時(shí)多個(gè)注冊(cè)中心的管理員界面登陸賬號(hào)的配置需要保持一致。在多臺(tái)服務(wù)器同時(shí)操作同一個(gè)數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)中采用聯(lián)合唯一索引的方式,最終只有一臺(tái)服務(wù)器成功執(zhí)行,保證了數(shù)據(jù)冪等性。

2.7 mRegistry一致性問(wèn)題

mRegistry系統(tǒng)采用集群方式搭建,多個(gè)注冊(cè)中心共同操作同一數(shù)據(jù)庫(kù)實(shí)例時(shí)會(huì)產(chǎn)生數(shù)據(jù)存入本地磁盤(pán)不一致的現(xiàn)象。為解決mRegistry中數(shù)據(jù)一致性問(wèn)題,項(xiàng)目基于Raft原理,采用統(tǒng)一處理操作變更請(qǐng)求。其作用是為了保證節(jié)點(diǎn)之間操作的日志副本一致,并通過(guò)邏輯時(shí)鐘進(jìn)行定時(shí)保存,保證節(jié)點(diǎn)運(yùn)行狀態(tài)機(jī)得到一致的結(jié)論[15]。項(xiàng)目中m_registry_message消息表作為統(tǒng)一處理分發(fā)變更請(qǐng)求,僅在變更數(shù)據(jù)時(shí)才產(chǎn)生消息,消息量相對(duì)較少,并且消息輪詢線程存在時(shí)間間隔,因此數(shù)據(jù)庫(kù)中消息表的壓力也不會(huì)過(guò)大。在服務(wù)提供者進(jìn)行注冊(cè)以及修改服務(wù)時(shí),m_registry_message表會(huì)將注冊(cè)的操作進(jìn)行記錄,以順序遍歷的方式同步到本地磁盤(pán),遍歷后清除消息表中相應(yīng)數(shù)據(jù),保證本地?cái)?shù)據(jù)與數(shù)據(jù)庫(kù)數(shù)據(jù)一致,并內(nèi)置周期性的將數(shù)據(jù)庫(kù)中注冊(cè)信息全量同步到本地磁盤(pán),保證多個(gè)注冊(cè)中心節(jié)點(diǎn)的數(shù)據(jù)一致性。

3 實(shí)驗(yàn)測(cè)試

3.1 系統(tǒng)功能測(cè)試

在本地電腦搭建注冊(cè)中心環(huán)境,項(xiàng)目啟動(dòng)后訪問(wèn)http://localhost:8080/admin進(jìn)入登陸頁(yè)面,如圖6所示為輸入正確賬號(hào)密碼后進(jìn)入的后臺(tái)管理界面。管理員可以通過(guò)瀏覽器便捷地查看系統(tǒng)當(dāng)前服務(wù)數(shù),并通過(guò)頁(yè)面上的功能按鍵進(jìn)行服務(wù)的新增、查詢、修改和刪除操作。測(cè)試結(jié)果可知,該界面運(yùn)行流暢,人機(jī)交互效果良好,符合預(yù)期設(shè)計(jì)需求。

圖6 后臺(tái)服務(wù)注冊(cè)管理界面

針對(duì)服務(wù)注冊(cè)以及查詢功能,需要在客戶端編寫(xiě)服務(wù)注冊(cè)以及查詢的代碼,代碼中調(diào)用自定義的客戶端類(lèi)發(fā)送服務(wù)注冊(cè)請(qǐng)求。如圖7所示,客戶端開(kāi)啟后可以從控制臺(tái)看到服務(wù)注冊(cè)成功的日志信息,并且系統(tǒng)每隔10 s會(huì)向mRegistry發(fā)出監(jiān)控請(qǐng)求,檢測(cè)當(dāng)前注冊(cè)服務(wù)是否存在。測(cè)試代碼中設(shè)置2 s的睡眠后進(jìn)行服務(wù)查詢,從圖中可知此時(shí)客戶端編寫(xiě)的服務(wù)發(fā)現(xiàn)代碼成功獲取到了當(dāng)前注冊(cè)的服務(wù)信息。

圖7 啟動(dòng)后日志

通過(guò)對(duì)數(shù)據(jù)庫(kù)中key為update的服務(wù)進(jìn)行修改,測(cè)試服務(wù)自動(dòng)化管理功能。修改update服務(wù)的地址,等待幾秒鐘后系統(tǒng)基于心跳檢測(cè)機(jī)制發(fā)現(xiàn)當(dāng)前注冊(cè)服務(wù)信息與實(shí)際注冊(cè)不符,系統(tǒng)將注冊(cè)表中信息清除并重新將當(dāng)前服務(wù)注冊(cè)。如圖8所示,此時(shí)在服務(wù)端做出了服務(wù)更改的操作,需要在m_registry_message表中記錄一條JSON格式的變更信息。系統(tǒng)內(nèi)部通過(guò)對(duì)記錄表中數(shù)據(jù)進(jìn)行監(jiān)聽(tīng)將當(dāng)前更改操作寫(xiě)入到本地磁盤(pán)中并將該條記錄刪除。至此完成了自動(dòng)化管理的功能。

圖8 m_registry_message表

3.2 系統(tǒng)性能測(cè)試

這一部分主要針對(duì)mRegistry注冊(cè)中心和SOAP注冊(cè)中心的響應(yīng)性能進(jìn)行測(cè)試。通過(guò)maven插件對(duì)注冊(cè)中心項(xiàng)目進(jìn)行打包,將打包好的JAR文件分別上傳到服務(wù)器中。服務(wù)啟動(dòng)前需要在mysql數(shù)據(jù)庫(kù)中創(chuàng)建mRegistry對(duì)應(yīng)表結(jié)構(gòu),并對(duì)redis進(jìn)行相應(yīng)的部署。mRegistry注冊(cè)中心需要對(duì)注冊(cè)的服務(wù)進(jìn)行本地磁盤(pán)保存,應(yīng)根據(jù)不同系統(tǒng)修改對(duì)應(yīng)存儲(chǔ)路徑信息。測(cè)試中選取3臺(tái)服務(wù)器,其中兩臺(tái)服務(wù)器分別部署基于SOAP風(fēng)格的注冊(cè)中心和mRegistry注冊(cè)中心,第3臺(tái)作為模擬請(qǐng)求。3臺(tái)機(jī)器配置見(jiàn)表4。

表4 服務(wù)器配置

實(shí)驗(yàn)中采用并發(fā)測(cè)試工具Jmeter對(duì)兩個(gè)注冊(cè)中心系統(tǒng)進(jìn)行性能壓力測(cè)試。Jmeter模擬高并發(fā)下服務(wù)注冊(cè)與服務(wù)查詢請(qǐng)求,其內(nèi)部通過(guò)多線程機(jī)制設(shè)置并發(fā)訪問(wèn)數(shù)量,根據(jù)并發(fā)數(shù)的不同對(duì)比兩個(gè)注冊(cè)中心數(shù)據(jù)響應(yīng)速度。

3.2.1 服務(wù)注冊(cè)

如圖9所示為客戶端并發(fā)模擬服務(wù)注冊(cè)請(qǐng)求的響應(yīng)時(shí)間對(duì)比圖,橫坐標(biāo)為并發(fā)用戶數(shù)量,縱坐標(biāo)為平均響應(yīng)時(shí)間。由圖可知,在并發(fā)數(shù)量較小的情況下兩者的服務(wù)注冊(cè)時(shí)間相近。隨著并發(fā)訪問(wèn)量的提升,SOAP服務(wù)注冊(cè)中心響應(yīng)時(shí)間遠(yuǎn)大于mRegistry,可以看出在服務(wù)注冊(cè)方面mRegistry有明顯的性能優(yōu)勢(shì)。

圖9 注冊(cè)服務(wù)響應(yīng)時(shí)間對(duì)比

3.2.2 服務(wù)發(fā)現(xiàn)

測(cè)試過(guò)服務(wù)注冊(cè)功能后,兩個(gè)注冊(cè)中心所注冊(cè)的服務(wù)數(shù)量相同。客戶端模擬高并發(fā)情況下服務(wù)發(fā)現(xiàn)請(qǐng)求,如圖10為服務(wù)發(fā)現(xiàn)功能的并發(fā)訪問(wèn)數(shù)量與平均響應(yīng)時(shí)間關(guān)系圖,從實(shí)驗(yàn)結(jié)果可以看到,SOAP注冊(cè)中心的響應(yīng)時(shí)間始終高于REST注冊(cè)中心。隨著并發(fā)訪問(wèn)量的提高,兩者的響應(yīng)時(shí)間差依然很大,最終SOAP服務(wù)注冊(cè)中心響應(yīng)時(shí)間接近mRegistry響應(yīng)時(shí)間兩倍。從曲線的走勢(shì)可以看出mRegistry更加平穩(wěn),這說(shuō)明mRegistry系統(tǒng)在高并發(fā)環(huán)境下更加穩(wěn)定。

圖10 服務(wù)發(fā)現(xiàn)響應(yīng)時(shí)間對(duì)比

4 結(jié)束語(yǔ)

通過(guò)分析SOAP中xml格式傳輸存在的問(wèn)題,設(shè)計(jì)了一種基于REST風(fēng)格的輕量級(jí)注冊(cè)中心。該系統(tǒng)對(duì)外開(kāi)放REST風(fēng)格接口實(shí)現(xiàn)跨語(yǔ)言調(diào)用,同時(shí)降低了傳輸?shù)娜哂喽龋换诰€程池技術(shù)對(duì)底層業(yè)務(wù)代碼進(jìn)行封裝,提高了注冊(cè)中心的運(yùn)行效率;系統(tǒng)采用Redis對(duì)服務(wù)進(jìn)行緩存,降低數(shù)據(jù)庫(kù)訪問(wèn)壓力,提升響應(yīng)性能;通過(guò)對(duì)API接口封裝,實(shí)現(xiàn)自動(dòng)化服務(wù)管理以及心跳檢測(cè)功能;系統(tǒng)基于Raft原理防止數(shù)據(jù)重復(fù)消費(fèi),保證了數(shù)據(jù)的一致性;最后,通過(guò)與SOAP注冊(cè)中心對(duì)比可知該框架具有良好的并發(fā)處理能力。

猜你喜歡
數(shù)據(jù)庫(kù)功能服務(wù)
也談詩(shī)的“功能”
服務(wù)在身邊 健康每一天
服務(wù)在身邊 健康每一天
服務(wù)在身邊 健康每一天
招行30年:從“滿意服務(wù)”到“感動(dòng)服務(wù)”
商周刊(2017年9期)2017-08-22 02:57:56
關(guān)于非首都功能疏解的幾點(diǎn)思考
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
主站蜘蛛池模板: 国产av剧情无码精品色午夜| 欧美国产日韩在线观看| 欧美亚洲一区二区三区导航| 日韩精品一区二区三区中文无码 | 999国产精品永久免费视频精品久久| 欧美中文字幕无线码视频| 香蕉视频在线观看www| 精品国产美女福到在线直播| 亚洲大尺码专区影院| 国产精品网曝门免费视频| 黄色网站不卡无码| 农村乱人伦一区二区| 韩日无码在线不卡| 啊嗯不日本网站| 东京热高清无码精品| 国产国产人在线成免费视频狼人色| 深夜福利视频一区二区| 无码一区二区三区视频在线播放| 亚洲欧美另类日本| 国产午夜无码片在线观看网站| 亚洲第七页| 91偷拍一区| a毛片在线播放| 999在线免费视频| 国产午夜福利在线小视频| 中文字幕亚洲无线码一区女同| 精品国产自在现线看久久| 国产一区二区网站| 国产成人三级| 18禁黄无遮挡免费动漫网站| 国产麻豆福利av在线播放| 992tv国产人成在线观看| 岛国精品一区免费视频在线观看| 中文字幕在线欧美| 日韩在线第三页| 欧美在线黄| 美女毛片在线| 欧美曰批视频免费播放免费| 久久精品国产999大香线焦| 精品久久久久久成人AV| 国产美女91视频| 91免费国产在线观看尤物| 国产在线拍偷自揄观看视频网站| 日本三级精品| 国产情侣一区| 亚洲高清资源| 国产综合另类小说色区色噜噜| 伊人成色综合网| 最新午夜男女福利片视频| 日韩精品一区二区三区swag| 亚洲AV成人一区国产精品| 2020国产精品视频| 国产成人精品一区二区三在线观看| 免费xxxxx在线观看网站| 亚洲欧美成aⅴ人在线观看 | 久久9966精品国产免费| 国产精品爆乳99久久| 青草免费在线观看| 欧美专区在线观看| 色偷偷一区| 亚洲视频免费在线看| 亚洲AV无码乱码在线观看代蜜桃| 拍国产真实乱人偷精品| 人人看人人鲁狠狠高清| 国产国模一区二区三区四区| 无码专区第一页| 不卡无码网| 久久综合激情网| 8090成人午夜精品| 久久一日本道色综合久久| 国产成人一区二区| 91精品久久久久久无码人妻| 五月婷婷亚洲综合| 91视频国产高清| 免费毛片全部不收费的| 日韩无码精品人妻| 中文字幕亚洲综久久2021| 青青久视频| 精品少妇人妻av无码久久 | 国产成人久视频免费| 亚洲色精品国产一区二区三区| 亚洲视频无码|