加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

微服务入门:Openresty实现API网关

发布时间:2019-09-24 23:48:32 所属栏目:教程 来源:热爱技术君
导读:概念介绍 如果大家清楚网关这个概念,那就很容易理解API网关,即所有API的入口。 从面向对象设计的角度看,它与外观模式类似,封装了系统内部架构。在单体应用架构中,没有「 API网关 」的概念,每个项目都会用到filter/过滤器之类的东西,filter的作用就

上面是我们的nginx配置,引入了redis模块,用于存储API请求数量,接下来,我们在gateway/intercept.lua中实现API请求数量统计的处理逻辑:

  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) 

就这样,我们实现了API网关的一个小功能,其他功能实现,就靠大家去摸索了。目前市面上成熟的API网关实现方案有很多,采用openresty 开发出的api网关,比如比较流行的kong、orange等, 大家可以自行了解。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读