摘要: 原创出处 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. 彩蛋
- 《Netty 实现原理与源码解析 —— 精品合集》
- 《Spring 实现原理与源码解析 —— 精品合集》
- 《MyBatis 实现原理与源码解析 —— 精品合集》
- 《Spring MVC 实现原理与源码解析 —— 精品合集》
- 《Spring Boot 实现原理与源码解析 —— 精品合集》
- 《数据库实体设计合集》
- 《Java 面试题 —— 精品合集》
- 《Java 学习指南 —— 精品合集》
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
修饰符,不允许子类重写。