借助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

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解