本文主要基於 SkyWalking 3.2.6 正式版
- 1. 概述
- 2. Collector Naming Server
- 2.1 NamingModule
- 2.2 NamingModuleJettyProvider
- 2.3 NamingHandlerRegisterService
- 2.4 配置檔案
- 3. CollectorDiscoveryService
- 3.1 CollectorDiscoveryService
- 3.2 配置檔案
- 666. 彩蛋
1. 概述
本文主要分享 Collector Naming Server 命名服務。主要包含如下部分:
- Collector Naming Server 提供 Http 兩個介面,提供 Agent 分別查詢 Collector Agent Jetty Server 、Collector Agent gRPC Server 叢集。
- Collector Agent Jetty Server 、Collector Agent gRPC Server 叢集內部的註冊與發現。
友情提示,建議胖友已經讀過 《SkyWalking 原始碼分析 —— Collector Server Component 伺服器元件》 、《SkyWalking 原始碼分析 —— Collector Server Component 伺服器元件》
Collector Agent Server ( 包括 Jetty 和 gRPC ),提供上傳呼叫鏈路,JVM Metric 等等 API 給 Agent 呼叫。
Agent 透過 Collector Naming Server 呼叫 Collector Agent Server 的 API ,查詢 Collector Agent Server 最新的叢集地址。
Naming Server 在 SkyWalking 架構圖處於如下位置( 紅框 ) :
FROM https://github.com/apache/incubating-skywalking
下麵我們來看看整體的專案結構,如下圖所示 :
2. Collector Naming Server
Collector Naming Server 透過 apm-collector-naming
專案實現,其中:
collector-naming-define
專案:定義了 Naming Server 的介面。collector-naming-jetty-provider
專案:基於 Jetty Server 的 Naming Server 實現。
2.1 NamingModule
org.skywalking.apm.collector.cluster.ClusterModule
,實現 Module 抽象類,叢集管理 Module 。
#name()
實現方法,傳回模組名為 "naming"
。
#services()
實現方法,傳回 Service 類名:NamingHandlerRegisterService 。
2.2 NamingModuleJettyProvider
org.skywalking.apm.collector.naming.jetty.NamingModuleJettyProvider
,實現 ModuleProvider 抽象類,基於 Jetty 的命名元件服務提供者實現類。
#name()
實現方法,傳回元件服務提供者名為 "jetty"
。
module()
實現方法,傳回元件類為 NamingModule 。
#requiredModules()
實現方法,傳回依賴元件為 ClusterModule 、JettyManagerModule。
#prepare(Properties)
實現方法,執行準備階段邏輯。
- 第 55 行 :建立 ZookeeperModuleListenerService / NamingJettyHandlerRegisterService 物件,並呼叫
#registerServiceImplementation()
父類方法,註冊到services
。
#start()
實現方法,執行啟動階段邏輯。
- 第 65 行 :呼叫
JettyManagerService#createIfAbsent(host, port, contextPath)
方法,建立 Jetty Server ,此時不會啟動 Jetty Server。在JettyManagerProvider#notifyAfterCompleted()
方法,統一啟動所有 Jetty Server,在 《SkyWalking 原始碼分析 —— Collector Jetty Server Manager》「3. JettyManagerProvider」 有詳細解析。
#notifyAfterCompleted()
實現方法,執行啟動完成邏輯。目前是個空方法。
2.3 NamingHandlerRegisterService
org.skywalking.apm.collector.naming.service.NamingHandlerRegisterService
,繼承 Service 介面,命名處理器註冊服務介面。
#register(ServerHandler)
介面方法,註冊 Server 請求處理器。Collector Agent Server 會呼叫該方法,將其實現的 用於 Naming 的 ServerHandler 進行註冊。如下圖所示:
2.3.1 NamingJettyHandlerRegisterService
org.skywalking.apm.collector.naming.jetty.service.service.NamingJettyHandlerRegisterService
,基於 Jetty 的命名處理器註冊服務實現類。
#register(moduleName, providerName, registration)
實現方法,呼叫 JettyManagerService#addHandler(path, registration)
方法,註冊 Jetty Server 請求處理器。
2.3.2 AgentJettyNamingHandler
org.skywalking.apm.collector.agent.jetty.handler.naming.AgentJettyNamingHandler
,實現 JettyHandler 抽象類,Collector Agent Jetty Server 實現的命名處理器。
#pathSpec()
實現方法,獲得請求路徑為 "/agent/jetty"
。
#doGet()
實現方法,呼叫 AgentJettyNamingListener#getAddresses()
方法,獲得 Collector Agent Jetty Server 叢集地址。
- `org.skywalking.apm.collector.agent.jetty.handler.naming.AgentJettyNamingListener` 基於 Collector Cluster 元件,實現了叢集地址變化的發現,在 《SkyWalking 原始碼分析 —— Collector Cluster 叢集管理》 有詳細解析。
2.3.3 AgentGRPCNamingHandler
org.skywalking.apm.collector.agent.grpc.handler.naming.AgentGRPCNamingHandler
,實現 JettyHandler 抽象類,Collector Agent gRPC Server 實現的命名處理器。
#pathSpec()
實現方法,獲得請求路徑為 "/agent/gRPC"
。
#doGet()
實現方法,呼叫 AgentGRPCNamingListener#getAddresses()
方法,獲得 Collector Agent gRPC Server 叢集地址。
- `org.skywalking.apm.collector.agent.grpc.handler.naming.AgentGRPCNamingListener` 基於 Collector Cluster 元件,實現了叢集地址變化的發現,在 《SkyWalking 原始碼分析 —— Collector Cluster 叢集管理》 有詳細解析。
2.4 配置檔案
配置檔案如下 :
- 配置 Naming Server 啟動在 10800 埠。
- Naming Server 內嵌在 Collector Server 。透過啟動多個 Collector Server 節點,形成 Naming Server 叢集。Agent 配置多個 Naming Server 地址。
3. CollectorDiscoveryService
org.skywalking.apm.agent.core.remote.CollectorDiscoveryService
, 實現 Agent 的 BootService 介面,Collector Agent Server 地址發現服務。
#boot()
實現方法,呼叫 ScheduledExecutorService#scheduleAtFixedRate(...)
方法,建立定時任務。該定時任務無初始化延遲,每 Config.Collector.DISCOVERY_CHECK_INTERVAL
( 預設:60 s ) 執行一次。
- DiscoveryRestServiceClient 實現
java.lang.Runnable
介面,即建立的任務。
3.1 CollectorDiscoveryService
org.skywalking.apm.agent.core.remote.CollectorDiscoveryService
,實現 java.lang.Runnable
介面,Collector 服務發現客戶端,基於 Rest 方式通訊。
構造方法 ,首先隨機選擇一個 Collector Naming Server ,用於下麵 #findServerList()
方法,首次獲取 Collector Agent Server 叢集地址。
#run()
實現方法,呼叫 #findServerList()
方法,獲取 Collector Agent Server 叢集地址。
#findServerList()
方法,獲取 Collector Agent Server 叢集地址。
- 第 85 行 :建立
org.apache.http.impl.client.CloseableHttpClient
物件。目前使用 HttpClient4.5.3
版本。 - 第 87 行 :呼叫 `#buildGet()` 方法,建立
org.apache.http.client.methods.HttpGet
物件。目前 Agent 查詢的是 Collector Agent gRPC Server 叢集地址,因為 gRPC 的效能相比 HTTP 更優秀。 - 第 89 行 :向 Collector Naming Server 發起請求。
- 第 90 至 93 行 :當響應狀態碼非
200
時,呼叫#findBackupServer()
方法,順序選擇 Collector Naming Server 串列的下一個。註意,此時不會再發起請求,需要等下一次執行。 - 第 95 至 111 行 :處理響應結果,若 Collector Agent gRPC Server 叢集地址發生變化,進行更新到
RemoteDownstreamConfig.Collector.GRPC_SERVERS
。 - 第 114 至 117 行 :請求發生異常,呼叫
#findBackupServer()
方法,順序選擇 Collector Naming Server 串列的下一個。 - 第 119 行 :呼叫
CloseableHttpClient#close()
方法,進行關閉。
3.2 配置檔案
配置檔案如下 :
- 生產環境使用時,推薦 Agent 配置多個 Naming Server 地址。
朋友會在“發現-看一看”看到你“在看”的內容