借助Kong记录接口的请求和响应内容

和APISIX类似,Kong也是一个Api GateWay。

运行在调用Api之前,以插件的扩展方式为Api提供管理, 如 鉴权、限流、监控、健康检查等. Kong是基于Lua语言、Nginx以及OpenResty开发的,拥有动态路由、负载均衡、高可用、高性能、熔断(基于健康检查)等功能。

和APIXIS不同,不用etcd做存储,而使用PostgreSQL,最早用的是Apache Cassandra


基础使用


安装过程忽略,可使用docker一键搭建


假设我有一个服务A,对外提供多个接口。现在想要使用Kong对其进行管理

服务A所在的机器,和运行kong的机器不一定是一台.

Kong就是个网关,统一入口。

服务A如下,

package main

import (
        "fmt"
        "net/http"
        "time"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
        if r.URL.Path == "/hello" {
                currentTime := time.Now().Format("2006-01-02 15:04:05")
                response := fmt.Sprintf("你好,当前时间是%s", currentTime)
                fmt.Fprint(w, response)
        } else {
                http.NotFound(w, r)
        }
}

func main() {
        http.HandleFunc("/", helloHandler)
        fmt.Println("Server is running on port 58888")
        err := http.ListenAndServe(":58888", nil)
        if err != nil {
                fmt.Println("Error starting server:", err)
        }
}

curl 服务所在机器的公网IP:58888/hello 会返回当前的时间


在kong的控制台, http://Kong所在机器的公网IP:8002 创建一个Gateway Service,

其中,Host写要代理的那个服务的地址(即A所在机器的公网IP),端口写相应的端口

如果是域名,则端口写默认的80


然后新建一条Routes

然后, 就可以通过 curl http://Kong服务的公网IP:8000/上图写的Paths/hello 来访问了

得到的结果还是一样的,但会先通过kong,就能做很多事情了…比如限流,鉴权,日志啥的…


记录接口的请求和响应内容


Kong也提供了很多直接可用的插件,下面以HTTP Log插件为例, 使用该插件,可以记录接口的请求和响应内容


在Plugins处点击New Plugin,

搜索HTTP


再写一个服务(该服务监听20017端口),提供一个接口,用来接收:58888 这个服务全部的请求和响应内容

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func getRequestHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		w.WriteHeader(http.StatusMethodNotAllowed)
		return
	}

	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		fmt.Fprintf(w, "Error reading request body: %v", err)
		return
	}
	defer r.Body.Close()

	log.Printf("Received request: %s", string(body))

	// 在这里可以对请求体进行处理
	// ...

	// 如果需要响应内容,可以在这里写入响应体
	w.WriteHeader(http.StatusOK)
	fmt.Fprint(w, "Request received successfully")
}

func main() {
	http.HandleFunc("/getrequest", getRequestHandler)

	log.Println("Starting server on port 20017...")
	err := http.ListenAndServe(":20017", nil)
	if err != nil {
		log.Fatalf("Failed to start server: %v", err)
	}
}

然后执行 curl http://kong所在机器的公网IP:port/xxxx/hello\?1121312

:20017服务能够收到请求如下:

