高性能网关设计实践

作者:码海
转载于:https://mp.weixin.qq.com/s/oAh5IojX_iz01nbf8mJMSQ
本文通过对网关设计的介绍来简单总结一下 OpenResty 的相关知识点 , 争取让大家对 OpenResty 这种高性能 Web 平台有一个比较全面的了解 。本文会从以下几个方面来讲解 。
  • 网关的作用
  • 接入层网关架构设计与实现
  • 技术选型
  • OpenResty 原理剖析
网关的作用网关作为所有请求的流量入口 , 主要承担着安全 , 限流 , 熔断降级 , 监控 , 日志 , 风控 , 鉴权等功能 , 网关主要有两种类型
  • 一种是接入层网关(access gateway) , 主要负责路由 , WAF(防止SQL Injection, XSS, 路径遍历, 窃取敏感数据,CC攻击等) , 限流 , 日志 , 缓存等 , 这一层的网关主要承载着将请求路由到各个应用层网关的功能
  • 另一种是应用层网关 , 比如现在流行的微服务 , 各个服务可能是用不同的语言写的 , 如 php , JAVA 等 , 那么接入层就要将请求路由到相应的应用层集群 , 再由相应的应用层网关进行鉴权等处理 , 处理完之后再调用相应的微服务进行处理 , 应用层网关也起着路由 , 超时 , 重试 , 熔断等功能 。
目前市面上比较流行的系统架构如下
高性能网关设计实践

文章插图
 
可以看到接入层网关承载着公司的所有流量 , 对性能有很高的要求 , 它的设计决定着整个系统的上限 。所以我们今天主要谈谈接入层网关的设计 。
接入层网关架构设计与实现首先我们要明白接入层网关的核心功能是:「根据路由规则将请求分发到对应的后端集群」 , 所以要实现如下几个功能模型。
1、 路由:根据请求的 host, url 等规则转发到指定的上游(相应的后端集群) 2、 路由策略插件化:这是网关的「灵魂所在」 , 路由中会有身份认证 , 限流限速 , 安全防护(如 IP 黑名单 , refer异常 , UA异常 , 需第一时间拒绝)等规则 , 这些规则以插件的形式互相组合起来以便只对某一类的请求生效 , 每个插件都即插即用 , 互不影响 , 这些插件应该是「动态可配置」的 , 动态生效的(无须重启服务) , 为啥要可动态可配置呢 , 因为每个请求对应的路由逻辑 , 限流规则 , 最终请求的后端集群等规则是不一样的
高性能网关设计实践

文章插图
 
如图示 , 两个请求对应的路由规则是不一样的 , 它们对应的路由规则(限流 , rewrite)等通过各个规则插件组合在一起 , 可以看到 , 这两个请求 url 的路由规则就有挺多的 , 如果一个系统大到一定程度 , url 会有不少 , 就会有不少规则 , 这样每个请求的规则就必须「可配置化」 , 「动态化」 , 最好能在管理端集中控制 , 统一下发 。
3、后端集群的动态变更
路由规则的应用是为了确定某一类请求经过这些规则后最终到达哪一个集群 , 而我们知道请求肯定是要打到某一台集群的 ip 上的 , 而机器的扩缩容其实是比较常见的 , 所以必须支持动态变更 , 总不能我每次上下线机器的时候都要重启系统让它生效吧 。
4、监控统计 , 请求量、错误率统计等等
这个比较好理解 , 在接入层作所有流量的请求 , 错误统计 , 便于打点 , 告警 , 分析 。
要实现这些需求就必须对我们采用的技术:OpenResty 有比较详细的了解 , 所以下文会简单介绍一下 OpenResty 的知识点 。
技术选型有人可能第一眼想到用 Nginx,没错 , 由于 Nginx 采用了 epoll 模型(非阻塞 IO 模型) , 确实能满足大多数场景的需求(经过优化 100 w + 的并发数不是问题) , 但是 Nginx 更适合作为静态的 Web 服务器 , 因为对于 Nginx 来说 , 如果发生任何变化 , 都需要修改磁盘上的配置 , 然后重新加载才能生效 , 它并没有提供 API 来控制运行时的行为 , 而如上文所述 , 动态化是接入层网关非常重要的一个功能 。所以经过一番调研 , 我们选择了 OpenResty , 啥是 OpenResty 呢 , 来看下官网的定义:


推荐阅读