2

我正在使用 Krakend 构建一个 API 网关来连接三个后端服务。网关总是从一个或两个后端服务返回,并且X-Krakend-Completed header总是设置为 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
}

海妖日志

[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"
            ]
          }
        ]
      }
    ]
  }
4

0 回答 0