KrakenD是一个高性能Api网关, api转发的推荐做法是每个api一个配置项,也就是一个endpoint,其开发者认为api网关和纯粹的L7路由不一样(文章链接).
因此社区版并没有提供通配符*匹配(偷懒失败😫),即 /product及其之后的所有url(如/product/detail) 全部转发到指定的backend并把后续的url带上,
如图所示,如果backend的host是http://productService
/product | http://productService/product |
/product/detail | http://productService/product/detail |
但是KrakenD 企业版有提供一个 wildcard Routes插件, 功能类似,将满足通配符的请求转发到backend的url_pattern+通配符后url path.
社区版里也有一种方法可以曲线救国,就是用多级url来进行匹配, 如果 /product/* 转发到http://productService/* 一个endpoint, /product/*/*转发到http://productService/*/* 另一个endpoint,具体的krakend.json配置如下,
{ "version": 2, "extra_config": {}, "endpoints": [ { "endpoint": "/product/{level1}", "method": "GET,POST,PATCH,PUT,DELETE", "output_encoding": "no-op", "backend": [ { "url_pattern": "/{level1}", "method": "GET,POST,PATCH,PUT,DELETE", "encoding": "no-op", "host": [ "http://productService" ] } ] }, { "endpoint": "/product/{level1}/{level2}", "method": "GET,POST,PATCH,PUT,DELETE", "output_encoding": "no-op", "backend": [ { "url_pattern": "/{level1}/{level2}", "method": "GET", "encoding": "no-op", "host": [ "http://productService" ] } ] } ] }
api url path会有多少级就配置对应多少个endpoint.
顺便测试下Krakend性能
配置如下
R7 3700X
8G 3000 C16 * 2
.net 5.0-alpine
Krakend转发到asp.net core,100w个请求, rps 1.4W
直接请求asp.net core,100w个请求, rps 4w