服务端插件开发
背景
北极星服务端整体都是一个插件化的设计,当前支持插件化的核心功能模块有
插件名称 | 插件定义文件 |
---|---|
协议层 | apiserver.go |
存储层 | store.go |
资源鉴权 | auth.go |
除了这三个核心模块支持插件化之外,还有一些旁路功能,北极星也进行了插件化的设计
插件名称 | 插件定义文件 |
---|---|
操作审计日志 | plugin/history.go |
服务实例事件 | plugin/discoverevent.go |
服务发现统计 | plugin/discoverstatis.go |
健康检查 | plugin/healthchecker.go |
接入层限流 | plugin/ratelimit.go |
配置管理 | plugin/cmdb |
无论是核心模块还是旁路功能模块,北极星服务端都对其进行了插件化的设计,可以快速的通过编写相关插件来扩展北极星的能力。譬如通过对协议层 apiserver 的扩展,北极星服务端快速支持了 http 以及 grpc 协议的接入,同时实现了 xds 协议以及 eureka 协议的接入。
那么如何根据北极星服务端提供的插件扩展点,来开发自己的插件呢?
如何编写插件
如何编写北极星服务端插件呢?这里我们以开发一个用于将服务实例事件上报到 Loki 的插件。
初始化插件项目
-
创建插件项目文件夹
mkdir polaris-server-plugin-${plugin-name}
-
进入第一步创建的文件夹:polaris-server-plugin-${plugin-name},执行 go mod init 命令
go mod init ${module name}
-
进入第一步创建的文件夹:polaris-server-plugin-${plugin-name},创建项目的 README 文档来描述这个插件的使用
-
引入北极星服务端依赖
go get github.com/polarismesh/polaris@${release version}
至此,一个北极星服务端插件项目就初始化完成了,接着就要开始进入我们的插件编写阶段。
插件编写
在编写插件前,我们需要先了解下,我们想要实现的插件定义是什么样的,因此这里我们要实现的是一个服务实例事件插件,因此来看下这个插件的定义
// Plugin 通用插件接口
type Plugin interface {
// Name 插件名称,需要唯一
Name() string
// Initialize 初始化插件,插件自行解析 ConfigEntry 转为插件所需要的配置对象
Initialize(c *ConfigEntry) error
// Destroy 插件销毁
Destroy() error
}
// DiscoverChannel is used to receive discover events from the agent
type DiscoverChannel interface {
Plugin
// PublishEvent 发布一个服务事件
// @param event 服务事件信息
PublishEvent(event model.DiscoverEvent)
}
因此,我们的自定义服务实例事件插件就需要实现 Plugin 以及 DiscoverChannel 两个 interface,然后将上报 Loki 的动作在 PublishEvent 方法中进行完成。
至此,我们就可以开始编自定义插件,实现将 model.DiscoverEvent 信息写入到 Loki 中
插件注册
完成插件编写后,我们还需要主动将插件信息注册到北极星服务端中,这里北极星服务端利用了 golang 中的 init 机制来实现插件实例的注册。
因此,我们还需要在我们的插件代码中,添加下面的插件注册动作。
package loki
import "github.com/polarismesh/polaris/plugin"
func init() {
d := &discoverEventLoki{}
plugin.RegisterPlugin(d.Name(), d)
}
至此,一个自定义的服务实例事件插件的开发流程到这里就全部结束了。
如何使用插件
-
下载北极星服务端源码
git clone https://github.com/polarismesh/polaris.git
-
进入 polaris 目录, 并切换到对应的版本 TAG
cd polaris git checkout ${release version}
-
进入 polaris 目录,执行命令引入相关插件
go get github.com/polaris-contrib/polaris-server-plugin-discoverevent-loki@{version}
-
(可选)进入 polaris 目录,执行依赖整理
go mod tidy -compat=1.17
-
编辑 polaris/plugin.go, 在 import 块中添加
import ( ... _ "github.com/polarismesh/polaris/plugin/discoverevent/loki" # 引入插件,并触发插件的自动注册逻辑 )
-
执行 build.sh 构建 polaris-server