微服务网关选型与网关常用使用案例-架构

290 阅读8分钟

一、网关是什么

       网关是计算机网络中的一个设备或系统,用于连接两个或多个不同网络,并在这些网络之间传递数据和信息。它是网络通信的出入口,负责将数据包从源网络传递到目标网络,同时执行协议转换、安全控制、地址转换等功能。

       网关可以是物理设备,如路由器、交换机或防火墙,也可以是软件实体,如计算机上运行的网络代理程序。不论是硬件还是软件,网关都扮演着数据包转发和转换的角色,使得不同网络能够相互连接和通信。

       在一个网络服务中,有一些大家都需要做的事情,统一交给网关来做,比如说统一签名加密固定响应头证书SSL卸载等。而且我们现在的服务都是集群模式部署,我们通过公网IP访问到网关,再通过网关负载均衡把请求交给某个具体的后端ECS服务器处理。

网关简单图.png

二、网关常见功能

功能作用
监听协议能监听QUIC协议、HTTP/2协议、WEBSOCKET协议
序列化方式转换JSON与PB等多种序列化协议的转换(一般也是dubbo或其他网络框架层做的事,不用放到网关层)
请求签名、加解密在网关层给请求做解密,给返回体做加密或者签名
负载均衡与转发以轮询或者权重等负载均衡方案把流量导入到后端节点,根据path或者heade设置转发规则 详情见: Nginx静态资源兜底
QPS限速限制某些接口的访问请求QPS
流量调度多机房部署时,可以灵活切换流量到某一机房
灰度标签与染色在请求头header里面加上固定标签来做流量染色,生成TranceId等
Mock前后端在测试或开发环境联调接口时,在网关配置,访问某个接口的固定响应
静态资源兜底像Nginx可以在location中配置重定向,当访问结果非200时重定向到静态页面保证服务基本可用
证书卸载网关层TLS的证书卸载
黑白名单限制某些IP不能访问节点
访问日志监控归档访问记录
通知用户设备上的缓存是否刷新详情见: 用网关实现客户端刷新本地缓存的方案选型

三、网关选型

3.1 软件网关选型

对比NginxSpring cloud gatewayZuul
语言C/LuaJavaJava
时间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的工业级网关的架构

网关.jpg 网关架构大图

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技术实现双主热备。