{
	"service": {
		"retries": 5,
		"created_at": 1716538997,
		"updated_at": 1716551161,
		"write_timeout": 60000,
		"port": 58888,
		"name": "xxxxxxx",
		"protocol": "http",
		"connect_timeout": 60000,
		"read_timeout": 60000,
		"host": "111.222.222.111",
		"enabled": true,
		"ws_id": "7aa29e13-25cb-4920-992e-fe5b64576c21",
		"tags": ["xxxxx-test"],
		"id": "55bd77b4-b182-4e6b-87f1-a46608d27435"
	},
	"client_ip": "1.2.3.4",
	"route": {
		"created_at": 1716551271,
		"updated_at": 1716551271,
		"regex_priority": 0,
		"service": {
			"id": "55bd77b4-b182-4e6b-87f1-a46608d27435"
		},
		"paths": ["/xxxxx"],
		"name": "xxxxxxx123",
		"path_handling": "v0",
		"id": "8481a0d0-05c2-4631-89eb-19d9aad10642",
		"ws_id": "7aa29e13-25cb-4920-992e-fe5b64576c21",
		"protocols": ["http"],
		"strip_path": true,
		"preserve_host": false,
		"request_buffering": true,
		"response_buffering": true,
		"tags": [],
		"https_redirect_status_code": 426
	},
	"started_at": 1716555189008,
	"source": "upstream",
	"tries": [{
		"balancer_start": 1716555189008,
		"balancer_start_ns": 1.7165551890087e+18,
		"ip": "110.120.119.114",
		"balancer_latency": 0,
		"port": 58888,
		"balancer_latency_ns": 15616
	}],
	"response": {
		"size": 306,
		"status": 200,
		"headers": {
			"x-kong-request-id": "d32e6a5e11bec9085663513c9430565b",
			"date": "Fri, 24 May 2024 12:53:09 GMT",
			"via": "kong/3.6.1",
			"x-kong-proxy-latency": "0",
			"content-length": "41",
			"connection": "close",
			"x-kong-upstream-latency": "98",
			"content-type": "text/plain; charset=utf-8"
		}
	},
	"upstream_status": "200",
	"upstream_uri": "/hello",
	"latencies": {
		"kong": 0,
		"request": 98,
		"proxy": 98
	},
	"request": {
		"size": 94,
		"id": "d32e6a5e11bec9085663513c9430565b",
		"headers": {
			"user-agent": "curl/8.4.0",
			"host": "xxx.xxx.xxx.xxx:8000",
			"accept": "*/*"
		},
		"url": "http://xxxxxxxx:8000/xxxxx/hello",
		"querystring": {},
		"uri": "/xxxxx/hello",
		"method": "GET"
	}
}

但发现此时,request内容是比较详细的,但缺少response部分


参考 https://tech.aufomm.com/how-to-log-request-and-response-body-with-kong/

搜索Kong Functions (Pre-Plugins)插件,

并设置Access为: kong.log.set_serialize_value("request.body", kong.request.get_raw_body())

Body Filter为: kong.log.set_serialize_value("response.body", kong.response.get_raw_body())

再次执行 curl http://Kong所在机器公网IP:8000/xxxxx/hello\?1121312

此时就能获取到完整的response内容

本文由mdnice多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能仓储物流系统(WMS)系列-管理查询调整

好的应用系统应是细分简单,界面简洁易操作,程序代码简洁易懂的。

大型跨境商城系统平台的技术架构分析

随着全球化的深入发展,大型跨境电商平台在如今的商业环境中扮演着越来越重要的角色。这些平台不仅仅是为了提供商品和服务,它们更是连接不同国家和地区消费者与供应商之间的桥梁。在这篇博客中,我们将深入探讨大型跨境商城系统平台的技术架构…

Hadoop运行wordcount实例任务卡在job running的多种情况及解决方法

第一种:配置问题 这是别人的图片,据楼主排查解决是因为hosts配置问题… 现象:各种无法运行、启动 解决办法: 1、修改日志级别 export HADOOP_ROOT_LOGGERDEBUG,console 查看下详细信息,定位到具体问题解决 第二种&…

二叉树链式结构的前序_中序_后续_层序遍历【详细图解】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:LiUEEEEE                        …

前端知识1-4:性能优化进阶

性能优化进阶 Navigation Timing API navigationStart / end 表示从上一个文档卸载结束时 > 如果没有上一个文档,这个值和fetchStart相等 unloadEventStart / end 标识前一个网页unload的时间点 redirectStart / end 第一个http重定向发生和结束的时间 fetch…

【Numpy】深入解析numpy中的split方法

NumPy中的split方法:深入理解与实际应用 🌈 欢迎莅临我的个人主页👈这里是我深耕Python编程、机器学习和自然语言处理(NLP)领域,并乐于分享知识与经验的小天地!🎇 🎓 博主…

windows镜像虚拟机创建共享文件夹详细步骤 -- 和本地电脑传输文件

第一步:关闭客户机 第二步:右击“虚拟机名称”或菜单栏的“虚拟机”–>“设置” 网络适配器选择NAT或者其他的都可以 来到“选项”,启用共享文件夹,具体如下图:点击添加,添加主机文件夹。然后确定 第三步…

百度ERNIE系列预训练语言模型浅析(4)-总结篇

