日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

源码 状态机_[源码阅读] 阿里SOFA服务注册中心MetaServer(1)

發(fā)布時(shí)間:2023/12/1 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 源码 状态机_[源码阅读] 阿里SOFA服务注册中心MetaServer(1) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[源碼閱讀] 阿里SOFA服務(wù)注冊(cè)中心MetaServer(1)

  • 0x00 摘要

  • 0x01 服務(wù)注冊(cè)中心

    • 1.1 服務(wù)注冊(cè)中心簡(jiǎn)介

    • 1.2 SOFARegistry 總體架構(gòu)

    • 1.3 為什么要分層

  • 0x02 MetaServer

    • 2.1簡(jiǎn)介

    • 2.2 問題

  • 0x03 代碼結(jié)構(gòu)

  • 0x04 啟動(dòng)運(yùn)行

    • 4.1 集成部署

    • 4.2 獨(dú)立部署

  • 0x05 總體邏輯

    • 5.1 程序主體

    • 5.2 配置

  • 0x06 啟動(dòng)

    • 6.1 架構(gòu)

    • 6.2 類定義

    • 6.3 通信 Exchange

    • 6.4 啟動(dòng)入口

    • 6.4.1 啟動(dòng)服務(wù)Server

    • 6.4.2 ExecutorManager

    • 6.4.3 ServiceFactory

  • 0xFF 參考

0x00 摘要

SOFARegistry 是螞蟻金服開源的一個(gè)生產(chǎn)級(jí)、高時(shí)效、高可用的服務(wù)注冊(cè)中心。本系列將帶領(lǐng)大家一起分析其MetaServer的實(shí)現(xiàn)機(jī)制,本文為第一篇,介紹MetaServer總體架構(gòu)。

本系列總體參考了官方的博客,具體請(qǐng)參見"0xFF 參考"。大家可以把參考作為總綱,我這系列文章作為注釋補(bǔ)遺翻閱。

0x01 服務(wù)注冊(cè)中心

1.1 服務(wù)注冊(cè)中心簡(jiǎn)介

在微服務(wù)架構(gòu)下,一個(gè)互聯(lián)網(wǎng)應(yīng)用的服務(wù)端背后往往存在大量服務(wù)間的相互調(diào)用。例如服務(wù) A 在鏈路上依賴于服務(wù) B,那么在業(yè)務(wù)發(fā)生時(shí),服務(wù) A 需要知道服務(wù) B 的地址,才能完成服務(wù)調(diào)用。而分布式架構(gòu)下,每個(gè)服務(wù)往往都是集群部署的,集群中的機(jī)器也是經(jīng)常變化的,所以服務(wù) B 的地址不是固定不變的。如果要保證業(yè)務(wù)的可靠性,服務(wù)調(diào)用者則需要感知被調(diào)用服務(wù)的地址變化。

既然成千上萬的服務(wù)調(diào)用者都要感知這樣的變化,那這種感知能力便下沉成為微服務(wù)中一種固定的架構(gòu)模式:服務(wù)注冊(cè)中心

服務(wù)注冊(cè)中心里,有服務(wù)提供者和服務(wù)消費(fèi)者兩種重要的角色,服務(wù)調(diào)用方是消費(fèi)者,服務(wù)被調(diào)方是提供者。對(duì)于同一臺(tái)機(jī)器,往往兼具兩者角色,既被其它服務(wù)調(diào)用,也調(diào)用其它服務(wù)。服務(wù)提供者將自身提供的服務(wù)信息發(fā)布到服務(wù)注冊(cè)中心,服務(wù)消費(fèi)者通過訂閱的方式感知所依賴服務(wù)的信息是否發(fā)生變化。

服務(wù)注冊(cè)中心在服務(wù)調(diào)用的場(chǎng)景中,扮演一個(gè)“中介”的角色,服務(wù)發(fā)布者 (Publisher) 將服務(wù)發(fā)布到服務(wù)注冊(cè)中心,服務(wù)調(diào)用方 (Subscriber) 通過訪問服務(wù)注冊(cè)中心就能夠獲取到服務(wù)信息,進(jìn)而實(shí)現(xiàn)調(diào)用。

Subscriber 在第一次調(diào)用服務(wù)時(shí),會(huì)通過 Registry 找到相應(yīng)的服務(wù)的 IP 地址列表,通過負(fù)載均衡算法從 IP 列表中取一個(gè)服務(wù)提供者的服務(wù)器調(diào)用服務(wù)。同時(shí) Subscriber 會(huì)將 Publisher 的服務(wù)列表數(shù)據(jù)緩存到本地,供后續(xù)使用。當(dāng) Subscriber 后續(xù)再調(diào)用 Publisher 時(shí),優(yōu)先使用緩存的地址列表,不需要再去請(qǐng)求Registry。

+----------+????????????????????????????????????+---------+
|Subscriber|?+----------+??????????|??????????????|??????????+---------+
??????????????????????|??????????????|
+----------+??????????|??????????????v
|Subscriber|?+----------+????????????????????????????????|???+----------++?????????+---------+
+----------+??????????|??????????????^
|Subscriber|?+----------+?????????????????????????|
?????????????????????????????????????|??????????+---------+
?????????????????????????????????????+----------+Publisher|
????????????????????????????????????????????????+---------+

服務(wù)注冊(cè)中心Registry的最主要能力是服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)兩個(gè)過程。

  • 服務(wù)注冊(cè)的過程最重要是對(duì)服務(wù)發(fā)布的信息進(jìn)行存儲(chǔ)。
  • 服務(wù)發(fā)現(xiàn)的過程是把服務(wù)發(fā)布端的所有變化(包括節(jié)點(diǎn)變化和服務(wù)信息變化)及時(shí)準(zhǔn)確的通知到訂閱方的過程。

1.2 SOFARegistry 總體架構(gòu)

1.2.1 分層

SOFARegistry 作為服務(wù)注冊(cè)中心,分為4個(gè)層,分別為:

  • Client 層

Client 層是應(yīng)用服務(wù)器集群。Client 層是應(yīng)用層,每個(gè)應(yīng)用系統(tǒng)通過依賴注冊(cè)中心相關(guān)的客戶端 jar 包,通過編程方式來使用服務(wù)注冊(cè)中心的服務(wù)發(fā)布和服務(wù)訂閱能力。

  • Session 層

Session層是服務(wù)器集群。顧名思義,Session 層是會(huì)話層,通過長連接和 Client 層的應(yīng)用服務(wù)器保持通訊,負(fù)責(zé)接收 Client 的服務(wù)發(fā)布和服務(wù)訂閱請(qǐng)求。

在服務(wù)注冊(cè)中心的服務(wù)端因?yàn)槊總€(gè)存儲(chǔ)節(jié)點(diǎn)對(duì)應(yīng)的客戶端的鏈接數(shù)據(jù)量有限,必須進(jìn)行特殊的一層劃分用于專門收斂無限擴(kuò)充的客戶端連接,然后在透?jìng)飨鄳?yīng)的請(qǐng)求到存儲(chǔ)層。

該層只在內(nèi)存中保存各個(gè)服務(wù)的發(fā)布訂閱關(guān)系,對(duì)于具體的服務(wù)信息,只在 Client 層和 Data 層之間透?jìng)鬓D(zhuǎn)發(fā)。Session 層是一個(gè)無數(shù)據(jù)狀態(tài)的代理層,可以隨著 Client 層應(yīng)用規(guī)模的增長而擴(kuò)容。

因?yàn)?SOFARegistry 的服務(wù)發(fā)現(xiàn)需要較高的時(shí)效性,對(duì)外表現(xiàn)為主動(dòng)推送變更到客戶端,所以推送的主體實(shí)現(xiàn)也集中在 Session 層,內(nèi)部的推拉結(jié)合主要是通過 Data 存儲(chǔ)層的數(shù)據(jù)版本變更推送到所有 Session 節(jié)點(diǎn),各個(gè) Session 節(jié)點(diǎn)根據(jù)存儲(chǔ)的訂閱關(guān)系和首次訂閱獲取的數(shù)據(jù)版本信息進(jìn)行比對(duì),最終確定推送給那些服務(wù)消費(fèi)方客戶端。

  • Data 層

數(shù)據(jù)服務(wù)器集群。Data 層通過分片存儲(chǔ)的方式保存著所用應(yīng)用的服務(wù)注冊(cè)數(shù)據(jù)。數(shù)據(jù)按照 dataInfoId(每一份服務(wù)數(shù)據(jù)的唯一標(biāo)識(shí))進(jìn)行一致性 Hash 分片,多副本備份,保證數(shù)據(jù)的高可用。Data 層可以隨著數(shù)據(jù)規(guī)模的增長,在不影響業(yè)務(wù)的前提下實(shí)現(xiàn)平滑的擴(kuò)縮容。

  • Meta 層

元數(shù)據(jù)服務(wù)器集群。這個(gè)集群管轄的范圍是 Session 服務(wù)器集群和 Data 服務(wù)器集群的服務(wù)器信息,其角色就相當(dāng)于 SOFARegistry 架構(gòu)內(nèi)部的服務(wù)注冊(cè)中心,只不過 SOFARegistry 作為服務(wù)注冊(cè)中心是服務(wù)于廣大應(yīng)用服務(wù)層,而 Meta 集群是服務(wù)于 SOFARegistry 內(nèi)部的 Session 集群和 Data 集群,Meta 層能夠感知到 Session 節(jié)點(diǎn)和 Data 節(jié)點(diǎn)的變化,并通知集群的其它節(jié)點(diǎn)。

1.3 為什么要分層

SOFARegistry 內(nèi)部為什么要進(jìn)行數(shù)據(jù)分層,是因?yàn)橄到y(tǒng)容量的限制。

在 SOFARegistry 的應(yīng)用場(chǎng)景中,體量龐大的數(shù)據(jù)主要有兩類:Session 數(shù)據(jù)、服務(wù)信息數(shù)據(jù)。兩類數(shù)據(jù)的相同之處在于其數(shù)據(jù)量都會(huì)不斷擴(kuò)展,而不同的是其擴(kuò)展的原因并不相同:

  • Session 是對(duì)應(yīng)于 Client 的連接,其數(shù)據(jù)量是隨著業(yè)務(wù)機(jī)器規(guī)模的擴(kuò)展而增長,
  • 服務(wù)信息數(shù)據(jù)量的增長是由 Publisher 的發(fā)布所決定。

所以 SOFARegistry 通過分層設(shè)計(jì),將兩種數(shù)據(jù)隔離,從而使二者的擴(kuò)容互不影響。

圖3 - 分層,擴(kuò)容互不影響

這也是 SOFARegistry 設(shè)計(jì)三層模型的原因,通過 SessionServer 來負(fù)責(zé)與 Client 的連接,將每個(gè) Client 的連接數(shù)收斂到 1,這樣當(dāng) Client 數(shù)量增長時(shí),只需要擴(kuò)容 SessionServer 集群就可以了。所以從設(shè)計(jì)初衷上我們就能夠看出來 SessionServer 必須要滿足的兩個(gè)主要能力:從 DataServer 獲取服務(wù)信息數(shù)據(jù);以及保存與 Client 的會(huì)話。

0x02 MetaServer

2.1簡(jiǎn)介

MetaServer 在 SOFARegistry 中,承擔(dān)著集群元數(shù)據(jù)管理的角色,用來維護(hù)集群成員列表,可以認(rèn)為是 SOFARegistry 注冊(cè)中心的注冊(cè)中心。

MetaServer 作為 SOFARegistry 的元數(shù)據(jù)中心,其核心功能可以概括為:集群成員列表管理。比如:

  • 節(jié)點(diǎn)列表的注冊(cè)與存儲(chǔ)
  • 節(jié)點(diǎn)列表的變更通知
  • 節(jié)點(diǎn)健康監(jiān)測(cè)

當(dāng) SessionServer 和 DataServer 需要知道集群列表,并且需要擴(kuò)縮容時(shí),MetaServer 將會(huì)提供相應(yīng)的數(shù)據(jù)。

其內(nèi)部架構(gòu)如下圖所示:

內(nèi)部架構(gòu)圖

MetaServer 基于 Bolt, 通過 TCP 私有協(xié)議的形式對(duì)外提供服務(wù),包括 DataServer, SessionServer 等,處理節(jié)點(diǎn)的注冊(cè),續(xù)約和列表查詢等請(qǐng)求。

同時(shí)也基于 Http 協(xié)議提供控制接口,比如可以控制 session 節(jié)點(diǎn)是否開啟變更通知, 健康檢查接口等。

成員列表數(shù)據(jù)存儲(chǔ)在 Repository 中,Repository 被一致性協(xié)議層進(jìn)行包裝,作為 SOFAJRaft 的狀態(tài)機(jī)實(shí)現(xiàn),所有對(duì) Repository 的操作都會(huì)同步到其他節(jié)點(diǎn), 通過Rgistry來操作存儲(chǔ)層。

MetaServer 使用 Raft 協(xié)議保證高可用和數(shù)據(jù)一致性, 同時(shí)也會(huì)保持與注冊(cè)的節(jié)點(diǎn)的心跳,對(duì)于心跳超時(shí)沒有續(xù)約的節(jié)點(diǎn)進(jìn)行驅(qū)逐,來保證數(shù)據(jù)的有效性。

在可用性方面,只要未超過半數(shù)節(jié)點(diǎn)掛掉,集群都可以正常對(duì)外提供服務(wù),半數(shù)以上掛掉,Raft 協(xié)議無法選主和日志復(fù)制,因此無法保證注冊(cè)的成員數(shù)據(jù)的一致性和有效性。整個(gè)集群不可用 不會(huì)影響 Data 和 Session 節(jié)點(diǎn)的正常功能,只是無法感知節(jié)點(diǎn)列表變化。

2.2 問題

空談無用,just show the code。于是讓我們帶著問題來思考,即從宏觀和微觀角度來思考MetaServer應(yīng)該實(shí)現(xiàn)什么功能,具體是怎么實(shí)現(xiàn)的。

思考:

  • MetaServer具體是以什么方式實(shí)現(xiàn)。
  • MetaServer如何實(shí)現(xiàn)高可用。
  • MetaServer如何實(shí)現(xiàn)或者應(yīng)用內(nèi)部通訊協(xié)議。
  • MetaServer如何保持DataNode列表和SessionNode列表。
  • MetaServer如何處理節(jié)點(diǎn)列表變更推送。
  • MetaServer如何處理節(jié)點(diǎn)列表查詢。
  • MetaServer如何處理MetaServer如何保證數(shù)據(jù)一致性。
  • 各個(gè)集群是如何搭建,如何完成高可用。

