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. 网关鉴权架构图

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

5225

被折叠的 条评论
为什么被折叠?



