簡單描述一下根據(jù)productId分流的步驟:
1福铅、獲取請求參數(shù)台谍,比如productId
2沛励、對productId進(jìn)行hash
3甩挫、hash值對應(yīng)用服務(wù)器數(shù)量取模贴硫,獲取到一個應(yīng)用服務(wù)器
4、利用http發(fā)送請求到應(yīng)用層nginx
5伊者、獲取響應(yīng)后返回
這個就是基于商品id的定向流量分發(fā)的策略英遭,lua腳本來編寫和實現(xiàn)
我們作為一個流量分發(fā)的nginx,會發(fā)送http請求到后端的應(yīng)用nginx上面去亦渗,所以要先引入lua http lib包
cd /usr/hello/lualib/resty/
wget https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http_headers.lua
wget https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http.lua
修改 /usr/hello/lua/hello.lua 文件的內(nèi)容:
代碼:
local uri_args = ngx.req.get_uri_args()
local productId = uri_args["productId"]
local host = {"192.168.18.128:8091", "192.168.18.128:8092"}
local hash = ngx.crc32_long(productId)
hash = (hash % 2) + 1
backend = "http://"..host[hash]
local method = uri_args["method"]
local requestBody = "/"..method.."?productId="..productId
local http = require("resty.http")
local httpc = http.new()
local resp, err = httpc:request_uri(backend, {
method = "GET",
path = requestBody
})
if not resp then
ngx.say("request error :", err)
return
end
ngx.say(resp.body)
httpc:close()
由于機(jī)器內(nèi)存太小,只能在一臺機(jī)器上搞了
在 usr/hello 下面 建立 part1.conf ? ? ?part2.conf 配置文件
在 /usr/hello/lua 下面 建立 part1.lua ?part2.lua
在 /usr/servers/nginx/conf 下面的 nginx/conf 加上 下面2句
重啟 nginx:
/usr/servers/nginx/sbin/nginx -s reload
通過 :
http://192.168.18.128:8090/lua?productId=1&method=part ?
訪問 修改 productId 的值 ,就會訪問 不同的 業(yè)務(wù)層
簡單描述一下: 第一次 OpenResry 做根據(jù) productId 做分流 ,第二層 用 lua 寫業(yè)務(wù)邏輯
第一次 根據(jù) produId 分流到 第二層 OpenResry上面, 可以做到 緩存命中率大大提高