下面我們就一一分析。

0x03 代碼結(jié)構(gòu)

我們?cè)?sofa-registry-5.4.2/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta 看看目錄和文件結(jié)構(gòu)。

按照目錄我們可以大致了解功能

  • MetaApplication.java :MetaServer程序主體,入口。
  • bootstrap :負(fù)責(zé)MetaServer的啟動(dòng)和配置。
  • executor :負(fù)責(zé)各種定時(shí)管理任務(wù),他的啟動(dòng)設(shè)置是在 MetaServerBootstrap.initRaft ?之中。
  • listener ?:SOFARegistry 采用了 Handler - Task & Strategy - Listener 的方式來應(yīng)對(duì)服務(wù)注冊(cè)中的各種場(chǎng)景和任務(wù),這樣的處理模型能夠盡可能的讓代碼和架構(gòu)清晰整潔。
  • node :對(duì)業(yè)務(wù)節(jié)點(diǎn)的抽象,包括DataNode,SessionNode,MetaNode。
  • registry :通過Registry來操作存儲(chǔ)層,所有對(duì) Repository 的操作都會(huì)同步到其他節(jié)點(diǎn)。
  • remoting :對(duì)外交互接口,提供各種對(duì)外的 handler。
  • repository :集群節(jié)點(diǎn)列表存儲(chǔ)在 Repository 中,通過 Raft 強(qiáng)一致性協(xié)議對(duì)外提供節(jié)點(diǎn)注冊(cè)、續(xù)約、列表查詢等 Bolt 請(qǐng)求,從而保障集群獲得的數(shù)據(jù)是強(qiáng)一致性的。Repository 被一致性協(xié)議層進(jìn)行包裝,作為 SOFAJRaft 的狀態(tài)機(jī)實(shí)現(xiàn)。
  • resource :http Server的接口,用來響應(yīng)控制消息。
  • store :封裝了存儲(chǔ)節(jié)點(diǎn)的操作。
  • task :封裝了異步執(zhí)行邏輯,通過TaskDispatcher,TaskExecutors 來執(zhí)行各種定義好的異步Task。

具體代碼結(jié)構(gòu)如下:

.
├──?MetaApplication.java
├──?bootstrap
│???├──?AbstractNodeConfigBean.java
│???├──?EnableMetaServer.java
│???├──?MetaServerBootstrap.java
│???├──?MetaServerConfig.java
│???├──?MetaServerConfigBean.java
│???├──?MetaServerConfiguration.java
│???├──?MetaServerInitializerConfiguration.java
│???├──?NodeConfig.java
│???├──?NodeConfigBeanProperty.java
│???└──?ServiceFactory.java
├──?executor
│???└──?ExecutorManager.java
├──?listener
│???├──?DataNodeChangePushTaskListener.java
│???├──?PersistenceDataChangeNotifyTaskListener.java
│???├──?ReceiveStatusConfirmNotifyTaskListener.java
│???└──?SessionNodeChangePushTaskListener.java
├──?node
│???├──?DataNodeService.java
│???├──?MetaNodeService.java
│???├──?NodeOperator.java
│???├──?NodeService.java
│???├──?SessionNodeService.java
│???└──?impl
│???????├──?DataNodeServiceImpl.java
│???????├──?MetaNodeServiceImpl.java
│???????└──?SessionNodeServiceImpl.java
├──?registry
│???├──?MetaServerRegistry.java
│???└──?Registry.java
├──?remoting
│???├──?DataNodeExchanger.java
│???├──?MetaClientExchanger.java
│???├──?MetaServerExchanger.java
│???├──?RaftExchanger.java
│???├──?SessionNodeExchanger.java
│???├──?connection
│???│???├──?DataConnectionHandler.java
│???│???├──?MetaConnectionHandler.java
│???│???├──?NodeConnectManager.java
│???│???└──?SessionConnectionHandler.java
│???└──?handler
│???????├──?AbstractServerHandler.java
│???????├──?DataNodeHandler.java
│???????├──?FetchProvideDataRequestHandler.java
│???????├──?GetNodesRequestHandler.java
│???????├──?RenewNodesRequestHandler.java
│???????└──?SessionNodeHandler.java
├──?repository
│???├──?NodeConfirmStatusService.java
│???├──?NodeRepository.java
│???├──?RepositoryService.java
│???├──?VersionRepositoryService.java
│???├──?annotation
│???│???└──?RaftAnnotationBeanPostProcessor.java
│???└──?service
│???????├──?DataConfirmStatusService.java
│???????├──?DataRepositoryService.java
│???????├──?MetaRepositoryService.java
│???????├──?SessionConfirmStatusService.java
│???????├──?SessionRepositoryService.java
│???????└──?SessionVersionRepositoryService.java
├──?resource
│???├──?BlacklistDataResource.java
│???├──?DecisionModeResource.java
│???├──?HealthResource.java
│???├──?MetaDigestResource.java
│???├──?MetaStoreResource.java
│???├──?PersistentDataResource.java
│???├──?RenewSwitchResource.java
│???└──?StopPushDataResource.java
├──?store
│???├──?DataStoreService.java
│???├──?MetaStoreService.java
│???├──?RenewDecorate.java
│???├──?SessionStoreService.java
│???└──?StoreService.java
└──?task
????├──?AbstractMetaServerTask.java
????├──?Constant.java
????├──?DataNodeChangePushTask.java
????├──?MetaServerTask.java
????├──?PersistenceDataChangeNotifyTask.java
????├──?ReceiveStatusConfirmNotifyTask.java
????├──?SessionNodeChangePushTask.java
????└──?processor
????????├──?DataNodeSingleTaskProcessor.java
????????├──?MetaNodeSingleTaskProcessor.java
????????└──?SessionNodeSingleTaskProcessor.java

16?directories,?75?files

0x04 啟動(dòng)運(yùn)行

啟動(dòng)可以參考 ?https://www.sofastack.tech/projects/sofa-registry/server-quick-start/

SOFARegistry 支持兩種部署模式,分別是集成部署模式及獨(dú)立部署模式。

4.1 集成部署

4.1.1 Linux/Unix/Mac

啟動(dòng)命令:sh bin/startup.sh

4.1.2 Windows

雙擊 bin 目錄下的 startup.bat 運(yùn)行文件。

4.1.3 啟動(dòng)信息

通過下列l(wèi)og我們可以看到啟動(dòng)信息。

MetaApplication

[2020-09-12?20:23:05,463][INFO][main][MetaServerBootstrap]?-?Open?meta?server?port?9612?success!
[2020-09-12?20:23:08,198][INFO][main][MetaServerBootstrap]?-?Open?http?server?port?9615?success!
[2020-09-12?20:23:10,298][INFO][main][MetaServerBootstrap]?-?Raft?server?port?9614?start?success!group?RegistryGroup
[2020-09-12?20:23:10,322][INFO][main][MetaServerInitializerConfiguration]?-?Started?MetaServer

DataApplication

[2020-09-12?20:23:25,004][INFO][main][DataServerBootstrap]?-?Open?http?server?port?9622?success!
[2020-09-12?20:23:26,084][INFO][main][DataServerBootstrap]?-?start?server?success
[2020-09-12?20:23:26,094][INFO][main][DataApplication]?-?Started?DataApplication?in?10.217?seconds?(JVM?running?for?11.316)

SessionApplication

[2020-09-12?20:23:50,243][INFO][main][SessionServerBootstrap]?-?Open?http?server?port?9603?success!
[2020-09-12?20:23:50,464][INFO][main][SessionServerInitializer]?-?Started?SessionServer
[2020-09-12?20:23:50,526][INFO][main][SessionApplication]?-?Started?SessionApplication?in?12.516?seconds?(JVM?running?for?13.783)

各個(gè) Server 的默認(rèn)端口分別為:

meta.server.sessionServerPort=9610
meta.server.dataServerPort=9611
meta.server.metaServerPort=9612
meta.server.raftServerPort=9614
meta.server.httpServerPort=9615

可訪問三個(gè)角色提供的健康監(jiān)測(cè) API,或查看日志 logs/registry-startup.log:

#?查看meta角色的健康檢測(cè)接口:
$?curl?http://localhost:9615/health/check
{"success":true,"message":"...?raftStatus:Leader"}

#?查看data角色的健康檢測(cè)接口:
$?curl?http://localhost:9622/health/check
{"success":true,"message":"...?status:WORKING"}

#?查看session角色的健康檢測(cè)接口:
$?curl?http://localhost:9603/health/check
{"success":true,"message":"..."}

4.2 獨(dú)立部署

在這里我們可以看出來各種集群是如何搭建,以及如何在集群內(nèi)部通訊,分布式協(xié)調(diào)。

按照常理來說,每個(gè)集群都應(yīng)該依賴zookeeper之類的軟件來進(jìn)行自己內(nèi)部的協(xié)調(diào),比如統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理、分布式應(yīng)用配置項(xiàng)。但實(shí)際上我們沒有發(fā)現(xiàn)類似的使用。

具體看配置文件發(fā)現(xiàn),每臺(tái)機(jī)器都要設(shè)置所有的metaServer的host。這說明Data Server, ?Session Server則強(qiáng)依賴Meta Server。

實(shí)際上,MetaServer 使用 Raft 協(xié)議保證高可用和數(shù)據(jù)一致性, 同時(shí)也會(huì)保持與注冊(cè)的節(jié)點(diǎn)的心跳,對(duì)于心跳超時(shí)沒有續(xù)約的節(jié)點(diǎn)進(jìn)行驅(qū)逐,來保證數(shù)據(jù)的有效性。Meta 層能夠感知到 Session 節(jié)點(diǎn)和 Data 節(jié)點(diǎn)的變化,并通知集群的其它節(jié)點(diǎn)。

這就涉及到各個(gè)角色的 failover 機(jī)制:

  • MetaServer 集群部署,內(nèi)部基于 Raft 協(xié)議選舉和復(fù)制,只要不超過 1?2 節(jié)點(diǎn)宕機(jī),就可以對(duì)外服務(wù)。
  • DataServer 集群部署,基于一致性 Hash 承擔(dān)不同的數(shù)據(jù)分片,數(shù)據(jù)分片擁有多個(gè)副本,一個(gè)主副本和多個(gè)備副本。如果 DataServer 宕機(jī),MetaServer 能感知,并通知所有 DataServer 和 SessionServer,數(shù)據(jù)分片可 failover 到其他副本,同時(shí) DataServer 集群內(nèi)部會(huì)進(jìn)行分片數(shù)據(jù)的遷移。
  • SessionServer 集群部署,任何一臺(tái) SessionServer 宕機(jī)時(shí) Client 會(huì)自動(dòng) failover 到其他 SessionServer,并且 Client 會(huì)拿到最新的 SessionServer 列表,后續(xù)不會(huì)再連接這臺(tái)宕機(jī)的 SessionServer。

4.2.1 部署meta

每臺(tái)機(jī)器在部署時(shí)需要修改 conf/application.properties 配置:

#?將3臺(tái)meta機(jī)器的ip或hostname配置到下方(填入的hostname會(huì)被內(nèi)部解析為ip地址)
nodes.metaNode=DefaultDataCenter:,,
nodes.localDataCenter=DefaultDataCenter

4.2.2 部署data

每臺(tái)機(jī)器在部署時(shí)需要修改 conf/application.properties 配置:

#?將3臺(tái)?meta?機(jī)器的?ip?或?hostname?配置到下方(填入的?hostname?會(huì)被內(nèi)部解析為?ip?地址)
nodes.metaNode=DefaultDataCenter:,,
nodes.localDataCenter=DefaultDataCenter
data.server.numberOfReplicas=1000

4.2.3 部署 session

每臺(tái)機(jī)器在部署時(shí)需要修改 conf/application.properties 配置:

#?將3臺(tái)?meta?機(jī)器的?ip?或?hostname?配置到下方(填入的?hostname?會(huì)被內(nèi)部解析為?ip?地址)
nodes.metaNode=DefaultDataCenter:,,
nodes.localDataCenter=DefaultDataCenter
nodes.localRegion=DefaultZone

0x05 總體邏輯

MetaServer 在啟動(dòng)時(shí),會(huì)啟動(dòng)三個(gè) Bolt Server,并且注冊(cè) Processor Handler,處理對(duì)應(yīng)的請(qǐng)求:

  • DataServer:處理 DataNode 相關(guān)的請(qǐng)求;
  • SessionServer:處理 SessionNode 相關(guān)的請(qǐng)求;
  • MetaServer:處理MetaNode相關(guān)的請(qǐng)求;

然后啟動(dòng) HttpServer, 用于處理 Admin 請(qǐng)求,提供推送開關(guān),集群數(shù)據(jù)查詢等 Http 接口。

最后啟動(dòng) Raft 服務(wù), 每個(gè)節(jié)點(diǎn)同時(shí)作為 RaftClient 和 RaftServer, 用于集群間的變更和數(shù)據(jù)同步。

5.1 程序主體

MetaServer 是一個(gè)SpringBootApplication,主要起作用的就是EnableMetaServer。

@EnableMetaServer
@SpringBootApplication
public?class?MetaApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(MetaApplication.class,?args);
????}
}

具體參見下圖

+-------------------+
|?@EnableMetaServer?|
|???????????????????|
|??MetaApplication??|
+-------------------+

EnableMetaServer注解引入了MetaServerConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MetaServerConfiguration.class)
public?@interface?EnableMetaServer?{
}

MetaServerConfiguration是各種配置,并且引入 MetaServerInitializerConfiguration負(fù)責(zé)啟動(dòng)。

@Configuration
@Import(MetaServerInitializerConfiguration.class)
@EnableConfigurationProperties
public?class?MetaServerConfiguration?{
}

所以我們可以知道:

  • MetaServerConfiguration :負(fù)責(zé)配置
  • MetaServerInitializerConfiguration :負(fù)責(zé)啟動(dòng)

于是程序總結(jié)結(jié)構(gòu)演化為下圖:

