首页 > 编程知识 正文

Kong 使用第三方的go插件

时间:2023-11-20 15:01:42 阅读:291989 作者:VXYZ

本文将针对Kong使用第三方的go插件进行详细阐述。首先,我们解答下标题的问题:如何使用第三方的go插件?我们可以通过编写插件来达到此目的。

一、插件架构介绍

Kong的插件系统采用基于OpenResty的Lua语言编写的插件,但是Lua语言对于部分开发人员可能不是十分熟悉,因此我们可以使用go语言来编写插件。在这种情况下,我们需要使用Kong提供的插件开发工具(PDK)来进行操作。

Kong插件的架构主要由三个部分构成:处理阶段、插件逻辑和PDK。

  • 处理阶段:Kong处理请求时,按照预定义的流程将几个处理阶段串联起来。Kong提供了几个处理阶段,例如:SSL、身份验证和HTTP,我们可以根据需要将插件放置在相应的处理阶段。
  • 插件逻辑:这是我们编写的插件代码,可以是OpenResty的Lua语言或者是go语言。这部分代码将在处理阶段执行。
  • PDK:PDK是Kong提供的插件开发工具。它是一组API接口,可以在插件中提供更为强大的功能。例如:访问请求头部信息、获取客户端IP地址或者直接向客户端发送请求响应等操作。

二、插件编写流程

接下来我们将介绍如何编写一个基于go语言的Kong插件。假设我们需要编写一个简单的插件来记录每个请求的HTTP头信息和IP地址。

1. 执行环境配置

首先,我们需要配置和安装Go开发环境和Kong。确保Go版本高于或等于1.14,并且您已经安装了Kong。

2. 生成插件模板

我们可以使用kong-go-plugin-toolkit工具来生成Go插件模板,它提供了插件框架的核心代码结构。在命令行中输入以下命令:

$ go get github.com/kong/go-plugin-toolkit/v2/cmd/kong-go-plugin-toolkit
$ kong-go-plugin-toolkit init --type go --name header-logger --description "Log HTTP headers and IP address of the request"

这将生成一个名为header-logger的文件夹,其中包含“Empty.go”、“Main.go”和“Module.hcl”文件。

3. 实现插件逻辑

在“Main.go”文件中,我们实现插件的逻辑。首先,我们需要在文件头部添加导入声明:

package main

import (
	"context"
	"github.com/kong/go-plugin-toolkit/v2/kong"
	"net/http"
)

然后,在`Handler`函数中,我们编写请求处理逻辑来记录请求头信息和IP地址:

func (pl *Plugin) Handler(ctx context.Context, req *http.Request) (*http.Response, error) {
	headers := req.Header
	ip := kong.GetIP(req)

	log.Printf("Request headers: %v", headers)
	log.Printf("Request IP address: %s", ip)

	return pl.Next(ctx, req)
}

这里我们使用了`log`包记录请求头和IP地址。`kong.GetIP`函数可以获取请求的IP地址。

4. 安装插件

完成插件的编写之后,我们需要安装并配置插件。在命令行中输入以下命令:

$ make install-dev

这将构建和安装插件。接下来,在“Module.hcl”文件中进行配置,定义插件的名称、版本和处理阶段:

package = "kong.plugins.header-logger"
version = "0.1.0"

server {
    plugins = {
        "header-logger" = true
    }

    # Put the plugin at the beginning of the plugins list
    plugins_config = {
        "header-logger" = {
            path = "/usr/local/lib/kong/plugins/header-logger.so"
        }
    }
}

service {
    name = "mock"
    path = "/mock"
    routes = {
        {
            name = "mock"
            paths = ["/mock"]
            plugins = {
                "header-logger" = {
                    config = {
                        foo = "bar"
                    }
                }
            }
        }
    }
}

consumer {

}

`Plugin`的`package`和`version`是必须的,`server.plugins`和`service.routes.plugins`中的插件名称将与插件的文件夹名称相同。注意,`server.plugins_config`是一个可选配置项,指定了插件的位置和额外的配置信息。

5. 测试插件

最后,我们可以启动Kong并测试插件。在命令行中输入以下命令:

$ kong start -c /path/to/Module.hcl

使用curl命令发送请求来测试插件:

curl -i -X GET http://localhost:8000/mock --header "Authorization: Bearer foobar"

现在,您应该能够在Kong日志中看到请求头信息和IP地址的记录。

三、插件开发最佳实践

在插件开发过程中,以下是一些最佳实践:

  • 按需使用PDK:PDK是Kong提供的插件开发工具,使用它可以提供更为强大的功能。但是,在需要时才使用PDK,因为这将增加插件的复杂性和执行时间。
  • 合理使用日志:日志是插件开发中必不可少的工具,但是过多的日志输出将影响Kong的性能。因此,建议使用合理的日志级别,并定期清除过时的日志文件。
  • 尝试使用插件板:插件板是一种通用的插件模板,我们可以在此基础上构建自己的插件。使用插件板可以减少代码编写和测试的时间。

四、总结

在本文中,我们详细阐述了如何使用Kong的第三方go插件。通过安装开发环境、生成插件模板、编写插件逻辑、配置和安装插件以及测试插件,我们顺利完成了一个简单的Kong插件,并介绍了插件开发的最佳实践。希望本文能够对您的Kong插件开发工作有所帮助。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。