本文主要基於 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
修飾符,不允許子類重寫。