开发规范

背景

北极星服务端整体都是一个插件化的设计,当前支持插件化的核心功能模块有

插件名称插件定义文件
协议层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 的插件。

插件源码

初始化插件项目

  1. 创建插件项目文件夹

    1. mkdir polaris-server-plugin-${plugin-name}
  2. 进入第一步创建的文件夹:polaris-server-plugin-${plugin-name},执行 go mod init 命令

    1. go mod init ${module name}
  3. 进入第一步创建的文件夹:polaris-server-plugin-${plugin-name},创建项目的 README 文档来描述这个插件的使用

  4. 引入北极星服务端依赖

    1. go get github.com/polarismesh/polaris@${release version}

至此,一个北极星服务端插件项目就初始化完成了,接着就要开始进入我们的插件编写阶段。

插件编写

在编写插件前,我们需要先了解下,我们想要实现的插件定义是什么样的,因此这里我们要实现的是一个服务实例事件插件,因此来看下这个插件的定义

  1. // Plugin 通用插件接口
  2. type Plugin interface {
  3. // Name 插件名称,需要唯一
  4. Name() string
  5. // Initialize 初始化插件,插件自行解析 ConfigEntry 转为插件所需要的配置对象
  6. Initialize(c *ConfigEntry) error
  7. // Destroy 插件销毁
  8. Destroy() error
  9. }
  10. // DiscoverChannel is used to receive discover events from the agent
  11. type DiscoverChannel interface {
  12. Plugin
  13. // PublishEvent 发布一个服务事件
  14. // @param event 服务事件信息
  15. PublishEvent(event model.DiscoverEvent)
  16. }

因此,我们的自定义服务实例事件插件就需要实现 Plugin 以及 DiscoverChannel 两个 interface,然后将上报 Loki 的动作在 PublishEvent 方法中进行完成。

至此,我们就可以开始编自定义插件,实现将 model.DiscoverEvent 信息写入到 Loki 中

插件注册

完成插件编写后,我们还需要主动将插件信息注册到北极星服务端中,这里北极星服务端利用了 golang 中的 init 机制来实现插件实例的注册。

因此,我们还需要在我们的插件代码中,添加下面的插件注册动作。

  1. package loki
  2. import "github.com/polarismesh/polaris/plugin"
  3. func init() {
  4. d := &discoverEventLoki{}
  5. plugin.RegisterPlugin(d.Name(), d)
  6. }

至此,一个自定义的服务实例事件插件的开发流程到这里就全部结束了。

如何使用插件

  1. 下载北极星服务端源码

    1. git clone https://github.com/polarismesh/polaris.git
  2. 进入 polaris 目录, 并切换到对应的版本 TAG

    1. cd polaris
    2. git checkout ${release version}
  3. 进入 polaris 目录,执行命令引入相关插件

    1. go get github.com/polaris-contrib/polaris-server-plugin-discoverevent-loki@{version}
  4. (可选)进入 polaris 目录,执行依赖整理

    1. go mod tidy -compat=1.17
  5. 编辑 polaris/plugin.go, 在 import 块中添加

    1. import (
    2. ...
    3. _ "github.com/polarismesh/polaris/plugin/discoverevent/loki" # 引入插件,并触发插件的自动注册逻辑
    4. )
  6. 执行 build.sh 构建 polaris-server