服务端插件开发

背景

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

插件名称 插件定义文件
协议层 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. 创建插件项目文件夹

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

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

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

    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)
}

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

如何使用插件

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

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

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

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

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

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