借助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 controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@