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

2024-05-26 04:04

本文主要是介绍借助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 118.126.97.71:58888/hello 会返回当前的时间

alt

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

alt

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

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


然后新建一条Routes

alt

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

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

alt

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


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


在Plugins处点击New Plugin,

搜索HTTP

alt

再写一个服务(该服务监听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://43.153.207.126:4000/shuang/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"
 }
}
alt

但发现此时,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())

alt

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

alt

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

本文由 mdnice 多平台发布

这篇关于借助Kong记录接口的请求和响应内容的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1003468

相关文章

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置