歡迎光臨
每天分享高質量文章

鏈路追蹤 SkyWalking 原始碼分析 —— Collector Naming Server 命名服務

本文主要基於 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 物件。目前使用 HttpClient 4.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 地址。

已同步到看一看
赞(0)

分享創造快樂