???????????????????????????????????(Init)
????????????????????????????+------------------------------------+
????????????????????????????|?MetaServerInitializerConfiguration?|
????????????????????????????+-------------+----------------------+
??????????????????????????????????????????^
+-------------------+?????????????????????|
|?@EnableMetaServer?|?????????????????????|
|???????????????????|?????????????????????|
|??MetaApplication??|?????????????????????|
+-------------+-----+?????????????????????|?(Configuration)
??????????????|?????????????????+---------+---------------+
??????????????+-------------->??|?MetaServerConfiguration?|
????????????????????????????????+-------------------------+

下面我們開始引入配置。

5.2 配置

MetaServer 模塊的各個(gè) bean 在 JavaConfig 中統(tǒng)一配置,JavaConfig 類為 MetaServerConfiguration。

5.2.1 配置分類

MetaServerConfiguration 具體有以下幾類配置:

  • Bootstrap,負(fù)責(zé)MetaServer啟動(dòng)配置,是核心啟動(dòng)類。
  • ServerConfig,負(fù)責(zé)MetaServer的配置項(xiàng),比如MetaServerConfig,NodeConfig,PropertySplitter。
  • ServerServiceConfiguration,負(fù)責(zé)服務(wù)相關(guān)的配置,比如 sessionNodeService,storeServiceFactory,sessionStoreService。
  • ServerRepositoryConfiguration,負(fù)責(zé)Repository相關(guān)的配置,比如dataRepositoryService,sessionRepositoryService等。
  • ServerRemotingConfiguration,負(fù)責(zé)網(wǎng)絡(luò)相關(guān)配置,比如BoltExchange,JerseyExchange,這里隨后會(huì)重點(diǎn)說明。
  • ResourceConfiguration,負(fù)責(zé)Resource相關(guān)配置,比如 jerseyResourceConfig,persistentDataResource。
  • ServerTaskConfiguration,負(fù)責(zé)各種 ?task 相關(guān)配置 ,比如dataNodeSingleTaskProcessor。
  • ExecutorConfiguation,ExecutorManager相關(guān)配置。
  • MetaDBConfiguration,DB相關(guān)配置。

具體縮略版代碼如下 :

@Configuration
@Import(MetaServerInitializerConfiguration.class)
@EnableConfigurationProperties
public?class?MetaServerConfiguration?{
????@Bean
????@ConditionalOnMissingBean
????public?MetaServerBootstrap?metaServerBootstrap()?{
????}

????@Configuration
????protected?static?class?MetaServerConfigBeanConfiguration?{
????}

????@Configuration
????public?static?class?MetaServerServiceConfiguration?{
????}

????@Configuration
????public?static?class?MetaServerRepositoryConfiguration?{
????}

????@Configuration
????public?static?class?MetaServerRemotingConfiguration?{
????}

????@Configuration
????public?static?class?ResourceConfiguration?{
????}

????@Configuration
????public?static?class?MetaServerTaskConfiguration?{
????}

????@Configuration
????public?static?class?ExecutorConfiguation?{
????}

????@Configuration
????public?static?class?MetaDBConfiguration?{
????}??
}

我們的圖進(jìn)化如下:

???????????????????????????????????(Init)
????????????????????????????+------------------------------------+
????????????????????????????|?MetaServerInitializerConfiguration?|
????????????????????????????+-------------+----------------------+??????+---------------------+
??????????????????????????????????????????^???????????????????????+-->??|?MetaServerBootstrap?|
+-------------------+?????????????????????|???????????????????????|?????+---------------------+
|?@EnableMetaServer?|?????????????????????|???????????????????????|?????+---------------------------------+
|???????????????????|?????????????????????|???????????????????????+-->??|MetaServerConfigBeanConfiguration|
|??MetaApplication??|?????????????????????|???????????????????????|?????+---------------------------------+
+--------------+----+?????????????????????|???????????????????????|?????+------------------------------+
???????????????|??????????????????????????|???????????????????????+-->??|MetaServerServiceConfiguration|
???????????????|??????????????????????????|???????????????????????|?????+------------------------------+
???????????????|??????????????????????????|???????????????????????|?????+---------------------------------+
???????????????|??????????????????????????|???????????????????????+-->??|MetaServerRepositoryConfiguration|
???????????????|??????????????????????????|???????????????????????|?????+---------------------------------+
???????????????|??????????????????????????|?(Configuration)???????|?????+-------------------------------+
???????????????|????????????????+---------+---------------+???????+-->??|MetaServerRemotingConfiguration|
???????????????+-------------->?|?MetaServerConfiguration?|?+-----+?????+-------------------------------+
????????????????????????????????+-------------------------+???????|?????+----------------------+
??????????????????????????????????????????????????????????????????+-->??|ResourceConfiguration?|
??????????????????????????????????????????????????????????????????|?????+----------------------+
??????????????????????????????????????????????????????????????????|?????+---------------------------+
??????????????????????????????????????????????????????????????????+-->??|MetaServerTaskConfiguration|
??????????????????????????????????????????????????????????????????|?????+---------------------------+
??????????????????????????????????????????????????????????????????|?????+---------------------+
??????????????????????????????????????????????????????????????????+-->??|ExecutorConfiguation?|
??????????????????????????????????????????????????????????????????|?????+---------------------+
??????????????????????????????????????????????????????????????????|?????+--------------------+
??????????????????????????????????????????????????????????????????+-->??|MetaDBConfiguration?|
????????????????????????????????????????????????????????????????????????+--------------------+

下圖為了手機(jī)閱讀

5.2.2 handler的配置

這里要特殊提一下handler的配置,因?yàn)檫@是后續(xù)分析的主體之一,是三個(gè) Bolt Server的handler。

@Configuration
public?static?class?MetaServerRemotingConfiguration?{

????@Bean
????public?Exchange?boltExchange()?{
????????return?new?BoltExchange();
????}

????@Bean
????public?Exchange?jerseyExchange()?{
????????return?new?JerseyExchange();
????}

????@Bean(name?=?"sessionServerHandlers")
????public?Collection?sessionServerHandlers()?{
????????Collection?list?=?new?ArrayList<>();
????????list.add(sessionConnectionHandler());
????????list.add(sessionNodeHandler());
????????list.add(renewNodesRequestHandler());
????????list.add(getNodesRequestHandler());
????????list.add(fetchProvideDataRequestHandler());return?list;
????}@Bean(name?=?"dataServerHandlers")public?Collection?dataServerHandlers()?{
????????Collection?list?=?new?ArrayList<>();
????????list.add(dataConnectionHandler());
????????list.add(getNodesRequestHandler());
????????list.add(dataNodeHandler());
????????list.add(renewNodesRequestHandler());
????????list.add(fetchProvideDataRequestHandler());return?list;
????}@Bean(name?=?"metaServerHandlers")public?Collection?metaServerHandlers()?{
????????Collection?list?=?new?ArrayList<>();
????????list.add(metaConnectionHandler());
????????list.add(getNodesRequestHandler());return?list;
????}
}

于是我們的總體架構(gòu)進(jìn)化具體見下圖

???????????????????????????????(Init)
????????????????????????+------------------------------------+
????????????????????????|?MetaServerInitializerConfiguration?|
????????????????????????+--------------+---------------------+
???????????????????????????????????????^
???????????????????????????????????????|
???????????????????????????????????????|
???????????????????????????????????????|
???????????????????????????????????????|
???????????????????????????????????????|?????????????????????????????+---------------------+
???????????????????????????????????????|???????????????????????+-->??|?MetaServerBootstrap?|
+-------------------+??????????????????|???????????????????????|?????+---------------------+
|?@EnableMetaServer?|??????????????????|???????????????????????|?????+---------------------------------+
|???????????????????|??????????????????|???????????????????????+-->??|MetaServerConfigBeanConfiguration|
|??MetaApplication??|??????????????????|???????????????????????|?????+---------------------------------+
+--------------+----+??????????????????|???????????????????????|?????+------------------------------+?????????????+-----------------------+
???????????????|???????????????????????|???????????????????????+-->??|MetaServerServiceConfiguration|??????+--->??|?sessionServerHandlers?|
???????????????|???????????????????????|???????????????????????|?????+------------------------------+??????|??????+-----------------------+
???????????????|???????????????????????|???????????????????????|?????+---------------------------------+???|??????+--------------------+
???????????????|???????????????????????|???????????????????????+-->??|MetaServerRepositoryConfiguration+------->??|?dataServerHandlers?|
???????????????|???????????????????????|???????????????????????|?????+---------------------------------+???|??????+--------------------+
???????????????|???????????????????????|?(Configuration)???????|?????+-------------------------------+?????|??????+--------------------+
???????????????|?????????????+---------+---------------+???????+-->??|MetaServerRemotingConfiguration|?????+--->??|?metaServerHandlers?|
???????????????+----------->?|?MetaServerConfiguration?|?+-----+?????+-------------------------------+????????????+--------------------+
?????????????????????????????+-------------------------+???????|?????+----------------------+
???????????????????????????????????????????????????????????????+-->??|ResourceConfiguration?|
???????????????????????????????????????????????????????????????|?????+----------------------+
???????????????????????????????????????????????????????????????|?????+---------------------------+
???????????????????????????????????????????????????????????????+-->??|MetaServerTaskConfiguration|
???????????????????????????????????????????????????????????????|?????+---------------------------+
???????????????????????????????????????????????????????????????|?????+---------------------+
???????????????????????????????????????????????????????????????+-->??|ExecutorConfiguation?|
???????????????????????????????????????????????????????????????|?????+---------------------+
???????????????????????????????????????????????????????????????|?????+--------------------+
???????????????????????????????????????????????????????????????+-->??|MetaDBConfiguration?|
?????????????????????????????????????????????????????????????????????+--------------------+

手機(jī)上閱讀如下:

關(guān)于handler配置,進(jìn)一步細(xì)化如下圖

???????????????????????????????(Init)

????????????????????????????????????????????????????????????????????????????????????????????????????????????????+-->??sessionConnectionHandler
????????????????????????????????????????????????????????????????????????????????????????????????????????????????|
????????????????????????????????????????????????????????????????????????????????????????????????????????????????|
????????????????????????????????????????????????????????????????????????????????????????????????????????????????+-->??sessionNodeHandler
?????????????????????????????????????????????????????????????????????????????????????+-----------------------+??|
??????????????????????????????????????????????????????????????????????????????+--->??|?sessionServerHandlers?+--+
????????????????????????????????????????+---------------------+???????????????|??????+-----------------------+??+-->??renewNodesRequestHandler
??????????????????????????????????+-->??|?MetaServerBootstrap?|???????????????|?????????????????????????????????|
??????????????????????????????????|?????+---------------------+???????????????|?????????????????????????????????|
??????????????????????????????????|?????+---------------------------------+???|?????????????????????????????????+-->??getNodesRequestHandler
??????????????????????????????????+-->??|MetaServerConfigBeanConfiguration|???|?????????????????????????????????|
??????????????????????????????????|?????+---------------------------------+???|?????????????????????????????????|
??????????????????????????????????|?????+------------------------------+??????|?????????????????????????????????+-->??fetchProvideDataRequestHandler
??????????????????????????????????+-->??|MetaServerServiceConfiguration|??????|
??????????????????????????????????|?????+------------------------------+??????|
??????????????????????????????????|?????+---------------------------------+???|?????????????????????????????????+-->??dataConnectionHandler
??????????????????????????????????+-->??|MetaServerRepositoryConfiguration+---+?????????????????????????????????|
??????????????????????????????????|?????+---------------------------------+???|?????????????????????????????????|
??????????????????????????????????|?????+-------------------------------+?????|??????+--------------------+?????+-->??getNodesRequestHandler
+-------------------------+???????+-->??|MetaServerRemotingConfiguration|?????+--->??|?dataServerHandlers?+-----+
|?MetaServerConfiguration?|?+-----+?????+-------------------------------+?????|??????+--------------------+?????|
+-------------------------+???????|?????+----------------------+??????????????|?????????????????????????????????+-->??dataNodeHandler
??????????????????????????????????+-->??|ResourceConfiguration?|??????????????|?????????????????????????????????|
??????????????????????????????????|?????+----------------------+??????????????|?????????????????????????????????|
??????????????????????????????????|?????+---------------------------+?????????|?????????????????????????????????+-->??renewNodesRequestHandler
??????????????????????????????????+-->??|MetaServerTaskConfiguration|?????????|?????????????????????????????????|
??????????????????????????????????|?????+---------------------------+?????????|?????????????????????????????????|
??????????????????????????????????|?????+---------------------+???????????????|?????????????????????????????????+-->??fetchProvideDataRequestHandler
??????????????????????????????????+-->??|ExecutorConfiguation?|???????????????|
??????????????????????????????????|?????+---------------------+???????????????|
??????????????????????????????????|?????+--------------------+????????????????|
??????????????????????????????????+-->??|MetaDBConfiguration?|????????????????|?????????????????????????????????+--->?metaConnectionHandler
????????????????????????????????????????+--------------------+????????????????|??????+--------------------+?????|
??????????????????????????????????????????????????????????????????????????????+---->?|?metaServerHandlers?+-----+
?????????????????????????????????????????????????????????????????????????????????????+--------------------+?????+--->?getNodesRequestHandler

手機(jī)上如圖

這個(gè)就對(duì)應(yīng)了參考中的圖例:

MetaServer 在啟動(dòng)時(shí),會(huì)啟動(dòng)三個(gè) Bolt Server,并且注冊(cè) Processor Handler,處理對(duì)應(yīng)的請(qǐng)求:

meta-server
  • DataServer:處理 DataNode 相關(guān)的請(qǐng)求;
  • SessionServer:處理 SessionNode 相關(guān)的請(qǐng)求;
  • MetaServer:處理MetaNode相關(guān)的請(qǐng)求;

0x06 啟動(dòng)

系統(tǒng)是通過對(duì)MetaServerBootstrap的控制來完成了啟動(dòng)。

MetaServer 模塊的各個(gè) bean 在 JavaConfig 中統(tǒng)一配置,JavaConfig 類為 MetaServerConfiguration。

啟動(dòng)入口類為 MetaServerInitializerConfiguration,該類不由 JavaConfig 管理配置,而是繼承了 SmartLifecycle 接口,在啟動(dòng)時(shí)由 Spring 框架調(diào)用其 start 方法。

