自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

微服務(wù)入門:Openresty實(shí)現(xiàn)API網(wǎng)關(guān)

網(wǎng)絡(luò) 通信技術(shù)
如果大家清楚“網(wǎng)關(guān)”這個(gè)概念,那就很容易理解“API網(wǎng)關(guān)“,即所有API的入口。 從面向?qū)ο笤O(shè)計(jì)的角度看,它與外觀模式類似,封裝了系統(tǒng)內(nèi)部架構(gòu)。

 

 

[[277664]]

 

微服務(wù)入門:Openresty實(shí)現(xiàn)API網(wǎng)關(guān)

 

 

概念介紹

如果大家清楚“網(wǎng)關(guān)”這個(gè)概念,那就很容易理解“API網(wǎng)關(guān)“,即所有API的入口。 從面向?qū)ο笤O(shè)計(jì)的角度看,它與外觀模式類似,封裝了系統(tǒng)內(nèi)部架構(gòu)。在單體應(yīng)用架構(gòu)中,沒有「 API網(wǎng)關(guān) 」的概念,每個(gè)項(xiàng)目都會(huì)用到filter/過濾器之類的東西,filter的作用就是把項(xiàng)目中的一些非業(yè)務(wù)邏輯的功能抽離出來獨(dú)立處理,避免與業(yè)務(wù)邏輯混在一起增加代碼復(fù)雜度。比如 鑒權(quán)認(rèn)證功能、Session處理、安全檢查、日志處理等等。

如果采用微服務(wù)架構(gòu),那一個(gè)項(xiàng)目中微服務(wù)節(jié)點(diǎn)很多,如果讓每一個(gè)節(jié)點(diǎn)都去處理上面這些 “鑒權(quán)認(rèn)證功能、Session處理、安全檢查、日志處理等” 會(huì)多出很多冗余的代碼,也會(huì)給增加業(yè)務(wù)代碼的復(fù)雜度,因此就需要有一個(gè)API網(wǎng)關(guān)把這些公共的功能獨(dú)立出來成為一個(gè)服務(wù)來統(tǒng)一的處理這些事情。

 

微服務(wù)入門:Openresty實(shí)現(xiàn)API網(wǎng)關(guān)

 

主要功能

API網(wǎng)關(guān)就像是微服務(wù)的一扇門,是連通外部客戶端與內(nèi)部微服務(wù)之間的一個(gè)橋梁。

其主要功能有:

  • 路由轉(zhuǎn)發(fā) API網(wǎng)關(guān)是內(nèi)部微服務(wù)的對(duì)外唯一入口,所以外面全部的請(qǐng)求都會(huì)先發(fā)到API網(wǎng)上,然后由API網(wǎng)關(guān)來根據(jù)不同的請(qǐng)求去路由到不同的微服務(wù)節(jié)點(diǎn)上。
  • 負(fù)載均衡 API網(wǎng)關(guān)收到外部請(qǐng)求之后,可以根據(jù)內(nèi)部微服務(wù)每個(gè)實(shí)例的負(fù)荷情況進(jìn)行動(dòng)態(tài)的負(fù)載均衡調(diào)節(jié)。一旦內(nèi)部的某個(gè)微服務(wù)實(shí)例負(fù)載很高,甚至是不能及時(shí)響應(yīng),則API網(wǎng)關(guān)就通過負(fù)載均衡策略減少或停止向這個(gè)實(shí)例轉(zhuǎn)發(fā)請(qǐng)求。當(dāng)所有的內(nèi)部微服務(wù)實(shí)例都處理不過來的時(shí)候,API網(wǎng)關(guān)還可以采用限流或熔斷的形式阻止外部請(qǐng)求,以保障整個(gè)系統(tǒng)的可用性。
  • 安全認(rèn)證 API網(wǎng)關(guān)就像是微服務(wù)的大門守衛(wèi),每一個(gè)請(qǐng)求進(jìn)來之后,都必須先在API網(wǎng)關(guān)上進(jìn)行安全驗(yàn)證或身份驗(yàn)證,驗(yàn)證通過后才轉(zhuǎn)發(fā)給后面的服務(wù)。
  • 日志記錄 所有的請(qǐng)求都需要走API網(wǎng)關(guān),那么就可以在API網(wǎng)關(guān)上統(tǒng)一集中的記錄下這些行為日志。
  • 數(shù)據(jù)轉(zhuǎn)換 因?yàn)锳PI網(wǎng)關(guān)對(duì)外是面向多種不同的客戶端,不同的客戶端所傳輸?shù)臄?shù)據(jù)類型可能是不一樣的。因此API網(wǎng)關(guān)還需要具備數(shù)據(jù)轉(zhuǎn)換的功能,將不同客戶端傳輸進(jìn)來的數(shù)據(jù)轉(zhuǎn)換成同一種類型再轉(zhuǎn)發(fā)給內(nèi)部微服務(wù)上,這樣,兼容了這些請(qǐng)求的多樣性,保證了微服務(wù)的靈活性。

