副问题[/!--empirenews.page--]

观念先容
假如各人清晰“网关”这个观念,那就很轻易领略“API网关“,即全部API的进口。 从面向工具计划的角度看,它与外面模式相同,封装了体系内部架构。在单体应用架构中,没有「 API网关 」的观念,每个项目城市用到filter/过滤器之类的对象,filter的浸染就是把项目中的一些非营业逻辑的成果抽离出来独立处理赏罚,停止与营业逻辑混在一路增进代码伟大度。好比 鉴权认证成果、Session处理赏罚、安详搜查、日记处理赏罚等等。
假如回收微处事架构,那一个项目中微处事节点许多,假如让每一个节点都行止理赏罚上面这些 “鉴权认证成果、Session处理赏罚、安详搜查、日记处理赏罚等” 会多出许多冗余的代码,也会给增进营业代码的伟大度,因此就必要有一个API网关把这些民众的成果独立出来成为一个处事来同一的处理赏罚这些工作。
首要成果
API网关就像是微处事的一扇门,是连通外部客户端与内部微处事之间的一个桥梁。
其首要成果有:
- 路由转发 API网关是内部微处事的对外独一进口,以是表面所有的哀求城市先发到API网上,然后由API网关来按照差异的哀求去路由到差异的微处事节点上。
- 负载平衡 API网关收到外部哀求之后,可以按照内部微处事每个实例的负荷环境进动作态的负载平衡调理。一旦内部的某个微处究竟例负载很高,乃至是不能实时相应,则API网关就通过负载平衡计策镌汰或遏制向这个实例转发哀求。当全部的内部微处究竟例都处理赏罚不外来的时辰,API网关还可以回收限流或熔断的情势阻止外部哀求,以保障整个体系的可用性。
- 安详认证 API网关就像是微处事的大门捍卫,每一个哀求进来之后,都必需先在API网关长举办安详验证或身份验证,验证通事后才转发给后头的处事。
- 日记记录 全部的哀求都必要走API网关,那么就可以在API网关上同一齐集的记录下这些举动日记。
- 数据转换 由于API网关对外是面向多种差异的客户端,差异的客户端所传输的数据范例也许是纷歧样的。因此API网关还必要具备数据转换的成果,将差异客户端传输进来的数据转换成统一种范例再转发给内部微处事上,这样,兼容了这些哀求的多样性,担保了微处事的机动性。
OpenResty
API网关最首要的成果实现就是哀求拦截,在收集哀求的整个生命阶段插手各类filter/过滤器, OpenResty提供了这样的成果。
OpenResty® 是一个基于 Nginx 与 Lua 的高机能 Web 平台,其内部集成了大量优异的 Lua 库、第三方模块以及大大都的依靠项。用于利便地搭建可以或许处理赏罚超高并发、扩展性极高的动态 Web 应用、Web 处事和动态网关。
OpenResty 处理赏罚一个哀求,它的处理赏罚流程请参考下图(从 Request start 开始):
依据OpenResty的哀求处理赏罚流程,和各类第三方模块,就可以在流程节点中插手我们的API网关逻辑代码。譬喻,对API哀求数目举办统计:
- 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;;";
- server {
- listen 80;
- server_name gw.gitlib.cn;
- access_log /var/log/nginx/gw.gitlib.cn.access.log access;
- # lua_code_cache off;
- set $redis_host "192.168.1.106";
- set $redis_port "6379";
- set $redis_incrkey "api:access:num";
- access_by_lua_file gateway/intercept.lua; # 对全部哀求举办拦截处理赏罚
- location = /num {
-
- content_by_lua_block {
- local _redis = require "resty.redis"
- local redis = _redis:new()
- redis:set_timeout(1000)
-
- local ok, err = redis:connect(ngx.var.redis_host, ngx.var.redis_port)
- if not ok then
- ngx.say("failed to connect: ", err)
- return
- end
- local res, err = redis:get(ngx.var.redis_incrkey)
- if not res then
- ngx.say("failed to get key: ", err)
- return
- end
- if res == ngx.null then
- ngx.say("key not found.")
- return
- end
- ngx.say("api:access:num:", res)
- }
- }
-
- location ~ ^/api/([w]+) {
- default_type text/html;
- content_by_lua_file /web/gw/api/$1.lua;
- }
- }
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|