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

鏈路追蹤 SkyWalking 原始碼分析 —— Collector Server Component 伺服器元件

本文主要基於 SkyWalking 3.2.6 正式版

  • 1. 概述
  • 2. 介面
    • 2.1 Server
    • 2.2 ServerHandler
  • 3. gRPC 實現
    • 3.1 GRPCServer
    • 3.2 GRPCHandler
  • 4. Jetty 實現
    • 4.1 JettyServer
    • 4.2 JettyHandler
  • 666. 彩蛋

1. 概述

本文主要分享 SkyWalking Collector Server Component 伺服器元件。Collector 透過伺服器,提供 API 介面給呼叫方,例如 Agent 、WebUI 。

Server Component 在 SkyWalking 架構圖處於如下位置( 紅框 ) :

FROM https://github.com/apache/incubating-skywalking

下麵我們來看看整體的專案結構,如下圖所示 :

OK,我們從介面到實現的順序進行分享。

2. 介面

2.1 Server

org.skywalking.apm.collector.server.Server ,伺服器介面。其實現子類,如下類圖 :

#hostPort() 介面方法,獲得伺服器地址。
#serverClassify() 介面方法,獲得伺服器分類。

#initialize() 介面方法,初始化伺服器。
#start() 介面方法,啟動伺服器。

#addHandler() 介面方法,新增請求處理器( ServerHandler )

2.2 ServerHandler

org.skywalking.apm.collector.server.ServerHandler ,伺服器處理器介面。其實現子類,如下類圖 :

ServerHandler 無任何介面方法。

一個 ServerHandler 對應一個請求的處理。

3. gRPC 實現

3.1 GRPCServer

org.skywalking.apm.collector.server.grpc.GRPCServer ,基於 gRPC 的伺服器實現。

#hostPort() 實現方法,獲得伺服器地址。
#serverClassify() 實現方法,獲得伺服器分類為 "Google-RPC"

#initialize() 實現方法,呼叫 io.grpc.netty.NettyServerBuilder#forAddress(address) 方法,NettyServerBuilder 。此處,伺服器並未建立與啟動。
#start() 實現方法,建立 io.grpc.Server 物件,並啟動伺服器。

#addHandler(handler) 實現方法,呼叫 NettyServerBuilder#addService(...) 方法,新增 gRPC 請求處理器( GRPCHandler )。

目前,GRPCServer 使用在 collector-agent-grpc-provider / collector-remote-grpc-provider 專案。

3.2 GRPCHandler

org.skywalking.apm.collector.server.grpc.GRPCHandler ,gRPC 請求處理器介面。其實現子類,如下類圖 :

GRPCHandler 無任何介面方法。

4. Jetty 實現

3.1 JettyServer

org.skywalking.apm.collector.server.jetty.JettyServer ,基於 Jetty 的伺服器實現。

#hostPort() 實現方法,獲得伺服器地址。
#serverClassify() 實現方法,獲得伺服器分類為 "Jetty"

#initialize() 實現方法,建立 org.eclipse.jetty.server.Server 和 org.eclipse.jetty.servle.ServletContextHandler 物件。此處,伺服器並未啟動。
#start() 實現方法,啟動伺服器。

#addHandler(handler) 實現方法,使用 ServerHandler 建立 org.eclipse.jetty.servlet.ServletHolder 物件,並呼叫 ServletContextHandler#addServlet(servlet, pathSpec) 方法進行新增。

目前,JettyServer 使用在 collector-agent-jetty-provider / collector-ui-jetty-provider 專案。

3.2 JettyHandler

org.skywalking.apm.collector.server.jetty.JettyHandler ,繼承 javax.servlet.http.HttpServlet 抽象類,Jetty 請求處理。

#pathSpec() 抽象方法,請求路徑定義。

#doGet(HttpServletRequest) 抽象方法,處理 Get 請求,並傳回 com.google.gson.JsonElement物件。

  • 該抽象方法會被 `#doGet(HttpServletRequest, HttpServletResponse)` 方法呼叫。
    • 成功時,呼叫 `#reply(HttpServletResponse, JsonElement)` 方法,傳回 JSON 。
    • 錯誤時,呼叫 `#replyError(HttpServletResponse, errorMessage, status)` 方法,傳回 JSON 。

#doPost(HttpServletRequest) 抽象方法,處理 Post 請求,並傳回 com.google.gson.JsonElement 物件。

  • 該抽象方法會被 `#doPost(HttpServletRequest, HttpServletResponse)` 方法呼叫。

HttpServlet 所有方法被重寫,並標記 final 修飾符,不允許子類重寫

贊(0)

分享創造快樂