一、网关是什么
网关是计算机网络中的一个设备或系统,用于连接两个或多个不同网络,并在这些网络之间传递数据和信息。它是网络通信的出入口,负责将数据包从源网络传递到目标网络,同时执行协议转换、安全控制、地址转换等功能。
网关可以是物理设备,如路由器、交换机或防火墙,也可以是软件实体,如计算机上运行的网络代理程序。不论是硬件还是软件,网关都扮演着数据包转发和转换的角色,使得不同网络能够相互连接和通信。
在一个网络服务中,有一些大家都需要做的事情,统一交给网关来做,比如说统一签名加密、固定响应头、证书SSL卸载等。而且我们现在的服务都是集群模式部署,我们通过公网IP访问到网关,再通过网关负载均衡把请求交给某个具体的后端ECS服务器处理。
二、网关常见功能
| 功能 | 作用 |
|---|---|
| 监听协议 | 能监听QUIC协议、HTTP/2协议、WEBSOCKET协议 |
| 序列化方式转换 | JSON与PB等多种序列化协议的转换(一般也是dubbo或其他网络框架层做的事,不用放到网关层) |
| 请求签名、加解密 | 在网关层给请求做解密,给返回体做加密或者签名 |
| 负载均衡与转发 | 以轮询或者权重等负载均衡方案把流量导入到后端节点,根据path或者heade设置转发规则 详情见: Nginx静态资源兜底 |
| QPS限速 | 限制某些接口的访问请求QPS |
| 流量调度 | 多机房部署时,可以灵活切换流量到某一机房 |
| 灰度标签与染色 | 在请求头header里面加上固定标签来做流量染色,生成TranceId等 |
| Mock | 前后端在测试或开发环境联调接口时,在网关配置,访问某个接口的固定响应 |
| 静态资源兜底 | 像Nginx可以在location中配置重定向,当访问结果非200时重定向到静态页面保证服务基本可用 |
| 证书卸载 | 网关层TLS的证书卸载 |
| 黑白名单 | 限制某些IP不能访问节点 |
| 访问日志监控 | 归档访问记录 |
| 通知用户设备上的缓存是否刷新 | 详情见: 用网关实现客户端刷新本地缓存的方案选型 |
三、网关选型
3.1 软件网关选型
| 对比 | Nginx | Spring cloud gateway | Zuul |
|---|---|---|---|
| 语言 | C/Lua | Java | Java |
| 时间 | Nginx的首个公开发布版本是在2004年10月4日发布的。自那时以来,Nginx一直在不断发展和更新,最新的稳定版本是基于2021年9月的Nginx 1.21.3版本。 | Spring Cloud Gateway是Spring Cloud生态系统中的一部分,它的首个正式版本是在2018年发布的。由于Spring Cloud Gateway是一个相对较新的项目,因此它的发展还在进行中,不断有新的版本发布。 | Zuul 1.x:Zuul 1.x于2013年首次发布,是Netflix在微服务架构中使用的API网关。它在Netflix的生产环境中得到了广泛的应用和测试,并且在社区中也很受欢迎。 Zuul 2.x:Netflix在后来决定重构Zuul,并在2016年发布了Zuul 2.x。Zuul 2.x使用了Netty作为底层框架,并采用了非阻塞的IO模型。然而,Netflix目前已将重点转向其他项目,对Zuul 2.x的开发和维护有所减少。 |
| 性能 | 作为一个专业的Web服务器和反向代理服务器,Nginx在性能方面非常强大。它采用事件驱动的架构和异步非阻塞的IO模型,可以处理大量的并发连接,并具有出色的内存使用效率。Nginx在处理静态文件和反向代理方面表现优秀,具有低延迟和高吞吐量。对于处理静态资源和负载均衡,Nginx通常是一个高效的选择。 | Spring Cloud Gateway是基于Spring生态系统构建的轻量级API网关。它使用了Reactor框架和WebFlux异步编程模型,具有响应式的特性。Spring Cloud Gateway在处理大量并发连接时能够提供良好的性能,特别适合处理高吞吐量的请求。它还提供了一些强大的功能,如动态路由、请求过滤和限流等。然而,由于其基于Java的特性和相对较重的内存消耗,与Nginx相比,在极端高负载的情况下可能会有一些性能上的差距。 | Zuul是Netflix开源的API网关,目前已经不再是Netflix的主要开发关注点。Zuul 1.x是基于阻塞I/O模型的,而Zuul 2.x使用了Netty作为底层框架,采用了非阻塞的IO模型。Zuul 2.x在性能方面相对于Zuul 1.x有所改进,但与Nginx和Spring Cloud Gateway相比,仍然可能有一些性能上的差距。Zuul在大量并发连接和高吞吐量的场景下可能会表现出一定的性能瓶颈。 |
| 社区 | 活跃 | 比较活跃 | 低活跃,Netflix把重点转向其他项目了包括推出了新的代理网关项目,如Spectator、Prana和Gloo等 |
| 亮点 | 高性能:Nginx以其出色的性能而闻名,能够处理大量的并发连接和高吞吐量请求。它的异步非阻塞IO模型和事件驱动架构使其在负载高的情况下表现出色。 稳定可靠:Nginx经过多年的发展和广泛的应用,被认为是稳定可靠的解决方案。它在大型生产环境中得到了广泛的应用和验证。 灵活性:Nginx具有高度可定制的配置选项,使得用户可以根据需求进行灵活的配置和扩展。它支持反向代理、负载均衡、缓存等功能,并具有强大的URL重写和请求过滤能力。 | 集成Spring生态系统:Spring Cloud Gateway是Spring Cloud项目的一部分,与其他Spring组件和微服务工具集成良好,可以无缝使用Spring Boot和Spring Cloud的功能。 响应式编程:Spring Cloud Gateway基于WebFlux和Reactor编程模型,具有响应式的特性。它可以处理大量并发请求,并具有良好的性能和扩展性。 动态路由和过滤器:Spring Cloud Gateway提供了灵活的动态路由功能和可插拔的过滤器机制,使用户能够根据需要自定义请求转发和处理。 | 成熟、简单门槛低 |
| 不足 | 编程扩展性:虽然Nginx支持自定义模块开发,但它的开发和扩展需要C语言编程和重新编译,对于一些开发人员而言可能会有一定的门槛。 | 相对较新:作为相对较新的项目,Spring Cloud Gateway可能在某些方面缺乏成熟性和广泛的应用场景经验。 内存消耗:Spring Cloud Gateway使用基于Java的技术栈,相对于Nginx可能需要更多的内存资源。 | 性能一般、可编程一般 |
3.2 硬件网关选型
硬件网关有像F5这样的硬件网关
四、基于Lvs+Nginx的工业级网关的架构
1.对于一个用户来说,假如他要访问一个公司的网页www.ok.com 首先我们要搭建一个HTTPDNS集群来保证他解析公司域名时能够获得调度精准、延迟降低的域名访问。
2.其次我们搭建针对4层和7层网络协议的高可用南北双机房架构的网关。
-
七层网关:通常用于HTTP协议通信的业务网关,我们一般采用Netty+keeplived实现双主热备的7层网关架构。单看一个机房,我们需要申请多个公网ip便于做DNS轮训的负载均衡,同时每个公网ip挂载到一个虚拟ip上,这个虚拟ip通过keeplived技术指向被选举为master的keeplived节点,如果master节点的Nginx服务器挂掉,则会选举另外一台权重高的Nginx网关服务器指向这个虚拟ip。
假设我们部署两台Netty,有两个公网ip,两个虚拟Ip,那么我们可以使这两台Nginx服务器互为备用节点,同时他们也都是各自虚拟ip下权重最高的master节点。实现双机热备。 -
四层网关:通常用户TCP+端口协议通信的视频上传、图片上传等服务,我们一般采用lvs(DR模式)+keeplived实现双主热备的4层网关架构。
lvs是Linux Virtual Server,我们一般常用DR模式来实现比Nginx更高性能的网关,因为在DR模式下,请求流量会经过lvs服务器,但是当后端ECS服务器节点处理完请求后,不会把请求像Nginx一样又通过Nginx返回回去。是通过一个独立的路由返回回去,极大的提高了效率。lvs也可以借助keeplived技术实现双主热备。