借助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实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.