OpenResty网关鉴权方案

本文详细探讨了在满足前端代理和后端GateWay需求的情况下,对APISIX、KONG、OpenResty和Nginx进行的技术选型。着重介绍了OpenResty的优势,包括高性能、Lua集成、易于扩展和部署,以及如何实现HTTPS、Redis连接和网关鉴权流程。

1. 需求分析

需要一款网关,既可以支持原有的前端代理,也可以兼容后端的GateWay功能:

l 支持前端部署访问,同时支持HTTPS

l 支持对后端的反向代理,负载均衡与健康检查

l 支持网关鉴权,符合鉴权要求的请求才能够放行

l 支持接口级的白名单放行

2. 技术选型

对APISIX、KONG、OpenResty、Nginx进行调研

1) APISIX

Apache APISIX 是一个动态、实时、高性能的云原生 API 网关。它构建于 NGINX + ngx_lua 的技术基础之上,充分利用了 LuaJIT 所提供的强大性能。 网关架构图:

APISIX 核心:包括 Lua 插件、多语言插件运行时(Plugin Runner)、Wasm 插件运行时等;

APISIX 在其核心中,提供了路由匹配、负载均衡、服务发现、API 管理等重要功能;

部署架构图:需要ETCD集群

APISIX生态全景图;定位:全流量的云原生网关(南北、东西)

2) KONG

Kong 是一款基于 OpenResty(Nginx + Lua 模块)编写的高可用、易扩展的,由 Mashape 公司开源的 API Gateway 项目。Kong 是基于 NGINX 和 Apache Cassandra 或 PostgreSQL 构建的,能提供易于使用的 RESTful API 来操作和配置 API 管理系统,所以它可以水平扩展多个 Kong 服务器,通过前置的负载均衡配置把请求均匀地分发到各个 Server,来应对大批量的网络请求。网关架构图:

架构分层图:

部署架构图:需要Cassandra和PostgreSQL

3) OpenResty

OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

在 OpenResty 中,每个 worker 中有一个 Lua VM,当一个请求被分配到 worker 时,worker 中的 Lua VM 里创建一个 coroutine(协程) 来负责处理。协程之间的数据隔离,每个协程具有独立的全局变量 _G。

第三方模块就可以根据自己的行为,挂载到不同阶段处理达到目的。

不同的阶段,处理不同的行为。

3. 为什么选择OpenResty

1) 三个网关的继承关系

2) 网上压测参考

测试机为1核2G。

压测命令:ab –c 100 –n 10000 http://127.0.0.1:8000/hello

压测结果:

3) 网关对比

4. OpenResty的安装(略)

5. 前端部署

sudo vi /usr/local/openresty/nginx/conf/nginx.conf

http {

    include       mime.types;

    default_type  application/octet-stream;

    server_tokens off;  #隐藏版本号

    sendfile        on;

    tcp_nopush     on;

    keepalive_timeout  65;

    gzip on;

    gzip_buffers 32 4K;

    gzip_comp_level 6;

    gzip_min_length 100;

    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

    gzip_vary on;

    server {

        listen       80;

        server_name  localhost;

        #安全策略

        more_clear_headers 'Server'; #headers-more-nginx-module

        add_header X-Content-Type-Options 'nosniff';

        add_header X-Frame-Options 'DENY';

        add_header X-Xss-Protection '1;mode=block';

        location / {

            root   /usr/local/openresty/nginx/dist;

            index  index.html index.htm;

        }

server_tokens off;  #防止黑客利用某个版本号的漏洞对服务器进行攻击

前端文件默认复制到/usr/local/openresty/nginx/目录下,否则会有用户权限限制

验证方式:请求资源链接,可以看到前端页面

6. 后端反向代理

运行后端

nohup /usr/local/jdk-11.0.17/bin/java -XX:+UnlockExperimentalVMOptions -XX:MaxRAMPercentage=90.0 -XX:InitialRAMPercentage=60.0 -Dfile.encoding=UTF-8 -jar /home/user/authority-1.0-SNAPSHOT.jar > authority.log 2>&1 &

sudo vi /usr/local/openresty/nginx/conf/nginx.conf

        location /open-api/authority/ {

            proxy_pass http://127.0.0.1:9500/;

            proxy_connect_timeout 15s;

            proxy_send_timeout 15s;

            proxy_read_timeout 15s;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }

验证方式:请求http://部署IP/open-api/authority/code,可以看到验证码

通过配置upstream实现后端的负载均衡

7. 增加HTTPS支持

通过openssl命令生成四个文件

server.crt

server.csr

server.key

server.key.org

将server.crt server.key复制到openresty配置中

sudo cp server.crt server.key /usr/local/openresty/nginx/conf/

配置文件

sudo vi /usr/local/openresty/nginx/conf/nginx.conf

server {

    listen       443 ssl;

    server_name  localhost;

    ssl_certificate      server.crt;

    ssl_certificate_key  server.key;

    ssl_session_cache    shared:SSL:1m;

    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;

    ssl_prefer_server_ciphers  on;

    root   /usr/local/openresty/nginx/dist2;

    location /open-api/authority/ {

        proxy_pass http://127.0.0.1:9500/;

        proxy_connect_timeout 15s;

        proxy_send_timeout 15s;

        proxy_read_timeout 15s;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

}

验证方式:浏览器https://部署IP/,加载前端页面,并且显示验证码

8. 连接Redis(单机&集群)

需要兼容单机版和集群两种方式

单机版:

通过导入local redis = require "resty.redis"库实现redis连接。

集群版:

通过导入local cluster = require "rediscluster"库实现redis连接。

配置注意:单机版可以选择DB,集群版不能选择DB。两个版本都需要进行密码验证。

使用注意:集群不能使用mset,mget

详见lua源码

9. 网关鉴权流程

网关鉴权流程:根据请求中的Token,从Redis里获取鉴权信息,将信息放入Header,向后端传递请求,请求处理完成,返回前端

openresty 执行lua命令

openresty 连接redis,通过认证

openresty set、get方法

openresty 选择数据库

openresty 从Header中获取token

openresty 解析token值

openresty 从Redis拿token对应数据

openresty 字符串处理

openresty 解析json

openresty 请求透传

编写测试接口程序

设置Header信息

鉴权功能模块化

增加反向代理

增加负载均衡

openresty 请求返回前端

详见lua源码

10. 网关鉴权架构图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值