自定义kong插件golang版本

news2024/11/15 13:23:32

开发一个go版本的kong 插件,通常需要以下3个步:
基于kong提供的go语言版本的PDK编写并且编译kong插件 --》 在kong的kong.conf文件中配置插件位置 --> 通过kong的admin api来启用插件

一、使用go语言编写kong插件

1、定义Config对象

type Config struct {
	Message string
}

2、定义New()来实例化Config对象

func New() interface{} {
	return &Config{}
}

3、定义access阶段对请求进行处理

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

4、将go-pdk/server包导入到项目中

import (
	"fmt"
	"log"

	"github.com/Kong/go-pdk"
	"github.com/Kong/go-pdk/server"
)

5、创建一个main函数,使用server.startServer来启动

func main() {
	server.StartServer(New, Version, Priority)
}

Add a main() function that calls server.StartServer(New, Version, Priority).

6、将上面所写的代码执行编译成一个可执行文件

上面的代码都是来源于kong的go-plugins中example代码,地址为https://github.com/Kong/go-plugins/tree/master
这里我们直接在linux服务器上通过git下载该代码即可

6.1、下载plugins对应的源码

[root@min ~]# git clone https://github.com/Kong/go-plugins.git
Cloning into 'go-plugins'...
remote: Enumerating objects: 76, done.
remote: Counting objects: 100% (51/51), done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 76 (delta 27), reused 22 (delta 17), pack-reused 25
Unpacking objects: 100% (76/76), done.

6.2、进行到下载好的代码包中,并进行编译

[root@min ~]# cd go-plugins/
[root@min go-plugins]# ls
go-hello.go  go-hello-lm.go  go-log.go  go-log-lm.go  go.mod  go.sum  LICENSE  Makefile  README.md
[root@min go-plugins]# go build go-hello.go 
[root@min go-plugins]# ls
go-hello  go-hello.go  go-hello-lm.go  go-log.go  go-log-lm.go  go.mod  go.sum  LICENSE  Makefile  README.md

6.3、 创建一个存放编译好的go-hello文件

[root@min go-plugins]# mkdir -p /etc/kong/plugins

6.4、 将go-hello移入到/etc/kong/plugins目录中

[root@min go-plugins]# mv go-hello /etc/kong/plugins/
[root@min go-plugins]# ls
go-hello.go  go-hello-lm.go  go-log.go  go-log-lm.go  go.mod  go.sum  LICENSE  Makefile  README.md
[root@min go-plugins]# ls /etc/kong/plugins/
go-hello

二、在kong的配置文件kong.conf中添加对插件的引用

2.1、kong.conf配置kong插件位置

在kong的配置文件中写入如下内容,后面通过-v /etc/kong/:/etc/kong/ 把宿主机的配置文件挂在到docker中去

[root@min kong]# vi kong.conf 
[root@min kong]# cat kong.conf 
plugins = bundled,go-hello
pluginserver_names = go-hello
pluginserver_go_hello_socket = /usr/local/kong/go-hello.socket
pluginserver_go_hello_start_cmd = /etc/kong/plugins/go-hello
pluginserver_go_hello_query_cmd = /etc/kong/plugins/go-hello -dump

[root@min kong]# 

# 2.2、使用docker启动kong容器

如果还不知道怎么安装kong的,请参考本人之前写kong安装指导,地址:https://blog.csdn.net/zhangshenglu1/article/details/130934300

[root@min kong]# docker run -d --name kong-gateway \
>  --network=kong-net \
>  -e "KONG_DATABASE=postgres" \
>  -e "KONG_PG_HOST=kong-database" \
>  -e "KONG_PG_USER=kong" \
>  -e "KONG_PG_PASSWORD=kongpass" \
>  -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
>  -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
>  -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
>  -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
>  -e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
>  -e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
>  -e KONG_LICENSE_DATA \
>  -p 8000:8000 \
>  -p 8443:8443 \
>  -p 8001:8001 \
>  -p 8444:8444 \
>  -p 8002:8002 \
>  -p 8445:8445 \
>  -p 8003:8003 \
>  -p 8004:8004 \
>  -v /etc/kong:/etc/kong \
>  kong/kong-gateway:3.3.0.0
1a1768bddb94fee9a23249d14ba2e6f45c54950c0d35d1bb76fce72cce964e15

安装完成后,查看对应的kong-gateway容器是否已经起来
在这里插入图片描述
这个插件的左右的就是获取发送的请求host,然后添加一个x-hello-from-go响应头。