OpenResty

API網(wǎng)關(guān)最主要的功能實(shí)現(xiàn)就是請(qǐng)求攔截,在網(wǎng)絡(luò)請(qǐng)求的整個(gè)生命階段加入各種filter/過濾器, OpenResty提供了這樣的功能。

OpenResty® 是一個(gè)基于 Nginx 與 Lua 的高性能 Web 平臺(tái),其內(nèi)部集成了大量精良的 Lua 庫、第三方模塊以及大多數(shù)的依賴項(xiàng)。用于方便地搭建能夠處理超高并發(fā)、擴(kuò)展性極高的動(dòng)態(tài) Web 應(yīng)用、Web 服務(wù)和動(dòng)態(tài)網(wǎng)關(guān)。

OpenResty 處理一個(gè)請(qǐng)求,它的處理流程請(qǐng)參考下圖(從 Request start 開始):

 

微服務(wù)入門:Openresty實(shí)現(xiàn)API網(wǎng)關(guān)

 

依據(jù)OpenResty的請(qǐng)求處理流程,和各種第三方模塊,就可以在流程節(jié)點(diǎn)中加入我們的API網(wǎng)關(guān)邏輯代碼。例如,對(duì)API請(qǐng)求數(shù)量進(jìn)行統(tǒng)計(jì):

  1. lua_package_path "module/lua-resty-hmac/lib/?.lua;module/lua-resty-redis/lib/?.lua;module/lua-resty-mysql/lib/?.lua;module/lua-resty-jwt/lib/?.lua;;"
  2. server { 
  3.  listen 80; 
  4.  server_name gw.gitlib.cn; 
  5.  access_log /var/log/nginx/gw.gitlib.cn.access.log access; 
  6.  # lua_code_cache off
  7.  set $redis_host "192.168.1.106"
  8.  set $redis_port "6379"
  9.  set $redis_incrkey "api:access:num"
  10.  access_by_lua_file gateway/intercept.lua; # 對(duì)所有請(qǐng)求進(jìn)行攔截處理 
  11.  location = /num { 
  12.   
  13.  content_by_lua_block { 
  14.  local _redis = require "resty.redis" 
  15.  local redis = _redis:new() 
  16.  redis:set_timeout(1000) 
  17.   
  18.  local ok, err = redis:connect(ngx.var.redis_host, ngx.var.redis_port) 
  19.  if not ok then 
  20.  ngx.say("failed to connect: ", err) 
  21.  return 
  22.  end 
  23.  local res, err = redis:get(ngx.var.redis_incrkey) 
  24.  if not res then 
  25.  ngx.say("failed to get key: ", err) 
  26.  return 
  27.  end 
  28.  if res == ngx.null then 
  29.  ngx.say("key not found."
  30.  return 
  31.  end 
  32.  ngx.say("api:access:num:", res) 
  33.  } 
  34.  } 
  35.   
  36.  location ~ ^/api/([\w]+) { 
  37.  default_type text/html;  
  38.  content_by_lua_file /web/gw/api/$1.lua; 
  39.  } 

上面是我們的nginx配置,引入了redis模塊,用于存儲(chǔ)API請(qǐng)求數(shù)量,接下來,我們?cè)趃ateway/intercept.lua中實(shí)現(xiàn)API請(qǐng)求數(shù)量統(tǒng)計(jì)的處理邏輯:

  1. local function increseNum(key
  2.     -- get key from rediskey 
  3.     local _redis = require "resty.redis" 
  4.     local redis = _redis:new() 
  5.     redis:set_timeout(100) 
  6.     local ok, err = redis:connect(ngx.var.redis_host, ngx.var.redis_port) 
  7.     if not ok then 
  8.         ngx.log(ngx.ERR, "failed to connect to redis: ", err) 
  9.         return nil 
  10.     end  
  11.     if ngx.var.redis_auth then 
  12.         local ok, err = redis:auth(ngx.var.redis_auth) 
  13.         if not ok then 
  14.             ngx.log(ngx.ERR, "failed to authenticate: ", err) 
  15.             return nil 
  16.         end 
  17.     end 
  18.     if ngx.var.redis_db then 
  19.  local ok, err = redis:select(ngx.var.redis_db) 
  20.  if not ok then 
  21.  ngx.log(ngx.ERR, "failed to select db: ", ngx.var.reddb, " ", err) 
  22.  return nil 
  23.  end 
  24.  end 
  25.  local res, err = redis:incr(key
  26.  if not res then 
  27.  ngx.log(ngx.ERR, "failed to incr key: "key ,", ", err) 
  28.  return nil 
  29.  end 
  30.  if res == ngx.null then 
  31.  ngx.log(ngx.ERR, "key "key" not found"
  32.  return ngx.null 
  33.  end 
  34.  local ok, err = redis:close() 
  35.  if not ok then 
  36.  ngx.log(ngx.ERR, "failed to close: ", err) 
  37.  end 
  38.  return res 
  39. end 
  40. increseNum(ngx.var.redis_incrkey) 

就這樣,我們實(shí)現(xiàn)了API網(wǎng)關(guān)的一個(gè)小功能,其他功能實(shí)現(xiàn),就靠大家去摸索了。目前市面上成熟的API網(wǎng)關(guān)實(shí)現(xiàn)方案有很多,采用openresty 開發(fā)出的api網(wǎng)關(guān),比如比較流行的kong、orange等, 大家可以自行了解。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2021-11-23 06:02:20

APIOpenResty網(wǎng)關(guān)

2019-04-02 14:20:14

微服務(wù)API網(wǎng)關(guān)

2023-06-09 14:46:36

2022-01-17 10:55:50

微服務(wù)API網(wǎng)關(guān)

2020-07-28 08:32:57

微服務(wù)API網(wǎng)關(guān)熔斷

2016-11-23 10:56:35

2022-01-10 13:06:13

微服務(wù)API網(wǎng)關(guān)

2019-07-02 14:17:18

API網(wǎng)關(guān)網(wǎng)關(guān)流量

2020-10-10 10:37:54

微服務(wù)架構(gòu)技術(shù)API

2023-09-06 08:51:40

2023-09-13 16:43:28

網(wǎng)關(guān)微服務(wù)架構(gòu)開發(fā)

2019-08-16 08:41:00

微服務(wù)架構(gòu)安全

2018-08-01 22:52:24

微服務(wù)容器云平臺(tái)API網(wǎng)關(guān)

2023-06-26 18:13:56

開源API

2017-03-09 19:39:54

微服務(wù)架構(gòu)重構(gòu)

2022-09-01 08:17:15

Gateway微服務(wù)網(wǎng)關(guān)

2021-08-13 07:52:35

微服務(wù)網(wǎng)關(guān)數(shù)據(jù)

2021-12-28 08:36:55

網(wǎng)關(guān)APIRPC

2024-12-04 08:19:36

API網(wǎng)關(guān)微服務(wù)

2024-08-05 10:03:53

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)