1 - 开发规范
背景
北极星服务端整体都是一个插件化的设计,当前支持插件化的核心功能模块有
插件名称 | 插件定义文件 |
---|---|
协议层 | 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
2 - CMDB插件开发
背景
在进行服务发现发现时,我们都希望能够做到同机房、同地域的就近路由,以减少网络调用的延迟。而要做到就近路由,就必须知道主调节点和被调节点的地域信息,因此我们可以通过开发北极星服务端的 CMDB 插件,对接至自己的 CMDB 系统,从而填充每个实例的地域信息,以到达实现就近路由的目标。
为了方便快速的将北极星的 CMDB 扩展点对接至用户的 CMDB 系统,我们设计了一套通用的 CMDB OpenAPI,开发者只需要按照该 OpenAPI 实现一个 CMDB 查询服务端,即可将北极星快速对接到自己的 CMDB 系统中去。
协议定义
发起 CMDB 查询请求
METHOD: POST
HEADER: Authorization: 访问 Token // 可选
BODY
{
"request_id": String,
"page_no": Number,
"page_size": Number // 固定,每次 100 拉取
}
CMDB Server 的返回响应
{
"total": Number, // 总数
"size": Number, // 当前放回条数
"code": Number,
"info": String,
"data": [
{
"ip": "127.0.0.1",
"type": "host", # 固定
"region": {
"name": String
},
"zone": {
"name": String
},
"campus": {
"name": String
},
}
]
}
服务端启用
修改 polaris-server.yaml 配置
# 插件配置
plugin:
cmdb:
name: memory
option:
url: "{ CMDB 查询服务端 OpenAPI 地址 }"
interval: 60s
然后重启北极星服务端即可