三、启用go-hello插件

[root@min kong]# curl -X POST http://localhost:8001/plugins/ \
      --data "name=go-hello" \
      --data "config.message=go-hello" 
{"protocols":["grpc","grpcs","http","https"],"id":"d5336e66-1ff3-47ea-9b2a-31f8b52c9b05","consumer":null,"instance_name":null,"config":{"message":"go-hello"},"tags":null,"updated_at":1685563005,"name":"go-hello","ordering":null,"service":null,"enabled":true,"route":null,"created_at":1685563005}

请求中name是必传参数,代表要开启是哪个插件,我们这里配置的插件名称是go-hello,所以name的值需要给go-hello。
config.message的值可以随意指定,这里由于没有指定servicename,serviceid
/route等信息,所以是全局生效的。
如果是想针对服务生效可以使用如下命令
curl -X POST
http://localhost:8001/services/SERVICE_NAME|SERVICE_ID/plugins
–data “name=go-hello”
–data “config.message=go-hello”
如果只想针对某个route生效,那么可以使用如下命令
curl -X POST http://localhost:8001/routes/ROUTE_NAME|ROUTE_ID/plugins
–data “name=go-hello”
–data “config.message=go-hello”

检查插件是否已经运行成功,这里我们可以在konga上观看,或者通过admin api接口调用查看。

在这里插入图片描述
从这里可以可以看到,我们go-hello已经安装好了

四、测试go-hello插件的功能是否正常

我们从postman上发起请求调用,然后观察响应头中是否有x-hello-from-go响应头,从测试结果可以看到符合我们的预期。至此,我们完成一个简单的kong的插件开发,并进行配置!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式软件测试怎么实现自动化测试?

说起嵌入式软件测试,我们先快速了解一下嵌入式软件自身的特点。嵌入式软件具有实时性、内存空间有限、I/O通道少,而且要求功耗低、高可靠性,对成本也比较敏感,和硬件关联性强等特点。因此,嵌入式软件的测试与一般商用软…

【Vue】data属性,v-for,diff算法,composition API

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 Vue3data属性插值语法修饰符v-modelv-for虚拟DOMdiff算法 响应式原理v-for中的keynextTick comp…

Vue3 小兔鲜:项目起步

Vue3 小兔鲜:项目起步 Date: May 31, 2023 创建项目并整理目录 npm init vuelatestsrc目录调整 需要补充创建以下文件: git 管理项目 基于create-vue 创建出来的项目默认没有初始化git仓库,需要我们手动初始化 执行命令井完成首次提交 …

通过脚本将本地文件上传到服务器 WinSCP

通过脚本将本地文件上传到服务器 准备工作 安装好WinSCP软件。服务器上配置了Java环境。 编写脚本 以下是一个使用WinSCP软件的脚本示例,用于将本地的JAR包上传到服务器并启动: echo offset WINSCP_PATH"C:\Program Files (x86)\WinSCP\WinSCP.…

中国人民大学与加拿大女王大学金融硕士项目——在职读金融硕士,没想到收获这么多

随着社会经济的快速发展,金融专业的报考越来越受欢迎。近些年来,市场对于金融专业的高端人才需求不断增加。工作多年的金融人或有计划跳槽到金融领域的群体,都想通过业余时间充电以增强在金融行业的竞争力。在职读金融硕士有用吗?…

基于Element的Select下拉选组件(支持快速全选)

Select下拉选增强 支持快速多选、tooltip等 示例图 1. quicklySelectAll: boolean 在多选模式下支持快速全选取消全选,默认开启 <template><div id"app"><div class"container"><el-form ref"formRef" :model"formD…

Framework开发环境搭建

Framework开发环境搭建 开启Android Framework之旅&#xff0c;一步步记录自己学习过程。 硬件配置 RAM&#xff1a;最低16GB&#xff0c;建议32GB&#xff0c;有条件64GB&#xff0c;内存越高&#xff0c;编译时间越短ROM&#xff1a;最低400GB&#xff0c;代码250GB构建15…

第八篇、基于Arduino uno,获取MAX30102心率传感器的心率信息——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;第一个值是原始的IR值&#xff0c;第二个值是实时的心跳&#xff0c;第三个值是平均心跳&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;MAX30102心率传感器的外观如下…

Linux:开机自动挂载磁盘出错 两种解决办法 /etc/fstab

