Krakend http: 无效的已关闭的 Body 上的读取

huangapple go评论78阅读模式
英文:

Krakend http: invalid Read on closed Body

问题

我正在使用Krakend构建一个API网关,用于连接三个后端服务。该网关总是从一个或两个后端服务返回,并且X-Krakend-Completed头部始终设置为false。

日志中的http: invalid Read on closed Body错误可能是什么原因?

期望的行为

GET localhost:8000

响应

{
    "user-id": 1,
    "payments-id": 1,
    "loans-id": 1
}

实际的行为

GET localhost:8000

响应

{
    "payment-id": 1
}

Krakend日志

[GIN] 2022/03/01 - 16:29:41 | 200 | 801.319μs | ::1 | GET "/"
Error #01: Get "http://localhost:5000/users": http: invalid Read on closed Body
Get "http://localhost:6000/loans": http: invalid Read on closed Body
[GIN] 2022/03/01 - 16:29:55 | 200 | 851.735μs | ::1 | GET "/"
Error #01: Get "http://localhost:6000/loans": http: invalid Read on closed Body
Get "http://localhost:5000/users": http: invalid Read on closed Body

服务1

type Payment struct {
    Id int32 `json:"payment-id"`
}

var payments = []Payment{
    {
        Id: 0,
    },
    {
        Id: 1,
    },
}

func main() {
    app := fiber.New()

    app.Get("/payments", func(c *fiber.Ctx) error {
        return c.JSON(payments[1])
    })

    app.Listen(":7000")
}

服务2

func main() {
    app := fiber.New()

    app.Get("/loans", func(c *fiber.Ctx) error {
        return c.JSON(loans[1])
    })

    app.Listen(":6000")
}

服务3

func main() {
    app := fiber.New()

    app.Get("/users", func(c *fiber.Ctx) error {
        return c.JSON(users[1])
    })

    app.Listen(":5000")
}

Krakend.json

{
    "version": 2,
    "timeout": "3000ms",
    "cache_ttl": "300s",
    "output_encoding": "json",
    "name": "users",
    "port": 8000,
    "read_timeout": "2s",
    "write_timeout": "2s",
    "idle_timeout": "2s",
    "read_header_timeout": "2s",
    "endpoints": [
        {
            "endpoint": "/",
            "method": "GET",
            "output_encoding": "json",
            "backend": [
                {
                    "url_pattern": "/users",
                    "encoding": "json",
                    "method": "GET",
                    "host": [
                        "http://localhost:5000"
                    ]
                },
                {
                    "url_pattern": "/loans",
                    "encoding": "json",
                    "method": "GET",
                    "host": [
                        "http://localhost:6000"
                    ]
                },
                {
                    "url_pattern": "/payments",
                    "encoding": "json",
                    "method": "GET",
                    "host": [
                        "http://localhost:7000"
                    ]
                }
            ]
        }
    ]
}
英文:

I'm using Krakend to build an API gateway to connect three backend services. The gateway always returns from one or two of the backend services with the X-Krakend-Completed header always set to false.

What could be the cause of the http: invalid Read on closed Body error in the logs?

Expected behavior

GET localhost:8000

response

{
    "user-id": 1,
    "payments-id": 1,
    "loans-id": 1,
}

Actual behavior

GET localhost:8000

response

{
    "payment-id": 1
}

Krakend log

[GIN] 2022/03/01 - 16:29:41 | 200 |     801.319µs |             ::1 | GET      "/"
Error #01: Get "http://localhost:5000/users": http: invalid Read on closed Body
Get "http://localhost:6000/loans": http: invalid Read on closed Body
[GIN] 2022/03/01 - 16:29:55 | 200 |     851.735µs |             ::1 | GET      "/"
Error #01: Get "http://localhost:6000/loans": http: invalid Read on closed Body
Get "http://localhost:5000/users": http: invalid Read on closed Body

Service 1

type Payment struct {
	Id int32 `json:"payment-id"`
}

var payments = []Payment{
	{
		Id: 0,
	},
	{
		Id: 1,
	}
}

func main() {

	app := fiber.New()

	app.Get("/payments", func(c *fiber.Ctx) error {
		return c.JSON(payments[1])
	})

	app.Listen(":7000")

}

Service 2

func main() {

	app := fiber.New()

	app.Get("/loans", func(c *fiber.Ctx) error {
		return c.JSON(loans[1])
	})

	app.Listen(":6000")

}

Service 3

func main() {

	app := fiber.New()

	app.Get("/users", func(c *fiber.Ctx) error {
		return c.JSON(users[1])
	})

	app.Listen(":5000")


}

Krakend.json

{
    "version": 2,
    "timeout": "3000ms",
    "cache_ttl": "300s",
    "output_encoding": "json",
    "name": "users",
    "port": 8000,
    "read_timeout": "2s",
    "write_timeout": "2s",
    "idle_timeout": "2s",
    "read_header_timeout": "2s",
    "endpoints": [
      {
        "endpoint": "/",
        "method": "GET",
        "output_encoding": "json",
        "backend": [
          {
            "url_pattern": "/users",
            "encoding": "json",
            "method": "GET",
            "host": [
              "http://localhost:5000"
            ]
          },
          {
            "url_pattern": "/loans",
            "encoding": "json",
            "method": "GET",
            "host": [
              "http://localhost:6000"
            ]
          },
          {
            "url_pattern": "/payments",
            "encoding": "json",
            "method": "GET",
            "host": [
              "http://localhost:7000"
            ]
          }
        ]
      }
    ]
  }

答案1

得分: 0

我在发送GET请求时不知不觉地发送了一个请求体,导致出现了Krakend http: invalid Read on closed Body错误。

GitHub问题链接

英文:

I was unknowningly sending a body on a GET request resulting in the Krakend http: invalid Read on closed Body error

Link to Github Issue

huangapple
  • 本文由 发表于 2022年3月1日 21:32:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/71309260.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定