一、编写插件
Kong网关通过Go PDK支持 Go 语言,Go PDK 是一个为 Kong Gateway 提供 Go 绑定的库。
要在 Go 中编写 Kong Gateway 插件,需要以下几步:
- 定义一个structure结构体来保存配置。
- 编写一个New()函数来创建结构体的实例。
- 向该结构体添加方法来处理业务逻辑,如鉴权、日志等,kong提供6个方法供我们使用。
- 添加一个main()调用server.StartServer(New, Version, Priority).
注意: Kong Go 插件库用例
/*
A "hello world" plugin in Go,
which reads a request header and sets a response header.
*/
package main
import (
"fmt"
"log"
"github.com/Kong/go-pdk"
"github.com/Kong/go-pdk/server"
)
func main() {
server.StartServer(New, Version, Priority)
}
var Version = "0.2"
var Priority = 1
type Config struct {
Message string
}
func New() interface{} {
return &Config{}
}
func (conf Config) Access(kong *pdk.PDK) {
host, err := kong.Request.GetHeader("host")
if err != nil {
log.Printf("Error reading 'host' header: %s", err.Error())
}
message := conf.Message
if message == "" {
message = "hello"
}
kong.Response.SetHeader("x-hello-from-go", fmt.Sprintf("Go says %s to %s", message, host))
}
KONG提供以下6个函数供我们使用,可以在不同阶段使用不同函数处理业务逻辑:
- Certificate(证书):该方法用于管理用于客户端和API之间安全通信的SSL/TLS证书。它可以处理SSL终止、SSL卸载和SSL透传,并提供生成、上传和管理证书和密钥的选项。
- Rewrite(重写):该方法允许您重写或转换请求和响应,以更改它们的路径、头部、查询参数等信息。它可以用于路由请求到不同的上游服务,以及从上游服务中修改响应。
- Access(访问):该方法用于控制对API的访问权限,包括身份验证、授权和限流等功能。它可以实现基于令牌、API密钥、IP地址、HTTP方法等多种访问控制策略。
- Response(响应):该方法用于修改或拦截API的响应,以便进行处理或转换。它可以用于添加、删除或修改响应头、响应正文和状态码等信息。
- Preread(预读):该方法允许您在Nginx处理请求之前读取请求的一部分,以便进行处理或转发。它可以用于处理连接请求和身份验证等场景。
- Log(日志):该方法用于记录API请求和响应的信息,以便进行跟踪和监视。它可以将请求和响应信息记录到文件、数据库、Syslog等不同的存储介质中。
二、安装插件
以docker-compose编排部署为例(docker-compose.yml链接):
要安装 Go Kong Gateway 插件,需要以下几步:
- 将go程序build成可执行二进制程序
- 将go程序挂载到kong镜像中
- 配置参数
KONG_PLUGINS: bundled,go-hello
KONG_PLUGINSERVER_NAMES: go-hello
KONG_GO_PLUGINS_DIR: /usr/local/bin/ KONG_PLUGINSERVER_GO_HELLO_QUERY_CMD: go-hello -dump
解释:
KONG_PLUGINS: 用于指定要加载的 Kong 插件。在这里, bundled 表示要加载 Kong 内置的插件, go-hello 则表示要加载自定义的 Go 插件。
KONG_PLUGINSERVER_NAMES: 用于指定自定义插件的名称。在这里, go-hello 表示自定义插件的名称为 go-hello。
KONG_GO_PLUGINS_DIR: 用于指定存放自定义 Go 插件的目录。在这里, /usr/local/bin/ 表示自定义插件存放在 /usr/local/bin/ 目录下。
KONG_PLUGINSERVER_GO_HELLO_QUERY_CMD: 用于指定自定义插件启动时的命令。在这里, go-hello -dump 表示启动自定义插件时要执行的命令为 go-hello -dump,其中 -dump
- docker-compose up 启动容器即可生效