亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

lua+nginx+mysql實現動態路由

2023-03-31 05:41:12
77
0

    常用的有API網關如traefik、Tyk,這些組件提供整套的API路由方法,支持路由圖形化界面管理,本文將介紹一個通過nginx使用的方案。

     nginx用于Api轉發具有極好的性能,nginx通常用于靜態的資源轉發,接口按照正則表達式通配路由,對于需要動態調整的接口,略顯無力,如何做?

nginx.conf

說明:auth_request,可以對指定形式的接口進行鑒權,帶回cookie或者其他鑒權內容,根據返回進行處理;

權限、路由等下信息在mysql.lua中訪問。

location /router/ {

          auth_request /auth; # 鑒權

          set $value '';
          if ( $request_uri ~ "^/router/([-a-zA-Z0-9]+)(.*)$" ) {
              set $key $1;
              rewrite_by_lua_file /usr/local/openresty/mysql.lua;
          }

          proxy_pass //$value;

          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          proxy_redirect off;
}

mysql.lua

說明:讀取mysql路由或者其他需要的信息,返回給nginx.conf中進行路由操作

-- 從上下文讀取需要尋找的key
local key = ngx.var.key

local mysql = require "xxx"
local db, err = mysql:new()
if not db then
    ngx.log(ngx.ERR, "failed to instantiate mysql: ", err)
    return
end

db:set_timeout(1000) -- 1 sec
local ok, err, errcode, sqlstate = db:connect{
    host = "ip",
    port = "port",
    database = "xx",
    user = "xx",
    password = "*****",
    charset = "utf8",
    max_packet_size = 1024 * 1024,
}

if not ok then
    ngx.log(ngx.ERR, "failed to connect: ", err, ": ", errcode, " ", sqlstate)
    return
end

local name = ngx.quote_sql_str(key)

res, err, errcode, sqlstate = db:query("some SQL", 1)
if res == ngx.null or res == nil or #res == 0 then
    ngx.log(ngx.ERR, "no resources from mysql")
    -- 直接返回錯誤信息
    ngx.header['Content-Type'] = 'text/plain'
    ngx.say("服務地址 "..name.." not found")
    return ngx.exit(200)
else
    -- 讀出記錄,并且更新cache
    route = res[1]["server"]
end

-- 更新上下文中的value
ngx.var.value = route

nginx+lua推薦使用openresty,支持國產!

從根據Api中的uri或者參數,通過lua提取,結合mysql中的業務關系,可以是想動態路由功能。

 

 

0條評論
0 / 1000
JackW
6文章數
0粉絲數
JackW
6 文章 | 0 粉絲
JackW
6文章數
0粉絲數
JackW
6 文章 | 0 粉絲
原創

lua+nginx+mysql實現動態路由

2023-03-31 05:41:12
77
0

    常用的有API網關如traefik、Tyk,這些組件提供整套的API路由方法,支持路由圖形化界面管理,本文將介紹一個通過nginx使用的方案。

     nginx用于Api轉發具有極好的性能,nginx通常用于靜態的資源轉發,接口按照正則表達式通配路由,對于需要動態調整的接口,略顯無力,如何做?

nginx.conf

說明:auth_request,可以對指定形式的接口進行鑒權,帶回cookie或者其他鑒權內容,根據返回進行處理;

權限、路由等下信息在mysql.lua中訪問。

location /router/ {

          auth_request /auth; # 鑒權

          set $value '';
          if ( $request_uri ~ "^/router/([-a-zA-Z0-9]+)(.*)$" ) {
              set $key $1;
              rewrite_by_lua_file /usr/local/openresty/mysql.lua;
          }

          proxy_pass //$value;

          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          proxy_redirect off;
}

mysql.lua

說明:讀取mysql路由或者其他需要的信息,返回給nginx.conf中進行路由操作

-- 從上下文讀取需要尋找的key
local key = ngx.var.key

local mysql = require "xxx"
local db, err = mysql:new()
if not db then
    ngx.log(ngx.ERR, "failed to instantiate mysql: ", err)
    return
end

db:set_timeout(1000) -- 1 sec
local ok, err, errcode, sqlstate = db:connect{
    host = "ip",
    port = "port",
    database = "xx",
    user = "xx",
    password = "*****",
    charset = "utf8",
    max_packet_size = 1024 * 1024,
}

if not ok then
    ngx.log(ngx.ERR, "failed to connect: ", err, ": ", errcode, " ", sqlstate)
    return
end

local name = ngx.quote_sql_str(key)

res, err, errcode, sqlstate = db:query("some SQL", 1)
if res == ngx.null or res == nil or #res == 0 then
    ngx.log(ngx.ERR, "no resources from mysql")
    -- 直接返回錯誤信息
    ngx.header['Content-Type'] = 'text/plain'
    ngx.say("服務地址 "..name.." not found")
    return ngx.exit(200)
else
    -- 讀出記錄,并且更新cache
    route = res[1]["server"]
end

-- 更新上下文中的value
ngx.var.value = route

nginx+lua推薦使用openresty,支持國產!

從根據Api中的uri或者參數,通過lua提取,結合mysql中的業務關系,可以是想動態路由功能。

 

 

文章來自個人專欄
文章 | 訂閱
0條評論
0 / 1000
請輸入你的評論
0
0