public?class?MetaServerInitializerConfiguration?implements?SmartLifecycle?{
????@Autowired
????private?MetaServerBootstrap?metaServerBootstrap;

????@Override
????public?void?start()?{
?????metaServerBootstrap.start();
???MetaServerInitializerConfiguration.this.running.set(true);
????}

????@Override
????public?void?stop()?{
????????this.running.set(false);
????????metaServerBootstrap.destroy();
????}
}

具體見下圖,因?yàn)?metaServerBootstrap 是通過配置生成,所以init過程指向配置部分。

???????????????????????????????(Init)
????????????????????????+------------------------------------+??start,stop
????????????????????????|?MetaServerInitializerConfiguration?+----------------+
????????????????????????+--------------+---------------------+????????????????|
???????????????????????????????????????^??????????????????????????????????????|
???????????????????????????????????????|??????????????????????????????????????|
???????????????????????????????????????|??????????????????????????????????????|
???????????????????????????????????????|??????????????????????????????????????|
???????????????????????????????????????|??????????????????????????????????????v
???????????????????????????????????????|?????????????????????????????+---------------------+
???????????????????????????????????????|???????????????????????+-->??|?MetaServerBootstrap?|
+-------------------+??????????????????|???????????????????????|?????+---------------------+
|?@EnableMetaServer?|??????????????????|???????????????????????|?????+---------------------------------+
|???????????????????|??????????????????|???????????????????????+-->??|MetaServerConfigBeanConfiguration|
|??MetaApplication??|??????????????????|???????????????????????|?????+---------------------------------+
+--------------+----+??????????????????|???????????????????????|?????+------------------------------+?????????????+-----------------------+
???????????????|???????????????????????|???????????????????????+-->??|MetaServerServiceConfiguration|??????+--->??|?sessionServerHandlers?|
???????????????|???????????????????????|???????????????????????|?????+------------------------------+??????|??????+-----------------------+
???????????????|???????????????????????|???????????????????????|?????+---------------------------------+???|??????+--------------------+
???????????????|???????????????????????|???????????????????????+-->??|MetaServerRepositoryConfiguration+------->??|?dataServerHandlers?|
???????????????|???????????????????????|???????????????????????|?????+---------------------------------+???|??????+--------------------+
???????????????|???????????????????????|?(Configuration)???????|?????+-------------------------------+?????|??????+--------------------+
???????????????|?????????????+---------+---------------+???????+-->??|MetaServerRemotingConfiguration|?????+--->??|?metaServerHandlers?|
???????????????+----------->?|?MetaServerConfiguration?|?+-----+?????+-------------------------------+????????????+--------------------+
?????????????????????????????+-------------------------+???????|?????+----------------------+
???????????????????????????????????????????????????????????????+-->??|ResourceConfiguration?|
???????????????????????????????????????????????????????????????|?????+----------------------+
???????????????????????????????????????????????????????????????|?????+---------------------------+
???????????????????????????????????????????????????????????????+-->??|MetaServerTaskConfiguration|
???????????????????????????????????????????????????????????????|?????+---------------------------+
???????????????????????????????????????????????????????????????|?????+---------------------+
???????????????????????????????????????????????????????????????+-->??|ExecutorConfiguation?|
???????????????????????????????????????????????????????????????|?????+---------------------+
???????????????????????????????????????????????????????????????|?????+--------------------+
???????????????????????????????????????????????????????????????+-->??|MetaDBConfiguration?|
?????????????????????????????????????????????????????????????????????+--------------------+

手機(jī)上如下

6.1 架構(gòu)

MetaServerBootstrap是核心啟動(dòng)類,該類主要包含了三類組件:外部節(jié)點(diǎn)通信組件、Raft 服務(wù)通信組件、定時(shí)器組件。

  • 外部節(jié)點(diǎn)通信組件:在該類中有幾個(gè) Server 通信對(duì)象,用于和其它外部節(jié)點(diǎn)進(jìn)行通信。其中 httpServer 主要提供一系列 http 接口,用于 dashboard 管理、數(shù)據(jù)查詢等;sessionServer 主要是處理一些session相關(guān)的服務(wù);dataServer 則負(fù)責(zé)數(shù)據(jù)相關(guān)服務(wù);metaServer 負(fù)責(zé)meta server的注冊(cè);

  • Raft 服務(wù) :用于集群間的變更和數(shù)據(jù)同步,raftExchanger 就起到這個(gè)作用;

  • 定時(shí)器組件:例如定時(shí)檢測(cè)節(jié)點(diǎn)信息、定時(shí)檢測(cè)數(shù)據(jù)版本信息;具體可見 ExecutorManager,這是一個(gè)啟動(dòng)各種管理線程的地方。他的啟動(dòng)設(shè)置是在 MetaServerBootstrap.initRaft ?之中 。

6.2 類定義

MetaServerBootstrap的定義如下:

public?class?MetaServerBootstrap?{
????@Autowired
????private?MetaServerConfig??????????????????metaServerConfig;

????@Autowired
????private?Exchange??????????????????????????boltExchange;

????@Autowired
????private?Exchange??????????????????????????jerseyExchange;

????@Autowired
????private?ExecutorManager???????????????????executorManager;

????@Resource(name?=?"sessionServerHandlers")
????private?Collection?sessionServerHandlers;@Resource(name?=?"dataServerHandlers")private?Collection?dataServerHandlers;@Resource(name?=?"metaServerHandlers")private?Collection?metaServerHandlers;@Autowiredprivate?ResourceConfig????????????????????jerseyResourceConfig;@Autowiredprivate?ApplicationContext????????????????applicationContext;@Autowiredprivate?RaftExchanger?????????????????????raftExchanger;private?Server????????????????????????????sessionServer;private?Server????????????????????????????dataServer;private?Server????????????????????????????metaServer;private?Server????????????????????????????httpServer;
}

可以參見下圖

?????????????????????????????????????????????????????????????????????????????????????????+-----------------+
?????????????????????????????????????????????????????????????????????????????????+---->??|?metaServerConfig|
?????????????????????????????????????????????????????????????????????????????????|???????+-----------------+
?????????????????????????????????????????????????????????????????????????????????|???????+--------------+
?????????????????????????????????????????????????????????????????????????????????+---->??|?boltExchange?|
?????????????????????????????????????????????????????????????????????????????????|???????+--------------+
?????????????????????????????????????????????????????????????????????????????????|???????+--------------+
?????????????????????????????????????????????????????????????????????????????????+---->??|jerseyExchange|
?????????????????????????????????????????????????????????????????????????????????|???????+--------------+
?????????????????????????????????????????????????????????????????????????????????|???????+---------------+
?????????????????????????????????????????????????????????????????????????????????+---->??|executorManager|
?????????????????????????????????????????????????????????????????????????????????|???????+---------------+
?????????????????????????????????????????????????????????????????????????????????|???????+---------------------+
?????????????????????????????????????????????????????????????????????????????????+---->??|sessionServerHandlers|
?????????????????????????????????????????????????????????????????????????????????|???????+---------------------+
?????????????????????????????????????????????????????????????????????????????????|???????+-----------------+
?????????????????????????????????????????????????????????????????????????????????+---->??|dataServerHandler|
???????(Init)????????????????????????????????????????????????????????????????????|???????+-----------------+
+------------------------------------+??start,stop???+---------------------+?????|???????+------------------+
|?MetaServerInitializerConfiguration?+------------->?|?MetaServerBootstrap?|?+-------->??|metaServerHandlers|
+------------------------------------+???????????????+---------------------+?????|???????+------------------+
?????????????????????????????????????????????????????????????????????????????????|???????+-------------+
?????????????????????????????????????????????????????????????????????????????????+---->??|raftExchanger|
?????????????????????????????????????????????????????????????????????????????????|???????+-------------+
?????????????????????????????????????????????????????????????????????????????????|???????+-------------+
?????????????????????????????????????????????????????????????????????????????????+---->??|sessionServer|
?????????????????????????????????????????????????????????????????????????????????|???????+-------------+
?????????????????????????????????????????????????????????????????????????????????|???????+-----------+
?????????????????????????????????????????????????????????????????????????????????+---->??|dataServer?|
?????????????????????????????????????????????????????????????????????????????????|???????+-----------+
?????????????????????????????????????????????????????????????????????????????????|???????+-----------+
?????????????????????????????????????????????????????????????????????????????????+---->??|metaServer?|
?????????????????????????????????????????????????????????????????????????????????|???????+-----------+
?????????????????????????????????????????????????????????????????????????????????|???????+----------+
?????????????????????????????????????????????????????????????????????????????????+---->??|httpServer|
?????????????????????????????????????????????????????????????????????????????????|???????+----------+
?????????????????????????????????????????????????????????????????????????????????|???????+---------------------+
?????????????????????????????????????????????????????????????????????????????????+---->??|jerseyResourceConfig?|
?????????????????????????????????????????????????????????????????????????????????|???????+---------------------+
?????????????????????????????????????????????????????????????????????????????????|???????+-------------------+
?????????????????????????????????????????????????????????????????????????????????+---->??|applicationContext?|
?????????????????????????????????????????????????????????????????????????????????????????+-------------------+

手機(jī)參見下圖

6.3 通信 Exchange

因?yàn)榍懊娲a中有

@Autowired
private?Exchange??????????????????????????boltExchange;

@Autowired
private?Exchange??????????????????????????jerseyExchange;

這里要特殊說明下Exchange。

Exchange 作為 Client / Server 連接的抽象,負(fù)責(zé)節(jié)點(diǎn)之間的連接。在建立連接中,可以設(shè)置一系列應(yīng)對(duì)不同任務(wù)的 handler (稱之為 ChannelHandler),這些 ChannelHandler 有的作為 Listener 用來處理連接事件,有的作為 Processor 用來處理各種指定的事件,比如服務(wù)信息數(shù)據(jù)變化、Subscriber 注冊(cè)等事件。

圖4 - 每一層各司其職,協(xié)同實(shí)現(xiàn)節(jié)點(diǎn)通信

圖 - 每一層各司其職,協(xié)同實(shí)現(xiàn)節(jié)點(diǎn)通信

各種節(jié)點(diǎn)在啟動(dòng)的時(shí)候,利用 Exchange 設(shè)置了一系列 ChannelHandler,比如:

private?void?openDataRegisterServer()?{
????try?{
????????if?(dataStart.compareAndSet(false,?true))?{
????????????dataServer?=?boltExchange.open(new?URL(NetUtil.getLocalAddress().getHostAddress(),
????????????????metaServerConfig.getDataServerPort()),?dataServerHandlers
????????????????.toArray(new?ChannelHandler[dataServerHandlers.size()]));
????????}
????}?
}

6.4 啟動(dòng)入口

前面已經(jīng)提到,啟動(dòng)入口類為 MetaServerInitializerConfiguration,該類不由 JavaConfig 管理配置,而是繼承了 SmartLifecycle 接口,在啟動(dòng)時(shí)由 Spring 框架調(diào)用其 start 方法。

該方法中調(diào)用了 MetaServerBootstrap # start 方法,用于啟動(dòng)一系列的初始化服務(wù)。

import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.context.SmartLifecycle;

public?class?MetaServerInitializerConfiguration?implements?SmartLifecycle?{
????@Autowired
????private?MetaServerBootstrap?metaServerBootstrap;‘
??????
????@Override
????public?void?start()?{
????????????metaServerBootstrap.start();
????????????MetaServerInitializerConfiguration.this.running.set(true);
????}
}??

6.4.1 啟動(dòng)服務(wù)Server

前面提到,MetaServerBootstrap 在啟動(dòng)時(shí),會(huì)啟動(dòng)三個(gè) Bolt Server,并且注冊(cè) Processor Handler,處理對(duì)應(yīng)的請(qǐng)求:

  • DataServer:處理 DataNode 相關(guān)的請(qǐng)求;
  • SessionServer:處理 SessionNode 相關(guān)的請(qǐng)求;
  • MetaServer:處理MetaNode相關(guān)的請(qǐng)求;

然后啟動(dòng) HttpServer, 用于處理 Admin 請(qǐng)求,提供推送開關(guān),集群數(shù)據(jù)查詢等 Http 接口。

最后啟動(dòng) Raft 服務(wù), 每個(gè)節(jié)點(diǎn)同時(shí)作為 RaftClient 和 RaftServer, 用于集群間的變更和數(shù)據(jù)同步。為支持高可用特性,對(duì)于 MetaServer 來說,存儲(chǔ)了 SOFARegistry 的元數(shù)據(jù),為了保障 MetaServer 集群的一致性,其采用了 Raft 協(xié)議來進(jìn)行選舉和復(fù)制。

具體代碼參見:

public?void?start()?{
????????openSessionRegisterServer();
????????openDataRegisterServer();
????????openMetaRegisterServer();
????????openHttpServer();
????????initRaft();
}

private?void?openHttpServer()?{
????????if?(httpStart.compareAndSet(false,?true))?{
????????????bindResourceConfig();
????????????httpServer?=?jerseyExchange.open(
????????????????new?URL(NetUtil.getLocalAddress().getHostAddress(),?metaServerConfig
????????????????????.getHttpServerPort()),?new?ResourceConfig[]?{?jerseyResourceConfig?});
????????}
}

private?void?initRaft()?{
????raftExchanger.startRaftServer(executorManager);
????raftExchanger.startRaftClient();
????raftExchanger.startCliService();
}

6.4.1.1 BoltServer

Raft 和 Bolt 是SOFA所特殊實(shí)現(xiàn),所以我們暫不介紹其底層機(jī)制,以后有機(jī)會(huì)單獨(dú)開篇,下面提一下三個(gè)BoltServer。

private?void?openSessionRegisterServer()?{
????????if?(sessionStart.compareAndSet(false,?true))?{
????????????sessionServer?=?boltExchange
????????????????.open(
????????????????????new?URL(NetUtil.getLocalAddress().getHostAddress(),?metaServerConfig
????????????????????????.getSessionServerPort()),?sessionServerHandlers
????????????????????????.toArray(new?ChannelHandler[sessionServerHandlers.size()]));

????????}
}

private?void?openDataRegisterServer()?{
????????if?(dataStart.compareAndSet(false,?true))?{
????????????dataServer?=?boltExchange.open(new?URL(NetUtil.getLocalAddress().getHostAddress(),
????????????????metaServerConfig.getDataServerPort()),?dataServerHandlers
????????????????.toArray(new?ChannelHandler[dataServerHandlers.size()]));
????????}
}

