链路追踪 SkyWalking 源码分析 —— Collector Server Component 服务器组件
点击上方“芋道源码”,选择“设为星标”
做积极的人,而不是积极废人!
源码精品专栏
摘要: 原创出处 http://www.iocoder.cn/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
修饰符,不允许子类重写。
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:
已在知识星球更新源码解析如下:
如果你喜欢这篇文章,喜欢,转发。
生活很美好,明天见(。・ω・。)ノ♡