下面将介绍一些常用网关解决方案:
Nginx 是由 IgorSysoev 为俄罗斯访问量第二的 http://Rambler.ru 站点开发的,一个高性能的 HTTP 和反向代理服务器。Ngnix 一方面可以做反向代理,另外一方面做可以做静态资源服务器。
Nginx 是 C 语言开发,而 Zuul 是 Java 语言开发
Nginx 负载均衡实现,采用服务器实现负载均衡,而 Zuul 负载均衡的实现是采用 Ribbon + Eureka 来实现本地(客户端)负载均衡。
Nginx 适合于服务器端负载均衡,Zuul 适合微服务中实现网关。
Nginx 相比 Zuul 功能会更加强大,因为 Nginx 可以整合一些脚本语言(Nginx + Lua)
Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP / POP3 /SMIP 服务器。Zuul 是 Spring Cloud Netflix 中的开源的一个 API Gateway 服务器,本质上是一个 Servlet 应用,提供动态路由,监控,弹性,安全等边缘服务的框架。 Zuul 相当于是从设备和网站到应用程序后端的所有请求的前门。
Nginx 适合做门户网关,是作为整个全局的网关,对外的处于最外层的那种;而 Zuul 属于业务网关,主要用来对应不同的客户端提供服务,用于聚合业务。各个微服务独立部署,职责单一,对外提供服务的时候需要有一个东西把业务聚合起来。
Zuul 可以实现熔断、重试等功能,这是 Nginx 不具备的。
Kong 是 Mashape 提供的一款 API 管理软件,它本身是基于 Ngnix + Lua 的,但比 Nginx 提供了更简单的配置方式,数据采用了 Apache Cassandra/PostgreSQL 存储,并且提供了一些优秀的插件,比如验证,日志,调用频次限制等。Kong 非常诱人的地方就是提供了大量的插件来扩展应用,通过设置不同的插件可以为服务提供各种增强的功能。
gitHub:https://github.com/Kong/kong
基于 Nginx 所以在性能和稳定性上都没有问题。Kong 作为一款商业软件,在 Nginx 上做了很扩展工作,而且还有很多付费的商业插件。Kong 本身也有付费的企业版,其中包括技术支持、使用培训服务以及 API 分析插件。
学习曲线较陡:Kong 基于 OpenResty(Nginx + Lua)构建,对于不熟悉 Nginx 配置和 Lua 脚本编程的团队来说,入门和掌握 Kong 的使用方法可能会比较困难。
资源占用相对较高:由于 Kong 功能丰富,它的性能开销相对一些轻量级网关可能会大一些。在处理大量并发请求时,其内存和 CPU 占用率可能会比较高。
插件生态系统复杂:Kong 拥有众多的插件,虽然这是它的一个优势,但插件的质量和兼容性参差不齐。有些插件可能没有得到很好的维护,或者在更新 Kong 核心版本后出现兼容性问题。
分布式环境下的复杂性:在分布式系统中,Kong 的配置同步和集群管理可能会比较复杂。如果有多个 Kong 实例组成集群,确保它们之间的配置一致性和数据同步是一个挑战。
Traefik 是一个开源的 GO 语言开发的为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。Traefik 拥有一个基于 AngularJS 编写的简单网站界面,支持 Rest API,配置文件热更新,无需重启进程。高可用集群模式等。
相对 Spring Cloud 和 Kubernetes 而言,目前比较适合 Kubernetes。
官网:https://doc.traefik.io/traefik/
Zuul 是 Netflix 公司开源的一个 API 网关组件,Spring Cloud 对其进行二次基于 Spring Boot 的注解式封装做到开箱即用。目前来说,结合 Sring Cloud 提供的服务治理体系,可以做到请求转发,根据配置或者默认的路由规则进行路由和 Load Balance,无缝集成 Hystrix。
虽然可以通过自定义 Filter 实现我们想要的功能,但是由于 Zuul 本身的设计是基于单线程的接收请求和转发处理,是阻塞 IO,不支持长连接。目前来看 Zuul 就显得很鸡肋,随着 Zuul 2.x 一直跳票(2019 年 5 月发布了 Zuul 2.0 版本),Spring Cloud 推出自己的 Spring Cloud Gateway。
点击下载/查看本教程相关资料或者源代码。