总结:ERNIE 3.0与ERNIE 2.0比较 (1)相同点: 采用连续学习 采用了多个语义层级的预训练任务 (2)不同点: ERNIE 3.0 Transformer-XL Encoder(自回归自编码), ERNIE 2.0 Transformer Encode…

mp4文件损坏怎么修复?三种修复办法分享!

对于我们平时使用到的MP4视频文件,有时候在播放时会遇到文件损坏,无法正常打开,针对这个问题,如何修复损坏的MP4视频文件? 首先,我们需要了解MP4文件损坏的可能原因。常见的原因包括:逻辑损坏、…

《庆余年算法番外篇》:范闲通过最短路径算法在阻止黑骑截杀林相

剧情背景 在《庆余年 2》22集中,林相跟大宝交代完为人处世的人生哲理之后,就要跟大宝告别了 在《庆余年 2》23集中,林相在告老还乡的路上与婉儿和大宝告别后 范闲也在与婉儿的对话中知道黑骑调动是绝密,并把最近一次告老还乡梅…

【服务器部署篇】Linux下Node.js的安装和配置

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是,产…

Kprobe实现原理

kprobe其实就是将某个要检测的指令备份,再替换成int3(x86)或者未定义指令(arm)来触发异常,再调用对应体系的异常处理函数来执行我们自定义的hook,执行完我们自定义的hook,再将备份的指令放回原来的位置继续往下执行 下面我们就来看下linux内核…

web题解 Easy_SQLi or 雏形系统 (解题方法思想)

1.Easy_SQLi 1)打开题目环境,如下是一个类似弱密码的格式,但是它又说是sql,还是按sql注入来 2).这里我尝试判断它的注入类型,但是一只不对,我便想着用万能密码试试,怎料直接登录成功…

Tableau解包与版本兼容性

Tableau解包与版本兼容性 1、背景描述2、Tableau解包3、Tableau版本兼容性 1、背景描述 有时,在使用Tableau Desktop打开.twbx打包工作簿时,可能会出现如下弹框: 通常考虑以下两种处理情况 2、Tableau解包 解包打包的.twbx工作簿&#xff0c…

电脑显示由于找不到msvcr110.dll 无法继续执行如何处理?最简单的修复msvcr110.dll文件方法

电脑显示由于找不到msvcr110.dll 无法继续执行?当你看到这种提示的时候,请不要紧张,这种是属于dll文件丢失,解决起来还是比较简单的,下面会详细的列明多种找不到msvcr110.dll的解决方法。 一.找不到msvcr110.dll是怎么…

HAL库+LWIP+LAN8720+热插拔

定时任务中,查询LAN8720的状态寄存器 PHY_BSR 0x01,成功读取后,检查16位数据的BIT2,即可获取网线连接状态 uint32_t phyreg 0;if(HAL_ETH_ReadPHYRegister(&g_eth_handler, PHY_BSR, &phyreg) HAL_OK){if(((phyreg >…

【Python Cookbook】S01E01 将长度为N的序列分解为N个单独的变量

目录 问题解决方案讨论 问题 将一个包含 N N N 个元素的元组或者序列,现在想将其分解为 N N N 个单独的变量。 解决方案 任何序列都可以通过简单的赋值操作分解为单独的变量: p (4, 5) x, y p print("x", x) print("y", y)唯…

v4l2抓取rv1126图像

0.准备工作 本文是基于正点原子的rv1126开发板使用mx415摄像头对不同节点的图像进行抓取 1.数据流向 图1 mx415采集到的数据为原始的拜尔格式(也就是raw格式),我们需要通过isp进行图像的调节才符合视觉,其中isp和ispp是两个处理的…

智能监控技术助力山林生态养鸡:打造智慧安全的养殖新模式

随着现代科技的不断发展,智能化、自动化的养殖方式逐渐受到广大养殖户的青睐。特别是在山林生态养鸡领域,智能化监控方案的引入不仅提高了养殖效率,更有助于保障鸡只的健康与安全。视频监控系统EasyCVR视频汇聚/安防监控视频管理平台在山林生…

GD32F103RCT6/GD32F303RCT6(10)独立看门狗/窗口看门狗实验

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布: 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转: 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…