身体を解析し、DBからテナントを抽出するために、別のサービスgetTenantを構築することに決めました。このサービスはNginxによって内部的に呼び出されます。 は、私はそれが最高のnginxの(/ openresty)ソリューションがあるかどうかわからないんだけど、これは私が思い付いたものです:me.com/apiが呼び出される基本的
limit_req_zone t1Limit zone=t1Zone:10m rate=200r/s;
limit_req_zone t2Limit zone=t2Zone:10m rate=90r/s;
server {
location /api{
content_by_lua_block {
ngx.req.read_body();
local reqBody = ngx.req.get_body_data()
local res = ngx.location.capture("/getTenant", {method=ngx.HTTP_POST,body=reqBody});
local tenantId= res.body;
if tenantId== "none" then
ngx.log(ngx.ERR, "Tenant not found!");
ngx.say(tenantId);
else
ngx.req.set_header("x_myTenantId", tenantId)
local res2 = ngx.location.capture("/" .. tenantId .."/doApi", {method=ngx.HTTP_POST,body=reqBody});
if res2.status == ngx.HTTP_OK then
ngx.say(res2.body);
ngx.exit(res2.status);
else
ngx.status = res2.status
ngx.exit(res2.status)
end
end;
}
}
location /getTenant {
internal; #this is not accessible from outside.
proxy_pass http://UpStream1/getCustomer;
proxy_set_header X-Original-URI $request_uri;
}
location /tenant1/doApi {
internal; #this is not accessible from outside.
# Proxy all requests to the AReqUpStream server group
proxy_pass http://UpStream2/doApi;
limit_req zone=tenant1Zone burst=25;
limit_req_log_level notice;
}
location /tenant2/doApi {
internal; #this is not accessible from outside.
# Proxy all requests to the AReqUpStream server group
proxy_pass http://UpStream2/doApi;
limit_req zone=tenant2Zone burst=10 ;#nodelay;
limit_req_status 409;
limit_req_log_level notice;
}
}
、新しいサブリクエスト/getTenantに発行されます。その呼び出しの応答は、/テナント[X]/doApiサービスへの別のサブ要求呼び出しを作成するために使用されます。そうすれば、私はテナントごとの場所を定義し、それぞれに異なるrate_limisを提供することができます。
歓迎以上のコメントです!
そのIDをHTTPヘッダーに入れることができるなら、あなたは 'limit_req_zone $ http_tenant_id ...'のようなことをすることができるはずです。それ以外の場合は、[map](http://nginx.org/en/docs/http/ngx_http_map_module.html#map)を使用して$ response_bodyからその値を抽出することができます。ありがとう@FaisalMemon。 –
悲しいことに、私はhttpヘッダーを追加することはできません。 tenant-idを見つける唯一の方法は、Base64 JSON本体をデコードし、変数を抽出してDB(またはキャッシュ)で検索することです。 – Yarix
ルアを使う必要があるような複雑な作業をするには:https://github.com/openresty/lua-nginx-module#readme –