private?void?openMetaRegisterServer()?{
????????if?(metaStart.compareAndSet(false,?true))?{
????????????metaServer?=?boltExchange.open(new?URL(NetUtil.getLocalAddress().getHostAddress(),
????????????????metaServerConfig.getMetaServerPort()),?metaServerHandlers
????????????????.toArray(new?ChannelHandler[metaServerHandlers.size()]));
????????}
}

這幾個(gè)Server的handler就是我們前面配置的

@Resource(name?=?"sessionServerHandlers")
private?Collection?sessionServerHandlers;@Resource(name?=?"dataServerHandlers")private?Collection?dataServerHandlers;@Resource(name?=?"metaServerHandlers")private?Collection?metaServerHandlers;

具體參見下圖:

????????????????????????????????????????????????????????????????????????????????????????????????????????+------------------------+
????????????????????????????????????+-----------------+???????????????????????????????????????????+--->?|sessionConnectionHandler|
????????????????????????????+---->??|?metaServerConfig|???????????????????????????????????????????|?????+------------------------+
????????????????????????????|???????+-----------------+???????????????????????????????????????????|?????+-------------------+
????????????????????????????|???????+--------------+??????????????????????????????????????????????+--->?|sessionNodeHandler?|
????????????????????????????+---->??|?boltExchange?|??????????????????????????????????????????+-->+?????+-------------------+
????????????????????????????|???????+--------------+??????????????????????????????????????????|???|?????+------------------------+
????????????????????????????|???????+--------------+??????????????????????????????????????????|???+--->?|renewNodesRequestHandler|
????????????????????????????+---->??|jerseyExchange|??????????????????????????????????????????|???|?????+------------------------+
????????????????????????????|???????+--------------+??????????????????????????????????????????|???|?????+----------------------+
????????????????????????????|???????+---------------+?????????????????????????????????????????|???+--->?|getNodesRequestHandler|
????????????????????????????+---->??|executorManager|?????????????????????????????????????????|???|?????+----------------------+
????????????????????????????|???????+---------------+???????????????+---------------------+???|???|?????+------------------------------+
????????????????????????????+------------------------------------->?|sessionServerHandlers+---+???+--->?|fetchProvideDataRequestHandler|
????????????????????????????|???????+-------------+?????????????????+---------------------+?????????????+------------------------------+
????????????????????????????+---->??|sessionServer|?+------------------^
????????????????????????????|???????+-------------+?????????????????????????????????????????????????????+---------------------+
????????????????????????????|?????????????????????????????????????????????????????????????????????---->?|dataConnectionHandler|
????????????????????????????|???????????????????????????????????????+------------------+??????????|?????+---------------------+
+---------------------+?????+------------------------------------->?|dataServerHandlers+----------+?????+----------------------+
|?MetaServerBootstrap?|?+---+???????+-----------+???????????????????+------------------+??????????+--->?|getNodesRequestHandler|
+---------------------+?????+---->??|dataServer?+----------------------^??????????????????????????|?????+----------------------+
????????????????????????????|???????+-----------+?????????????????????????????????????????????????|?????+---------------+
????????????????????????????|?????????????????????????????????????????????????????????????????????+--->?|dataNodeHandler|
????????????????????????????|???????????????????????????????????????+------------------+??????????|?????+---------------+
????????????????????????????+------------------------------------>??|metaServerHandlers+------+???|?????+------------------------+
????????????????????????????|???????+-----------+???????????????????+------------------+??????|???+--->?|renewNodesRequestHandler|
????????????????????????????+---->??|metaServer?+----------------------^??????????????????????|???|?????+------------------------+
????????????????????????????|???????+-----------+?????????????????????????????????????????????|???|?????+------------------------------+
????????????????????????????|?????????????????????????????????????????????????????????????????|???+--->?|fetchProvideDataRequestHandler|
????????????????????????????|???????+-------------+???????????????????????????????????????????|?????????+------------------------------+
????????????????????????????+---->??|raftExchanger|???????????????????????????????????????????|
????????????????????????????|???????+-------------+???????????????????????????????????????????|
????????????????????????????|?????????????????????????????????????????????????????????????????|
????????????????????????????|???????+----------+??????????????????????????????????????????????|
????????????????????????????+---->??|httpServer|??????????????????????????????????????????????|??????????+---------------------+
????????????????????????????|???????+----------+??????????????????????????????????????????????|????+-->??|metaConnectionHandler|
????????????????????????????|???????+---------------------+???????????????????????????????????+---->?????+---------------------+
????????????????????????????+---->??|jerseyResourceConfig?|????????????????????????????????????????|?????+---------------------+
????????????????????????????|???????+---------------------+????????????????????????????????????????+-->??|getNodesRequestHandle|
????????????????????????????|???????+-------------------+????????????????????????????????????????????????+---------------------+
????????????????????????????+---->??|applicationContext?|
????????????????????????????????????+-------------------+

手機(jī)上

在初始化時(shí)候,大致堆棧如下 ?:

interest:55,?RenewNodesRequestHandler?(com.alipay.sofa.registry.server.meta.remoting.handler)
interest:61,?SyncUserProcessorAdapter?(com.alipay.sofa.registry.remoting.bolt)
registerUserProcessor:42,?UserProcessorRegisterHelper?(com.alipay.remoting.rpc.protocol)
registerUserProcessor:376,?RpcServer?(com.alipay.remoting.rpc)
registerUserProcessorHandler:159,?BoltServer?(com.alipay.sofa.registry.remoting.bolt)
initHandler:139,?BoltServer?(com.alipay.sofa.registry.remoting.bolt)
startServer:92,?BoltServer?(com.alipay.sofa.registry.remoting.bolt)
open:65,?BoltExchange?(com.alipay.sofa.registry.remoting.bolt.exchange)
open:36,?BoltExchange?(com.alipay.sofa.registry.remoting.bolt.exchange)
openSessionRegisterServer:149,?MetaServerBootstrap?(com.alipay.sofa.registry.server.meta.bootstrap)
start:108,?MetaServerBootstrap?(com.alipay.sofa.registry.server.meta.bootstrap)
start:51,?MetaServerInitializerConfiguration?(com.alipay.sofa.registry.server.meta.bootstrap)

以SessionServer為例,在構(gòu)建過程中,調(diào)用到 ?BoltExchange . open。

private?void?openSessionRegisterServer()?{
????????if?(sessionStart.compareAndSet(false,?true))?{
????????????sessionServer?=?boltExchange
????????????????.open(
????????????????????new?URL(NetUtil.getLocalAddress().getHostAddress(),?metaServerConfig
????????????????????????.getSessionServerPort()),?sessionServerHandlers
????????????????????????.toArray(new?ChannelHandler[sessionServerHandlers.size()]));
????????}???
}

BoltExchange中有

@Override
public?Server?open(URL?url,?ChannelHandler...?channelHandlers)?{
????BoltServer?server?=?createBoltServer(url,?channelHandlers);
????setServer(server,?url);
????server.startServer();
????return?server;
}

BoltServer中有

public?void?startServer()?{
????if?(isStarted.compareAndSet(false,?true))?{
????????????boltServer?=?new?RpcServer(url.getPort(),?true);
????????????initHandler();
????????????boltServer.start();
????}?
}

private?void?initHandler()?{
????????if?(initHandler.compareAndSet(false,?true))?{
????????????boltServer.addConnectionEventProcessor(ConnectionEventType.CONNECT,
????????????????new?ConnectionEventAdapter(ConnectionEventType.CONNECT,
????????????????????getConnectionEventHandler(),?this));
????????????boltServer.addConnectionEventProcessor(ConnectionEventType.CLOSE,
????????????????new?ConnectionEventAdapter(ConnectionEventType.CLOSE,?getConnectionEventHandler(),
????????????????????this));
????????????boltServer.addConnectionEventProcessor(ConnectionEventType.EXCEPTION,
????????????????new?ConnectionEventAdapter(ConnectionEventType.EXCEPTION,
????????????????????getConnectionEventHandler(),?this));

????????????registerUserProcessorHandler();
????????}
}

最后調(diào)用,會(huì)設(shè)定同步和異步的handler。

private?void?registerUserProcessorHandler()?{
????if?(channelHandlers?!=?null)?{
????????for?(ChannelHandler?channelHandler?:?channelHandlers)?{
????????????if?(HandlerType.PROCESSER.equals(channelHandler.getType()))?{
????????????????if?(InvokeType.SYNC.equals(channelHandler.getInvokeType()))?{
????????????????????boltServer.registerUserProcessor(new?SyncUserProcessorAdapter(
????????????????????????channelHandler));
????????????????}?else?{
????????????????????boltServer.registerUserProcessor(new?AsyncUserProcessorAdapter(
????????????????????????channelHandler));
????????????????}
????????????}
????????}
????}
}

6.4.1.2 HttpServer

以使用 Jetty 的 openHttpServer 為例

啟動(dòng) HttpServer, 用于處理 Admin 請(qǐng)求,提供推送開關(guān),集群數(shù)據(jù)查詢等 Http 接口。

public?class?JerseyJettyServer?implements?Server?{
????public?static?org.eclipse.jetty.server.Server?createServer(final?URI?uri,final?ResourceConfig?resourceConfig,final?boolean?start)?{

????????JettyHttpContainer?handler?=?ContainerFactory.createContainer(JettyHttpContainer.class,
????????????resourceConfig);

????????int?defaultPort?=?Container.DEFAULT_HTTP_PORT;
????????final?int?port?=?(uri.getPort()?==?-1)???defaultPort?:?uri.getPort();

????????final?org.eclipse.jetty.server.Server?server?=?new?org.eclipse.jetty.server.Server(
????????????new?JettyConnectorThreadPool());

????????final?ServerConnector?http?=?new?ServerConnector(server,?new?HttpConnectionCustomFactory());
????????http.setPort(port);
????????server.setConnectors(new?Connector[]?{?http?});

????????if?(handler?!=?null)?{
????????????server.setHandler(handler);
????????}

????????if?(start)?{
????????????try?{
????????????????//?Start?the?server.
????????????????server.start();
????????????}?
????????}
????????return?server;
????}??
}

其堆棧如下:

:72,?JerseyJettyServer?(com.alipay.sofa.registry.remoting.jersey)
open:73,?JerseyExchange?(com.alipay.sofa.registry.remoting.jersey.exchange)
open:40,?JerseyExchange?(com.alipay.sofa.registry.remoting.jersey.exchange)
openHttpServer:205,?MetaServerBootstrap?(com.alipay.sofa.registry.server.meta.bootstrap)
start:114,?MetaServerBootstrap?(com.alipay.sofa.registry.server.meta.bootstrap)
start:51,?MetaServerInitializerConfiguration?(com.alipay.sofa.registry.server.meta.bootstrap)
doStart:173,?DefaultLifecycleProcessor?(org.springframework.context.support)
access$200:50,?DefaultLifecycleProcessor?(org.springframework.context.support)
start:350,?DefaultLifecycleProcessor$LifecycleGroup?(org.springframework.context.support)
startBeans:149,?DefaultLifecycleProcessor?(org.springframework.context.support)
onRefresh:112,?DefaultLifecycleProcessor?(org.springframework.context.support)
finishRefresh:880,?AbstractApplicationContext?(org.springframework.context.support)
refresh:546,?AbstractApplicationContext?(org.springframework.context.support)
refresh:693,?SpringApplication?(org.springframework.boot)
refreshContext:360,?SpringApplication?(org.springframework.boot)
run:303,?SpringApplication?(org.springframework.boot)
run:1118,?SpringApplication?(org.springframework.boot)
run:1107,?SpringApplication?(org.springframework.boot)
main:42,?MetaApplication?(com.alipay.sofa.registry.server.meta)

6.4.1.3 @RaftService

如下存儲(chǔ)由Raft來保證數(shù)據(jù)一致性,后文針對(duì)此有詳細(xì)講解。

@RaftService(uniqueId?=?"sessionServer")
public?class?SessionVersionRepositoryService?
@RaftService(uniqueId?=?"metaServer")
public?class?MetaRepositoryService??
@RaftService(uniqueId?=?"dataServer")
public?class?DataRepositoryService??
@RaftService(uniqueId?=?"sessionServer")
public?class?SessionRepositoryService???
@RaftService(uniqueId?=?"dataServer")
public?class?DataConfirmStatusService???
@RaftService(uniqueId?=?"sessionServer")
public?class?SessionConfirmStatusService??

6.4.2 ExecutorManager

是一個(gè)啟動(dòng)各種管理線程的地方,都是定期常規(guī)管理任務(wù)。

