北京治疗白癜风最好医院 https://wapjbk.39.net/yiyuanzaixian/bjzkbdfyy/nxbdf/作者
码海来源
码海
之前的高性能短链设计一文颇受大家好评,共被转载「47」次,受宠若惊,在此感谢大家的认可!在文末简单提了一下OpenResty,一些读者比较感兴趣,刚好我们接入层网关也是用的OpenResty,所以希望通过对网关设计的介绍来简单总结一下OpenResty的相关知识点,争取让大家对OpenResty这种高性能Web平台有一个比较全面的了解。本文会从以下几个方面来讲解。
网关的作用接入层网关架构设计与实现技术选型OpenResty原理剖析
网关的作用
网关作为所有请求的流量入口,主要承担着安全,限流,熔断降级,监控,日志,风控,鉴权等功能,网关主要有两种类型:
一种是接入层网关(accessgateway),主要负责路由,WAF(防止SQLInjection,XSS,路径遍历,窃取敏感数据,CC攻击等),限流,日志,缓存等,这一层的网关主要承载着将请求路由到各个应用层网关的功能;另一种是应用层网关,比如现在流行的微服务,各个服务可能是用不同的语言写的,如PHP,Java等,那么接入层就要将请求路由到相应的应用层集群,再由相应的应用层网关进行鉴权等处理,处理完之后再调用相应的微服务进行处理,应用层网关也起着路由,超时,重试,熔断等功能。目前市面上比较流行的系统架构如下:
可以看到接入层网关承载着公司的所有流量,对性能有很高的要求,它的设计决定着整个系统的上限。所以我们今天主要谈谈接入层网关的设计。
接入层网关架构设计与实现
首先我们要明白接入层网关的核心功能是:「根据路由规则将请求分发到对应的后端集群」,所以要实现如下几个功能模型。
1、路由:根据请求的host,url等规则转发到指定的上游(相应的后端集群);2、路由策略插件化:这是网关的「灵魂所在」,路由中会有身份认证,限流限速,安全防护(如IP黑名单,refer异常,UA异常,需第一时间拒绝)等规则,这些规则以插件的形式互相组合起来以便只对某一类的请求生效,每个插件都即插即用,互不影响,这些插件应该是「动态可配置」的,动态生效的(无须重启服务),为啥要可动态可配置呢,因为每个请求对应的路由逻辑,限流规则,最终请求的后端集群等规则是不一样的。
如图示,两个请求对应的路由规则是不一样的,它们对应的路由规则(限流,rewrite)等通过各个规则插件组合在一起,可以看到,光两个请求url的路由规则就有挺多的,如果一个系统大到一定程度,url会有不少,就会有不少规则,这样每个请求的规则就必须「可配置化」,「动态化」,最好能在管理端集中控制,统一下发。
3、后端集群的动态变更
路由规则的应用是为了确定某一类请求经过这些规则后最终到达哪一个集群,而我们知道请求肯定是要打到某一台集群的ip上的,而机器的扩缩容其实是比较常见的,所以必须支持动态变更,总不能我每次上下线机器的时候都要重启系统让它生效吧。
4、监控统计,请求量、错误率统计等等
这个比较好理解,在接入层作所有流量的请求,错误统计,便于打点,告警,分析。
要实现这些需求就必须对我们采用的技术:OpenResty有比较详细的了解,所以下文会简单介绍一下OpenResty的知识点。
技术选型
有人可能第一眼想到用Nginx,没错,由于Nginx采用了epoll模型(非阻塞IO模型),确实能满足大多数场景的需求(经过优化w+的并发数不是问题),但是Nginx更适合作为静态的Web服务器,因为对于Nginx来说,如果发生任何变化,都需要修改磁盘上的配置,然后重新加载才能生效,它并没有提供API来控制运行时的行为,而如上文所述,动态化是接入层网关非常重要的一个功能。所以经过一番调研,我们选择了OpenResty,啥是OpenResty呢,来看下