英文:
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
错误。
英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论