public?class?ExecutorManager?{

????private?ScheduledExecutorService?scheduler;

????private?ThreadPoolExecutor???????heartbeatCheckExecutor;
????private?ThreadPoolExecutor???????checkDataChangeExecutor;
????private?ThreadPoolExecutor???????getOtherDataCenterChangeExecutor;
????private?ThreadPoolExecutor???????connectMetaServerExecutor;
????private?ThreadPoolExecutor???????checkNodeListChangePushExecutor;
????private?ThreadPoolExecutor???????raftClientRefreshExecutor;

????private?MetaServerConfig?????????metaServerConfig;

????@Autowired
????private?Registry?????????????????metaServerRegistry;

????@Autowired
????private?MetaClientExchanger??????metaClientExchanger;

????@Autowired
????private?RaftExchanger????????????raftExchanger;
??
???public?void?startScheduler()?{

????????init();

????????scheduler.schedule(new?TimedSupervisorTask("HeartbeatCheck",?scheduler,?heartbeatCheckExecutor,
????????????????????????metaServerConfig.getSchedulerHeartbeatTimeout(),?TimeUnit.SECONDS,
????????????????????????metaServerConfig.getSchedulerHeartbeatExpBackOffBound(),?()?->?metaServerRegistry.evict()),
????????????????metaServerConfig.getSchedulerHeartbeatFirstDelay(),?TimeUnit.SECONDS);

????????scheduler.schedule(
????????????????new?TimedSupervisorTask("GetOtherDataCenterChange",?scheduler,?getOtherDataCenterChangeExecutor,
????????????????????????metaServerConfig.getSchedulerGetDataChangeTimeout(),?TimeUnit.SECONDS,
????????????????????????metaServerConfig.getSchedulerGetDataChangeExpBackOffBound(),?()?->?{
????????????????????metaServerRegistry.getOtherDataCenterNodeAndUpdate(NodeType.DATA);
????????????????????metaServerRegistry.getOtherDataCenterNodeAndUpdate(NodeType.META);
????????????????}),?metaServerConfig.getSchedulerGetDataChangeFirstDelay(),?TimeUnit.SECONDS);

????????scheduler.schedule(new?TimedSupervisorTask("ConnectMetaServer",?scheduler,?connectMetaServerExecutor,
????????????????????????metaServerConfig.getSchedulerConnectMetaServerTimeout(),?TimeUnit.SECONDS,
????????????????????????metaServerConfig.getSchedulerConnectMetaServerExpBackOffBound(),
????????????????????????()?->?metaClientExchanger.connectServer()),?metaServerConfig.getSchedulerConnectMetaServerFirstDelay(),
????????????????TimeUnit.SECONDS);

????????scheduler.schedule(
????????????????new?TimedSupervisorTask("CheckSessionNodeListChangePush",?scheduler,?checkNodeListChangePushExecutor,
????????????????????????metaServerConfig.getSchedulerCheckNodeListChangePushTimeout(),?TimeUnit.SECONDS,
????????????????????????metaServerConfig.getSchedulerCheckNodeListChangePushExpBackOffBound(),
????????????????????????()?->?metaServerRegistry.pushNodeListChange(NodeType.SESSION)),
????????????????metaServerConfig.getSchedulerCheckNodeListChangePushFirstDelay(),?TimeUnit.SECONDS);

????????scheduler.schedule(
????????????????new?TimedSupervisorTask("CheckDataNodeListChangePush",?scheduler,?checkNodeListChangePushExecutor,
????????????????????????metaServerConfig.getSchedulerCheckNodeListChangePushTimeout(),?TimeUnit.SECONDS,
????????????????????????metaServerConfig.getSchedulerCheckNodeListChangePushExpBackOffBound(),
????????????????????????()?->?metaServerRegistry.pushNodeListChange(NodeType.DATA)),
????????????????metaServerConfig.getSchedulerCheckNodeListChangePushFirstDelay(),?TimeUnit.SECONDS);

????????scheduler.schedule(new?TimedSupervisorTask("RaftClientRefresh",?scheduler,?raftClientRefreshExecutor,
????????????????????????metaServerConfig.getSchedulerCheckNodeListChangePushTimeout(),?TimeUnit.SECONDS,
????????????????????????metaServerConfig.getSchedulerCheckNodeListChangePushExpBackOffBound(),
????????????????????????()?->?raftExchanger.refreshRaftClient()),
????????????????metaServerConfig.getSchedulerCheckNodeListChangePushFirstDelay(),?TimeUnit.SECONDS);

????}??
}

6.4.2.1 啟動(dòng)

ExecutorManager 的啟動(dòng)設(shè)置是在 MetaServerBootstrap.initRaft 之中,分別啟動(dòng)RaftServer,RaftClient,CliService。

private?void?initRaft()?{
????raftExchanger.startRaftServer(executorManager);
????raftExchanger.startRaftClient();
????raftExchanger.startCliService();
}

當(dāng) ?Raft 選出 ?Leader 之后,會(huì)調(diào)用到 ? ExecutorManager # startScheduler。

  • 首先生成各個(gè)ThreadPoolExecutor;
  • 然后運(yùn)行本身的 各個(gè)TimedSupervisorTask,其會(huì)調(diào)用不同的handler,比如 ?connectServer,getSchedulerHeartbeatFirstDelay ?等等;

6.4.2.2 TimedSupervisorTask

TimedSupervisorTask 實(shí)現(xiàn)了 TimerTask。

public?class?TimedSupervisorTask?extends?TimerTask?{
????private?final?ScheduledExecutorService?scheduler;
????private?final?ThreadPoolExecutor???????executor;
????private?final?long?????????????????????timeoutMillis;
????private?final?Runnable?????????????????task;
????private?String?????????????????????????name;
????private?final?AtomicLong???????????????delay;
????private?final?long?????????????????????maxDelay;

????@Override
????public?void?run()?{
????????Future?future?=?null;
????????try?{
????????????future?=?executor.submit(task);
????????????//?block?until?done?or?timeout
????????????future.get(timeoutMillis,?TimeUnit.MILLISECONDS);
????????????delay.set(timeoutMillis);
????????}?catch?{
??????.....
????????}?finally?{
????????????if?(future?!=?null)?{
????????????????future.cancel(true);
????????????}
????????????scheduler.schedule(this,?delay.get(),?TimeUnit.MILLISECONDS);
????????}
????}
}

6.4.2.3 管理任務(wù)

可以看到管理任務(wù)大致有:

  • HeartbeatCheck :心跳檢測(cè);
  • GetOtherDataCenterChange :查看其他數(shù)據(jù)中心的變化;
  • ConnectMetaServer :與其他的MetaServer交互;
  • CheckSessionNodeListChangePush :看看Session節(jié)點(diǎn)的變化;
  • CheckDataNodeListChangePush :查看數(shù)據(jù)節(jié)點(diǎn)變化;
  • RaftClientRefresh :看看Raft 服務(wù)消息;

TimedSupervisorTask 會(huì)定期執(zhí)行,比如 ?CheckDataNodeListChangePush ?這個(gè)線程會(huì)定期執(zhí)行 ?metaServerRegistry.pushNodeListChange(NodeType.DATA)) ?來看看是否有變化。這里就會(huì)用到DataNode注冊(cè)時(shí)候,Confirm的消息。

@Override
public?void?pushNodeListChange()?{
????NodeOperator?fireNode;if?((fireNode?=?dataConfirmStatusService.peekConfirmNode())?!=?null)?{
????????NodeChangeResult?nodeChangeResult?=?getNodeChangeResult();
????????Map>?map?=?nodeChangeResult.getNodes();
????????Map?addNodes?=?map.get(nodeConfig.getLocalDataCenter());if?(addNodes?!=?null)?{
????????????Map?previousNodes?=?dataConfirmStatusService.putExpectNodes(
????????????????fireNode.getNode(),?addNodes);if?(!previousNodes.isEmpty())?{
????????????????firePushDataListTask(fireNode,?nodeChangeResult,?previousNodes,?true);
????????????}
????????}
????????firePushSessionListTask(nodeChangeResult,?fireNode.getNodeOperate().toString());
????}
}

再比如定期去除過期的Node:

public?class?MetaServerRegistry?implements?Registry<Node>?{
????@Override
????public?void?evict()?{
????????for?(NodeType?nodeType?:?NodeType.values())?{
????????????StoreService?storeService?=?ServiceFactory.getStoreService(nodeType);
????????????if?(storeService?!=?null)?{
????????????????Collection?expiredNodes?=?storeService.getExpired();if?(expiredNodes?!=?null?&&?!expiredNodes.isEmpty())?{
????????????????????storeService.removeNodes(expiredNodes);
????????????????}
????????????}
????????}
????}??
}

6.4.3 ServiceFactory

ServiceFactory 需要特殊說明,它提供了系統(tǒng)所需要的一系列服務(wù)。特殊之處在于,ServiceFactory 不是由 MetaServerBootstrap 負(fù)責(zé)啟動(dòng),而是由 Spring 負(fù)責(zé)啟動(dòng)。因?yàn)?ServiceFactory 繼承了ApplicationContextAware,所以啟動(dòng)時(shí)候生成。

在Web應(yīng)用中,Spring容器通常采用聲明式方式配置產(chǎn)生:開發(fā)者只要在web.xml中配置一個(gè)Listener,該Listener將會(huì)負(fù)責(zé)初始化Spring容器,MVC框架可以直接調(diào)用Spring容器中的Bean,無需訪問Spring容器本身。在這種情況下,容器中的Bean處于容器管理下,無需主動(dòng)訪問容器,只需接受容器的依賴注入即可。

但在某些特殊的情況下,Bean需要實(shí)現(xiàn)某個(gè)功能,但該功能必須借助于Spring容器才能實(shí)現(xiàn),此時(shí)就必須讓該Bean先獲取Spring容器,然后借助于Spring容器實(shí)現(xiàn)該功能。為了讓Bean獲取它所在的Spring容器,可以讓該Bean實(shí)現(xiàn)ApplicationContextAware接口。

下面代碼可以看出來,啟動(dòng)了一系列服務(wù)。

public?class?ServiceFactory?implements?ApplicationContextAware?{
????private?static?Map???????storeServiceMap???=?new?HashMap<>();private?static?Map?connectManagerMap?=?new?HashMap<>();private?static?Map????????nodeServiceMap????=?new?HashMap<>();??
}
storeServiceMap?=?{HashMap@5107}??size?=?3
?{Node$NodeType@5525}?"SESSION"?->?{SessionStoreService@5526}?
??key?=?{Node$NodeType@5525}?"SESSION"
??value?=?{SessionStoreService@5526}?
?{Node$NodeType@4815}?"DATA"?->?{DataStoreService@5527}?
??key?=?{Node$NodeType@4815}?"DATA"
??value?=?{DataStoreService@5527}?
?{Node$NodeType@5528}?"META"?->?{MetaStoreService@5529}?
??key?=?{Node$NodeType@5528}?"META"
??value?=?{MetaStoreService@5529}?
connectManagerMap?=?{HashMap@5532}??size?=?3
?{Node$NodeType@5525}?"SESSION"?->?{SessionConnectionHandler@5548}?
??key?=?{Node$NodeType@5525}?"SESSION"
??value?=?{SessionConnectionHandler@5548}?
?{Node$NodeType@4815}?"DATA"?->?{DataConnectionHandler@5549}?
??key?=?{Node$NodeType@4815}?"DATA"
??value?=?{DataConnectionHandler@5549}?
?{Node$NodeType@5528}?"META"?->?{MetaConnectionHandler@5550}?
??key?=?{Node$NodeType@5528}?"META"
??value?=?{MetaConnectionHandler@5550}?
nodeServiceMap?=?{HashMap@5533}??size?=?3
?{Node$NodeType@5525}?"SESSION"?->?{SessionNodeServiceImpl@5540}?
??key?=?{Node$NodeType@5525}?"SESSION"
??value?=?{SessionNodeServiceImpl@5540}?
?{Node$NodeType@4815}?"DATA"?->?{DataNodeServiceImpl@5541}?
??key?=?{Node$NodeType@4815}?"DATA"
??value?=?{DataNodeServiceImpl@5541}?
?{Node$NodeType@5528}?"META"?->?{MetaNodeServiceImpl@5542}?
??key?=?{Node$NodeType@5528}?"META"
??value?=?{MetaNodeServiceImpl@5542}?

至此,MetaServer的架構(gòu)和啟動(dòng)介紹完成,我們下文將會(huì)介紹基本功能,比如注冊(cè),存儲(chǔ),續(xù)約等。

0xFF 參考

服務(wù)注冊(cè)中心 MetaServer 功能介紹和實(shí)現(xiàn)剖析 | SOFARegistry 解析

服務(wù)注冊(cè)中心如何實(shí)現(xiàn) DataServer 平滑擴(kuò)縮容 | SOFARegistry 解析

服務(wù)注冊(cè)中心數(shù)據(jù)一致性方案分析 | SOFARegistry 解析

服務(wù)注冊(cè)中心如何實(shí)現(xiàn)秒級(jí)服務(wù)上下線通知 | SOFARegistry 解析

服務(wù)注冊(cè)中心 Session 存儲(chǔ)策略 | SOFARegistry 解析

服務(wù)注冊(cè)中心數(shù)據(jù)分片和同步方案詳解 | SOFARegistry 解析

服務(wù)注冊(cè)中心 SOFARegistry 解析 | 服務(wù)發(fā)現(xiàn)優(yōu)化之路

海量數(shù)據(jù)下的注冊(cè)中心 - SOFARegistry 架構(gòu)介紹

服務(wù)端部署

客戶端使用

全面理解Raft協(xié)議

詳解螞蟻金服 SOFAJRaft | 生產(chǎn)級(jí)高性能 Java 實(shí)現(xiàn)

從JRaft來看Raft協(xié)議實(shí)現(xiàn)細(xì)節(jié)

SOFAJRaft—初次使用

JRaft 用戶指南 & API 詳解

怎樣打造一個(gè)分布式數(shù)據(jù)庫——rocksDB, raft, mvcc,本質(zhì)上是為了解決跨數(shù)據(jù)中心的復(fù)制

sofa-bolt源碼閱讀(5)-日志

Raft 為什么是更易理解的分布式一致性算法

SOFAJRaft 源碼分析一(啟動(dòng)流程和節(jié)點(diǎn)變化)

SOFAJRaft 實(shí)現(xiàn)原理 - 生產(chǎn)級(jí) Raft 算法庫存儲(chǔ)模塊剖析

客戶端使用

總結(jié)

