KrakenD顺序执行端点异常:第二个服务报错却返回成功响应
KrakenD Sequential模式下第二个后端报错未返回错误响应问题
环境信息
- KrakenD版本:2.2.1
- Go版本:go1.19.3
问题
使用KrakenD的sequential特性发起顺序请求时出现异常:
- 两个后端服务均可能返回200成功或4xx错误
- 第一个服务报错时,客户端能正常收到错误响应,符合预期
- 第一个服务成功,但第二个服务返回4xx错误时,客户端收到的却是200成功响应,不符合预期
当前配置
{ "endpoint": "/companies/validate", "method": "GET", {{ include "input_headers.txt" }}, "backend": [ { "host": ["{{ .service.credential_service_url }}"], "url_pattern": "/tokens/validate", "method": "GET", "extra_config": { "backend/http": { "return_error_code": true } } }, { "host": ["{{ .service.company_service_url }}"], "url_pattern": "/companies/{resp0_companyId}/validate", "method": "GET", "extra_config": { "backend/http": { "return_error_code": true } } } ], "extra_config": { "proxy": { "sequential": true } } }
现象
日志显示第一个服务请求正常,第二个服务返回错误,但客户端(Postman)收到的是200成功响应。
解决办法
KrakenD的sequential模式默认仅在第一个后端报错时终止流程并返回错误,后续后端的错误会被忽略。只需在proxy的额外配置中添加halt_on_error: true,即可让流程在任意后端报错时终止并返回错误:
修改后的配置:
{ "endpoint": "/companies/validate", "method": "GET", {{ include "input_headers.txt" }}, "backend": [ { "host": ["{{ .service.credential_service_url }}"], "url_pattern": "/tokens/validate", "method": "GET", "extra_config": { "backend/http": { "return_error_code": true } } }, { "host": ["{{ .service.company_service_url }}"], "url_pattern": "/companies/{resp0_companyId}/validate", "method": "GET", "extra_config": { "backend/http": { "return_error_code": true } } } ], "extra_config": { "proxy": { "sequential": true, "halt_on_error": true } } }
配置说明
halt_on_error: true:开启后,sequential流程中任意一个后端返回错误时,立即终止后续请求,并将错误响应返回给客户端- 保留每个后端的
backend/http.return_error_code: true:确保后端的HTTP错误码能正确传递给KrakenD,避免被默认转换为200
内容的提问来源于stack exchange,提问作者Hulusi
相关产品推荐
相关产品推荐