假如在/etc/fstab文件中有一个错误的语句 但是我们假装不知道&#xff0c;直接给他重启 第一种 开机自动进入到一个这样的界面 在这我们直接输入root的密码 进入到root下 直接 vi /etc/fstab 先将错误的删除掉&#xff0c;等正常开机了再去做挂载 然后重启 正常进入系统 第二…

基于机智云物联网平台的智能种树小车

前言:针对目前人工种树效率低的问题&#xff0c;设计了一种全自助高效智能种树小车。介绍了装置的结构组成&#xff0c;剖析了装置的运动机理。通过SolidWorks三维软件对传动部件进行了结构设计。 利用蓝牙模块实现了种植过程的信息传递、发送命令等&#xff0c;物联网机智云模…

Fiddler+Proxifer 实现PC端软件的抓包

FIddlerProxifer 实现PC端软件的抓包 下载Proxifer https://www.proxifier.com/download/ Proxifier配置 默认是关闭HTTP协议的&#xff0c;使用需要配置开启&#xff0c;配置文件->高级->HTTP代理服务器->启用HTTP代理服务器支持 配置Proxifer代理服务器&#x…

4.数据结构期末复习之森林和最优二叉树(哈夫曼树)

1.森林的定义&#xff1a;m>0 颗互不相交的树的集合 //树和森林的区别 2.森林的遍历 for森林里的树(前序和后序遍历) 3.树转二叉树(兄弟连起来,去右线) 1.兄弟之间加线(树和树之间不加) 2.右孩子去线(只保留第一个结点的线) 3.顺时针调整45度位置变成二叉树 4.森林转二叉…

网络安全 2023 年为什么如此吃香?事实原来如此.....

前言 由于我国网络安全起步晚&#xff0c;所以现在网络安全工程师十分紧缺。俗话说:没有网络安全就没有国家安全 为什么选择网络安全&#xff1f; 十四五发展规划建议明确提出建设网络强国&#xff0c;全面加强网络安全保障体系和能力建设&#xff0c;加强网络文明建设&#x…

OpenGl之变换

目录 缩放 位移 齐次坐标(Homogeneous Coordinates) 旋转 缩放 对一个向量进行缩放(Scaling)就是对向量的长度进行缩放&#xff0c;而保持它的方向不变。由于我们进行的是2维或3维操作&#xff0c;我们可以分别定义一个有2或3个缩放变量的向量&#xff0c;每个变量缩放一个轴…

软件测试之-测试用例写作规范

软件测试用例得出软件测试用例的内容&#xff0c;其次&#xff0c;按照软件测试写作方法&#xff0c;落实到文档中&#xff0c;两者是形式和内容的关系&#xff0c;好的测试用例不仅方便自己和别人查看&#xff0c;而且能帮助设计的时候考虑的更周。 一个好的测试用例必须包含…

语音信号处理——噪声抑制

简介 噪声抑制技术用于消除背景噪声&#xff0c;改善语音信号的信噪比和可懂度&#xff0c;让人和机器听的更清楚常见的噪声种类&#xff1a;人声噪声、街道噪声、汽车噪声噪声抑制方法的分类&#xff1a; 按照输入通道数分&#xff1a;单通道降噪、多通道降噪按照噪声统计特性…

Overview of Blockchain区块链概述

目录 1.def 2.smart contract 3.Consensus mechanism 4.blockchain fork 比特币诞生的几年后&#xff0c;人们开始意识到区块链技术本身的潜力&#xff0c;慢慢走出了自己的发展路线。 通常区块链被定义为一种去中心化的分布式账本技术&#xff0c;最初用来记录信息&#x…

洛谷——SP1-TEST - Life, the Universe, and Everything +注册SPOJ的方法

文章目录 TEST - Life, the Universe, and Everything题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示Information注意注册SPOJ的方法我应该如何注册 SPOJ&#xff1f;注册流程原因 AC代码 TEST - Life, the Universe, and Everything 题面翻译 从输入读…

从零搭建微服务-注册中心(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 核心依赖 需要注册配置中心的服务引入下面 …

CountDownLatch详解以及用法示例

一、什么是CountDownLatch CountDownLatch中count down是倒数的意思&#xff0c;latch则是门闩的含义。整体含义可以理解为倒数的门栓&#xff0c;似乎有一点“三二一&#xff0c;芝麻开门”的感觉。 CountDownLatch的作用也是如此&#xff0c;在构造CountDownLatch(int coun…