以上是生活随笔為你收集整理的源码 状态机_[源码阅读] 阿里SOFA服务注册中心MetaServer(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

亚洲精品视频免费在线观看 | 日韩精品久久久久久中文字幕8 | 在线精品在线 | 日韩免费一区 | 婷婷五月情 | 色福利网 | 日韩av免费在线看 | 欧美一级乱黄 | 手机av在线网站 | 在线观看电影av | 日本三级中文字幕在线观看 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 久久国产精品视频观看 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 国产精品黑丝在线观看 | 在线观看a视频 | 91精品在线播放 | 国产xxxxx在线观看 | 久久兔费看a级 | 亚洲成人资源 | 日韩精品一区二区三区视频播放 | 日韩区欧美久久久无人区 | 久久精品毛片 | 日本xxxxav| 国产在线观看91 | 中文字幕日本电影 | 成年人在线免费视频观看 | 日韩久久精品一区二区 | 久久久精华网 | 日本在线中文在线 | 天天插天天操天天干 | 日韩大陆欧美高清视频区 | 久久免费在线观看视频 | 天天干com | 国产精品69av | 日韩经典一区二区三区 | 国产黄a三级三级三级三级三级 | 夜夜操天天操 | 黄色毛片电影 | 激情丁香综合五月 | 999一区二区三区 | 天天干天天拍天天操天天拍 | 色网影音先锋 | 91亚洲精品久久久久图片蜜桃 | 96亚洲精品久久 | 欧美激情精品一区 | 黄色字幕网 | av免费电影在线观看 | 奇米影视777四色米奇影院 | 国产精品久久久久影视 | 在线看免费 | 色播五月婷婷 | 天天干,天天插 | 黄色成人91| 999久久久欧美日韩黑人 | 日韩av手机在线观看 | 探花视频免费在线观看 | 国产日韩欧美中文 | 黄网站a| 天堂在线一区二区 | 在线观看黄色的网站 | 国产日韩精品一区二区三区在线 | 亚洲精选国产 | 免费观看9x视频网站在线观看 | 国产精品久久毛片 | 免费看黄在线网站 | 中文字幕 国产视频 | 久久国语露脸国产精品电影 | 超碰av在线免费观看 | 日韩色在线 | 97人人模人人爽人人喊网 | 黄色1级毛片 | 久久激情网站 | 亚洲精品国产综合99久久夜夜嗨 | 亚洲一级国产 | 国产精品精品视频 | 伊人av综合| 久久精品亚洲综合专区 | 99热最新在线 | 亚洲精品麻豆视频 | 免费网站观看www在线观看 | 久久精品在线免费观看 | 日韩有色 | www国产亚洲精品 | 国产成人99av超碰超爽 | 久久99视频免费观看 | 五月婷婷在线播放 | 91av免费观看| 97国产一区| www.亚洲激情.com | 国产亚洲资源 | 国产精品一码二码三码在线 | 在线观看免费版高清版 | 免费观看特级毛片 | 亚洲春色综合另类校园电影 | 国产高清视频在线播放 | 91在线看免费 | 亚洲精品免费在线视频 | 欧美特一级 | 国产免费黄视频在线观看 | 国产美女精品视频免费观看 | 三级黄色大片在线观看 | 99久久久国产免费 | 亚洲一级片在线观看 | 国产最顶级的黄色片在线免费观看 | 国产成人三级三级三级97 | 最近免费中文字幕 | 日韩在线视频看看 | 99精品国产一区二区三区麻豆 | 五月天,com| 中文字幕一区av | 中国一级特黄毛片大片久久 | 久久精品香蕉 | 最新av网址大全 | 三级a毛片 | 色综合a | 黄色一级大片免费看 | 男女激情麻豆 | 欧美激情第十页 | 狠狠干在线播放 | 91在线网址| 中文字幕黄色av | 国产韩国精品一区二区三区 | 欧美久久电影 | 超碰免费观看 | 日韩系列在线观看 | 草免费视频 | 久久精品99国产国产精 | 国产理论在线 | 日韩区在线观看 | 国产专区精品视频 | 激情五月在线视频 | 欧美日韩视频观看 | av丝袜制服 | 亚洲影院天堂 | 精品影院一区二区久久久 | 伊人手机在线 | 国产在线一线 | 亚洲狠狠 | 91成人免费看片 | 国产视频一区在线播放 | 一区二区三区手机在线观看 | 亚州精品成人 | 欧美激情综合五月色丁香 | 久久亚洲在线 | 成年人app网址 | 国产精品一区久久久久 | 色婷婷播放 | 国产亚洲免费观看 | a视频在线观看 | 在线观看免费av网站 | 久久天天拍 | 久久国产精品免费观看 | av软件在线观看 | 久久草在线视频国产 | 美女免费网视频 | 区一区二区三区中文字幕 | 国产一区二区在线免费视频 | 久久www免费视频 | 97夜夜澡人人双人人人喊 | 亚洲一区二区视频在线 | 五月婷婷爱| 天天玩天天干天天操 | av在线短片| 日韩二区三区在线 | 免费电影一区二区三区 | 亚洲精品国产综合99久久夜夜嗨 | 日本久草电影 | 久久久福利影院 | 久久午夜国产精品 | 色成人亚洲网 | 2021国产精品视频 | 欧美成人精品欧美一级乱黄 | 91丨九色丨蝌蚪丰满 | 精品国产一区二区三区在线观看 | 亚洲国产一区二区精品专区 | 99免费看片 | 伊人伊成久久人综合网小说 | 亚洲理论在线观看电影 | 69国产盗摄一区二区三区五区 | 久草精品在线 | 伊人婷婷激情 | 久久免费播放 | 国产一区二区在线免费视频 | 久久综合桃花 | 国产日韩在线一区 | 精品久久久久久亚洲综合网 | 色婷婷综合久久久久中文字幕1 | 国产小视频在线 | 国产精品毛片一区二区在线看 | 97在线资源 | 最新超碰| 久久激五月天综合精品 | 久久综合久久八八 | av电影免费在线播放 | 色av男人的天堂免费在线 | 亚洲免费公开视频 | 69av免费视频 | 中文字幕一区二区在线观看 | 一区二区三区四区影院 | 91免费看黄色 | 婷婷激情五月综合 | 午夜国产一区 | 欧美韩国日本在线 | 精品国产一区二区三区不卡 | 国产免费叼嘿网站免费 | 六月天综合网 | 午夜影院在线观看18 | 在线亚洲观看 | 久久不卡av | 香蕉蜜桃视频 | 岛国一区在线 | 91成人精品观看 | 亚洲色图色 | 黄色精品一区 | 国产在线永久 | 欧美一区二区三区在线看 | 91视频久久久 | 天天综合天天做天天综合 | 欧美成人猛片 | 成年人网站免费观看 | 久久精品一区 | 中文字幕一区二区三区久久 | 在线免费国产视频 | 国产亲近乱来精品 | 激情在线网站 | 亚洲夜夜综合 | 亚洲第一区在线播放 | 91视频亚洲| 一区二三国产 | 久久人91精品久久久久久不卡 | 天天夜夜操| 玖玖精品在线 | 精品视频免费久久久看 | 麻豆传媒电影在线观看 | 91黄色在线看 | 欧美成人区 | 亚洲视频每日更新 | 日本中文字幕电影在线免费观看 | 成人电影毛片 | 日本久草电影 | 91成人免费视频 | 国产一区在线视频观看 | 亚洲精品综合一二三区在线观看 | 国产精品中文久久久久久久 | 久久涩涩网站 | 亚洲三级黄色 | 国产黄色片在线 | 久香蕉| 久久久久久久久久久久电影 | 欧美日韩精品在线播放 | 天天干天天色2020 | 欧美a在线免费观看 | 国产精品12 | 91高清完整版在线观看 | 久久夜夜爽 | av性在线| 日韩三级不卡 | 六月天综合网 | 天天曰天天射 | 国产精品自拍在线 | 国产一区免费在线 | 尤物一区二区三区 | 亚洲干视频在线观看 | www..com黄色片| 欧美精品久久99 | 808电影免费观看三年 | 亚洲激情av | 中文字幕乱码一区二区 | 玖玖精品视频 | 亚洲天天在线日亚洲洲精 | 91视频高清完整版 | 91av社区 | 狠狠狠色丁香婷婷综合久久五月 | 精品久久一区二区 | 黄色99视频 | 91大片网站| 草免费视频 | 在线国产日本 | 91九色在线视频 | 精品视频在线免费 | 国产五月婷| 99久久久国产精品美女 | 日韩av免费在线电影 | 久久精品欧美一区二区三区麻豆 | 精品欧美一区二区在线观看 | 久久久久久久久久久黄色 | 九九久久久久久久久激情 | 欧美午夜精品久久久久久浪潮 | 在线观看视频在线 | 最新av电影网址 | 久久视频精品在线 | 日日成人网| 狠狠操狠狠干2017 | 国产精品一区二区吃奶在线观看 | 亚洲黄色三级 | 免费在线一区二区 | 国产99久久久国产精品成人免费 | 高清av免费一区中文字幕 | 91chinesexxx| 色999视频 | 天天操天天干天天 | 欧美色婷 | 国产黄免费在线观看 | 国产视频资源在线观看 | 一区二区在线电影 | 久久久www成人免费毛片 | 国产精品视频在线观看 | 特级西西人体444是什么意思 | 国产91精品一区二区绿帽 | 久久手机精品视频 | 国产中年夫妇高潮精品视频 | 91成人网在线播放 | 91久色蝌蚪 | 欧美精品在线一区 | 在线免费高清一区二区三区 | 91av在线免费看 | 成人黄色大片在线免费观看 | 久久一区二区三区四区 | 国产成人av综合色 | 日韩欧美国产激情在线播放 | 精品国产一区二区三区久久影院 | 久久久黄视频 | 婷婷色综合| 欧美精品在线观看免费 | 国产精品美女久久久久aⅴ 干干夜夜 | 人人澡超碰碰97碰碰碰软件 | 99热播精品 | 日本黄色免费播放 | 中文字幕一区二区三区四区在线视频 | 81国产精品久久久久久久久久 | 99精品国产一区二区三区麻豆 | 在线观看免费日韩 | 欧美日韩免费观看一区=区三区 | 亚洲精品视频二区 | 国产一级片在线播放 | 96精品高清视频在线观看软件特色 | 黄色成人免费电影 | 亚洲国产精品电影 | 国产剧情在线一区 | 亚洲免费精品视频 | 亚洲欧美视频在线 | 国产美腿白丝袜足在线av | 日本久久片 | 91av免费观看| 久久免费精品视频 | 亚洲精品免费看 | 中文字幕有码在线 | 麻豆免费视频网站 | 久久久.com | 黄色在线小网站 | 亚洲精品视频在线观看视频 | 欧美精品亚洲精品 | 黄色.com| 久久久精品视频网站 | 免费日韩 | 日本黄色一级电影 | 99热播精品 | 婷婷丁香激情网 | 欧美性猛片, | 久草网视频在线观看 | 99国产一区二区三精品乱码 | 久草视频在线播放 | 国产免费又爽又刺激在线观看 | 免费看色的网站 | 亚州精品视频 | www久久久 | 久久男人视频 | 国产精品精品久久久久久 | 亚洲天天草 | 日韩在线一二三区 | 中文字幕专区高清在线观看 | 91在线观看视频 | 亚洲国产精品视频 | 制服丝袜欧美 | 国产视频在线观看一区二区 | 国产一区二区在线播放视频 | 91精品免费在线 | 亚洲欧洲av在线 | 欧美日韩精品影院 | 中文字幕久久网 | 国产大片黄色 | av视屏在线播放 | av.com在线| 超碰人人舔 | 国产一级二级三级视频 | 蜜桃视频成人在线观看 | 国产精品久久亚洲 | 久久狠狠一本精品综合网 | 99久久国产免费看 | 久草免费看 | 999视频在线播放 | 日韩免费视频观看 | 日韩 国产| 久久久久在线 | 久久伦理 | 国产美女视频网站 | 香蕉视频导航 | 久久视频免费 | 色婷婷综合久久久久 | 国产精品美女久久久久久久久久久 | 丁香六月激情 | 亚洲精品乱码久久久久久写真 | 久免费 | 国产在线一区二区三区播放 | 九九免费精品视频 | www日韩精品| 夜夜爱av | 激情丁香婷婷 | 日韩在线色视频 | 国产中文字幕一区 | 夜夜爽www| 成人免费看片网址 | 国产精品久久久久久一区二区三区 | 91在线欧美 | 久草免费资源 | 国产h在线播放 | 久久久免费视频播放 | 四虎永久国产精品 | 亚洲国产中文字幕在线观看 | 久久爽久久爽久久av东京爽 | 亚洲综合欧美精品电影 | 免费中午字幕无吗 | 国内精品久久久久久久久久清纯 | 久久五月情影视 | 日韩精品专区在线影院重磅 | 91麻豆国产| 国产黄色高清 | av一级网站 | 久久99视频免费 | 婷婷色伊人 | 日本黄区免费视频观看 | 91亚洲精品国偷拍 | a在线一区 | 香蕉视频在线播放 | 久草视频免费在线播放 | 一级片黄色片网站 | 很污的网站 | 婷婷开心久久网 | 日韩资源视频 | 超碰在线cao | 婷婷综合在线 | 国内精自线一二区永久 | 免费福利影院 | 日韩狠狠操 | 欧美人体xx| 国产高清视频免费观看 | 免费看片网站91 | 国产高清久久久久 | 国产精品黄色 | 午夜丰满寂寞少妇精品 | 成人av在线直播 | www.天天操 | 黄色毛片一级片 | 久久成人高清视频 | 香蕉视频久久久 | 人人盈棋牌 | 免费午夜网站 | 久久在线免费 | www.狠狠 | 久久久久久久久久久网站 | 天天天干天天天操 | 国产成人一级电影 | 精品欧美一区二区在线观看 | av 一区 二区 久久 | 久久久久久久久久久久久久免费看 | 在线观看视频亚洲 | 久久九九国产精品 | 人人射 | 99色国产| 色视频成人在线观看免 | 天堂av在线网址 | 日韩高清在线一区二区三区 | 天天干天天天 | 区一区二区三在线观看 | 中文国产在线观看 | 女女av在线| 久久爱导航| 麻豆精品国产传媒 | 午夜久久网站 | 国产精品一区二 | 99在线视频网站 | 91资源在线免费观看 | 久久性生活片 | 日韩免费专区 | 一区二区三区四区精品 | 六月丁香久久 | 91麻豆精品国产自产在线游戏 | 国产精品www| 欧美亚洲免费在线一区 | 中文字幕在线观看完整版电影 | 91豆花在线| 亚洲天堂网在线播放 | 国产精品扒开做爽爽的视频 | 日本aaaa级毛片在线看 | 一级特黄aaa大片在线观看 | 日日夜夜精品网站 | 91综合在线| 91精品国产综合久久福利不卡 | 在线观看视频一区二区三区 | 午夜久久网站 | 天堂视频一区 | 丁香花在线观看免费完整版视频 | 成人黄大片视频在线观看 | 日韩影视精品 | 欧美一区日韩一区 | 99热精品在线 | 欧美激情综合色综合啪啪五月 | 国产精品乱码一区二区视频 | 伊甸园av在线 | 欧美激情精品久久 | 久久国产剧场电影 | 国产精品免费一区二区三区 | 久久久免费观看 | 国产免费视频一区二区裸体 | 黄色av电影在线观看 | 久久久www成人免费精品张筱雨 | 97超碰福利久久精品 | 国产一二区免费视频 | 亚洲一区二区精品 | 一区二区三区免费看 | 亚洲综合欧美精品电影 | 久久久久久久久影视 | 亚洲免费精品视频 | 午夜精品久久久久久久99热影院 | 99久久国产免费,99久久国产免费大片 | 天天射天天爱天天干 | 日韩在线 一区二区 | 91成人免费视频 | 91人人爽人人爽人人精88v | 91麻豆精品国产自产在线 | 免费看三片 | 欧美日韩视频在线观看一区二区 | 久久字幕 | 国产日韩精品在线 | 亚洲激情国产精品 | 热re99久久精品国产99热 | www中文在线 | 成人久久综合 | 一本一道久久a久久精品蜜桃 | 亚洲欧洲一区二区在线观看 | 国产亚洲精品久久久久久大师 | 日本丶国产丶欧美色综合 | 97超碰色 | 中文字幕免费一区 | 国产91精品一区二区麻豆网站 | 人人讲 | 最近中文字幕在线 | 九九热在线观看视频 | 玖玖视频免费在线 | 黄色aa久久| 国产精品毛片一区二区三区 | 欧美日韩裸体免费视频 | 黄色三级在线观看 | 天天插狠狠干 | 四虎国产精品免费观看视频优播 | 日韩美女久久 | 在线观看国产亚洲 | 香蕉在线播放 | 午夜黄网 | 国产精品一区二区久久精品爱涩 | 黄色1级大片 | 悠悠av资源片 | 最近中文字幕高清字幕免费mv | 91精品国产成人观看 | 992tv成人免费看片 | 日韩在线精品 | 午夜少妇 | 五月开心婷婷网 | 国产一区二区日本 | 99精品久久久久久久久久综合 | 黄色a在线 | 青青久视频| 亚洲精品在线视频网站 | 久久精品久久久久 | 日本最新高清不卡中文字幕 | 五月婷婷久久综合 | 麻豆成人精品 | wwwwww国产| 国产在线观看av | 久久这里只有精品1 | 久久精品成人欧美大片古装 | 91福利视频免费 | 欧美黑人巨大xxxxx | 国产99久久久精品 | 精品久久久亚洲 | 国产精品6999成人免费视频 | 狠狠干天天射 | 国产精品久久麻豆 | 日韩精品免费在线观看视频 | www.香蕉视频 | 亚洲精品av中文字幕在线在线 | 日本99久久 | 亚洲成人精品影院 | 91少妇精拍在线播放 | 激情婷婷在线观看 | 国产免费av一区二区三区 | 亚洲精品免费播放 | 五月婷婷色播 | 在线免费观看麻豆视频 | 999精品网| 久久综合影音 | 欧美精品久久久久a | 99日韩精品 | 国产一区二区免费 | 久久婷亚洲五月一区天天躁 | 国产一区国产二区在线观看 | 欧美日韩二区三区 | 免费特级黄色片 | 亚洲电影网站 | 韩国在线视频一区 | 免费av免费观看 | 精品国产1区2区3区 国产欧美精品在线观看 | 日韩aa视频 | av成人免费观看 | 最新日韩视频在线观看 | 国际av在线| 在线高清av | 亚洲一区免费在线 | 婷婷色社区 | 九九热精品在线 | 成年人视频免费在线播放 | 麻豆一区二区三区视频 | 国产精品久久婷婷六月丁香 | 久草在线免费看视频 | 天天艹天天操 | 九九在线免费视频 | 国产麻豆成人传媒免费观看 | 亚洲精品成人在线 | 狠狠色噜噜狠狠狠合久 | 成人av一二三区 | 免费网站观看www在线观看 | 日韩字幕在线观看 | 高清视频一区二区三区 | 成人在线免费看 | 97精品伊人 | 国产成人黄色网址 | 国产中文字幕一区 | 一级黄色a视频 | 国产一级片视频 | 久久久国产精品亚洲一区 | 99热官网| 亚洲精品伦理在线 | 九九影视理伦片 | 成人国产精品一区二区 | 一区二区三区免费在线观看视频 | 夜色资源站wwwcom | 国产一区二区精品久久 | www.天天干 | 欧美99精品 | 成人精品国产免费网站 | 91亚洲成人 | 日韩欧美大片免费观看 | 日日草天天草 | 黄色免费观看视频 | 日韩精品一区在线播放 | 黄色网在线播放 | 成人免费观看网址 | 国产高清免费观看 | 亚洲 欧美 国产 va在线影院 | 免费看一及片 | 亚洲精品国产精品乱码在线观看 | 久久久久久久久久久久久9999 | 99精品毛片 | 97人人澡人人爽人人模亚洲 | 欧美成人xxxxxxxx | 国内精品久久久久久久久久 | 国产 在线观看 | 亚洲在线资源 | 国产特级毛片aaaaaa毛片 | 国产一区二区三区高清播放 | 射综合网 | 久久66热这里只有精品 | av在线永久免费观看 | 欧美另类xxxx | 欧美日韩高清在线一区 | 日韩欧美区 | 午夜资源站 | 精品99免费 | 成人在线中文字幕 | 免费三级在线 | 国产视频在线播放 | 美女黄网久久 | 精品欧美一区二区在线观看 | 国产精品永久在线 | 在线免费观看欧美日韩 | 成人av免费看 | 欧美日韩三级在线观看 | 91网在线看 | 国产精品视频免费观看 | 中文字幕 影院 | 久久久久综合网 | 久久综合精品国产一区二区三区 | 日本字幕网 | 久久久久五月天 | 午夜精品久久久久久久久久久久 | 99热在线免费观看 | 一本—道久久a久久精品蜜桃 | 欧美午夜视频在线 | 天堂在线免费视频 | 免费网站黄色 | 国产主播大尺度精品福利免费 | 国产毛片在线 | 开心色插| 四虎www com| 四虎永久国产精品 | 国产精品 日本 | 免费av视屏 | 久久视屏网 | 最新国产精品久久精品 | 久久久久人人 | 波多野结衣一区二区三区中文字幕 | 在线观看国产中文字幕 | 久久99久久久久 | 久久成熟 | 日日干av | 国产日韩欧美在线一区 | 久久综合中文色婷婷 | 成全在线视频免费观看 | www.色婷婷 | 在线小视频 | 日韩羞羞| 五月婷婷在线综合 | 久久综合婷婷国产二区高清 | 亚洲成a人片在线观看网站口工 | 精品在线免费观看 | 99av国产精品欲麻豆 | 久久精品在线 | 丁香色综合 | 色综合久久88色综合天天 | 欧美一区二区三区四区夜夜大片 | 久久久免费播放 | 国产成人精品av在线 | 久久成人国产精品 | 久久精品99国产精品日本 | 欧美精品乱码久久久久久按摩 | 亚洲精品视频一 | 欧美激情精品久久久久 | 亚洲电影自拍 | 九九亚洲精品 | 亚洲aⅴ久久精品 | 亚洲成人频道 | 亚洲最新av | 福利区在线观看 | 天天操天 | 国产精品99免视看9 国产精品毛片一区视频 | 国产一级片免费播放 | 一区二区视频欧美 | 91在线视频一区 | 色综合久久久久综合体 | 婷婷丁香视频 | 深爱激情五月婷婷 | 亚洲精品在线视频播放 | 黄色一级在线免费观看 | 天天操天天操天天操天天 | 人人爽人人爱 | 五月婷婷丁香在线观看 | 日韩三级视频在线观看 | 日本黄色免费播放 | av最新资源 | 国产日产在线观看 | 综合色伊人| 高潮毛片无遮挡高清免费 | 久久精品精品 | 国产在线视频在线观看 | 精品国产一区二区三区久久久 | 麻豆国产电影 | 国产激情电影综合在线看 | 国产不卡高清 | 色资源二区在线视频 | 亚洲精品在线视频网站 | 亚洲成人精品影院 | 丁香五月缴情综合网 | 久久国产一区二区三区 | 亚洲午夜久久久久久久久久久 | 欧美日韩国产一区二区三区 | 国产亚洲精品久久久久久电影 | 日韩激情精品 | 日韩激情av在线 | 人人爽影院 | 在线观看www视频 | 香蕉久久久久 | 国产精品视频免费观看 | 国产精品久久久久一区二区国产 | 国产成人精品一区二区三区福利 | 日韩影视在线 | 丁香久久激情 | 久久久精品国产免费观看一区二区 | 99久久www免费 | 色综合色综合色综合 | 天天射天天添 | 久久综合中文色婷婷 | 国产99久久| 91在线porny国产在线看 | 国产日本高清 | 国产福利在线不卡 | 国产第一福利网 | 99热在线观看免费 | 久久人视频 | 国产韩国日本高清视频 | 色婷婷激情综合 | 国产一级视频免费看 | 免费网站污| 久草在线在线精品观看 | 亚洲伊人天堂 | 色综合天天狠天天透天天伊人 | 国产成人av综合色 | 成人 亚洲 欧美 | 中文字幕资源网在线观看 | 青草视频网 | 久久激情小视频 | 精品国产免费看 | 91精品视频免费在线观看 | 欧美日韩在线视频一区二区 | av7777777| 91av手机在线 | 欧美日韩调教 | 成人免费xxxxxx视频 | 日韩影片在线观看 | 久久久免费看视频 | 亚洲少妇久久 | 国产日韩精品在线 | 中文字幕一区二区三区在线播放 | 国产91精品看黄网站 | 国产精品观看在线亚洲人成网 | 91在线视频免费91 | 在线视频1卡二卡三卡 | 日韩 在线 | 在线中文字幕av观看 | 日韩美女免费线视频 | 91视频在线播放视频 | 国产999在线 | 久久最新网址 | 久久久www成人免费精品 | 久久视频99 | 国产一区在线不卡 | 国产在线播放观看 | 久久高清国产 | 久久福利综合 | 一级一片免费看 | 99久久久久国产精品免费 | 国产福利一区二区在线 | 98久9在线 | 免费 | 国产精品久久久久久欧美 | 国产黄色精品在线 | 黄色官网在线观看 | 天天操天天射天天爱 | 丁香五香天综合情 | 少妇搡bbbb搡bbb搡忠贞 | 99色国产| 超碰在线亚洲 | 中文字幕在线免费播放 | 久草视频一区 | 久久亚洲日本 | 黄色国产区 | 色婷婷六月 | 日韩理论片在线 | 99精品免费久久久久久久久 | 有码中文字幕在线观看 | 高清免费在线视频 | 丁香5月婷婷久久 | 国产女教师精品久久av | 亚洲成人免费 | 亚洲高清在线精品 | 精品国产乱码久久久久 | 中文字幕在线播放日韩 | 六月色婷婷 | 黄色网www | 美女免费视频观看网站 | 91av视频播放 | 在线有码中文 | 射综合网 | 国产视频午夜 | 欧美激情综合色综合啪啪五月 | 国产精品一区二区三区视频免费 | 日日干日日操 | 日韩视频欧美视频 | 五月开心色 | www.久久视频| 国产在线观看你懂的 | 欧美成人精品欧美一级乱 | 一本一道久久a久久综合蜜桃 | 精品96久久久久久中文字幕无 | 久99久在线视频 | 欧美一级片在线 | 日韩毛片在线一区二区毛片 | 国产精品久久久久影院 | 久久久影院一区二区三区 | 亚洲欧美视频在线 | 国产亚洲激情视频在线 | 精品国产91亚洲一区二区三区www | 免费毛片一区二区三区久久久 | 亚洲精品玖玖玖av在线看 | 国产一区黄色 | 伊人狠狠| 婷婷综合成人 | 日韩欧美在线国产 | 在线超碰av| 国产一线在线 | 国产精品免费视频观看 | 亚洲精品乱码久久久久久蜜桃欧美 | 视频在线观看国产 | 国产精品嫩草影院9 | 在线免费黄色片 | 99国产一区二区三精品乱码 | 精品国产诱惑 | 国产亚洲视频系列 | 91精品在线播放 | 天天鲁天天干天天射 | 天天操天天摸天天干 | 色a网| 亚洲综合视频网 | 免费av电影网站 | 国产精品美女网站 | 天天射天天搞 | 97国产精品久久 | 天天综合五月天 | 亚洲激情六月 | 日韩免费观看视频 | 国产精品国产三级国产aⅴ无密码 | 在线观看va | 97高清视频 | 丝袜av网站| 美女网站在线 | 久久精品视频免费观看 | 亚洲精品激情 | 91精品免费在线观看 | 国产精品久久久久免费观看 | 亚洲精品日韩一区二区电影 | 免费午夜网站 | 欧美日韩国产色综合一二三四 | 成人在线免费看视频 | 国产精品美女久久久久久久久 | 欧美不卡视频在线 | 天天·日日日干 | 中文字幕人成不卡一区 | 国产一级免费在线观看 | 最近日韩中文字幕中文 | 999色视频 | 久插视频 | 精品国产欧美一区二区三区不卡 | 欧美激情在线看 | 天天操夜操 | 久久99精品久久只有精品 | 亚洲午夜精品久久久久久久久 | 国产精品视频线看 | 国产亚洲精品女人久久久久久 | 色婷婷免费 | 国产一区二区三区在线免费观看 | 婷婷网站天天婷婷网站 | 国产在线精品国自产拍影院 | 精品伊人久久久 | 欧美黄色特级片 | 免费色视频网站 | 久久综合婷婷综合 | 国产欧美久久久精品影院 | 国产美腿白丝袜足在线av | 国产视频欧美视频 | 国产午夜精品在线 | 久久精品视频免费观看 | 97超碰成人 | 久久精选视频 | 久久一区二| 国产小视频在线免费观看视频 | 日日夜夜天天操 | 涩涩网站在线看 | 日韩va在线观看 | 激情综合五月 | 国产资源在线视频 | 国产精品久久久久久久免费 | 最近中文字幕视频网 | 丁香六月五月婷婷 | 丝袜美腿在线播放 | 国产福利专区 | 国产亚洲精品久久久久久无几年桃 | 日韩视频www| 亚洲精品婷婷 | 最新99热 | 国产福利在线免费观看 | 久久精品久久久久 | 日韩欧美综合精品 | 色综合五月天 | 亚洲精品国产精品99久久 | 久草在线免费资源 | adn—256中文在线观看 | 91桃色免费视频 | 五月天婷婷在线播放 | 婷婷六月天天 | 久久久在线视频 | 97色在线视频 | av先锋影音少妇 | 天天操狠狠操夜夜操 | 国产情侣一区 | 国内久久久久久 | 欧美精品999 | 午夜精品电影 | 久久精品视频国产 | 99视频这里有精品 |