这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

插件开发

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 的插件。

插件源码

初始化插件项目

  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

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

然后重启北极星服务端即可