目前 java 生态比较主流的网关(个人觉得)有:nginx,Spring Cloud Gateway,Zuul 等。
我大概看了网上关于这三个的性能测试,如果单单做路由转发似乎,nginx 的性能是最高的,gateway 其次(高并发),总体比较差的是 zuul,nginx 相对于其他两个大幅领先。另外 gateway 和 zuul 集齐了权限控制、限流熔断、负载均衡、轨迹追踪和实时监控等功能,当然大部分功能 大带宽服务器nginx 配合一些脚本应该也可以实现,可能只是一个集中维护和分开维护的问题。
想问一下各位大佬,平时生产环境对网关的选择,和这么做选择的理由是什么?谢谢大佬们。
nginx 一般是标配啊,通常是 nginx 的功能满足不了(比如应用编排、直接对接基于二进制协议的微服务)或者二开维护麻烦才会搞应用层网关,后两者使用起来大同小异吧,如果你们真的是高并发的话后两者都有不少性能上的坑等着你们去填
难道不是一起用吗?
直接用各种云的网关吧,功能强大,几乎你想到的没想到的都能控制。自己开发这么个网关肯定比直接买服务贵( BAT 级别的公司除外)
traefik 强无敌
Ambassador 或者 Kong
nginx 性能虽强,但功能有限。我们一般只用来做负载均衡和反向代理。后面还是 gateway 来实现做身份验证、鉴权、限流、接口访问日志等功能。
✌️
nginx 一般配合前端转发使用
spring cloud gateway 做应用层网关,经常需要根据业务做自定义拓展
是的,单做网关的 nginx 性能肯定是最好的,其实我更加好奇的是,如果把应用层网关的各种功能(我上面提到的权限控制等)集成到 nginx 之后,nginx 的性能还能比同样集成这些功能的应用层网关( gateway,zuul )的性能高多少。
个人觉得看需求,如果只是简单的做路由转发,权限控制,负载均衡等这些,不用应用层网关 nginx 应该也可以做到,只是要分点,分语言维护。不过就不知道性能对比,nginx 还能照样领先很多吗?
嗯嗯,这个也是办法,但毕竟是程序员,有些东西即使可以用别人的,还是要知道方案本身,万一哪天项目需求是要部署到自己的机房,嘿嘿。
好的 我想问一下,就你们生产环境的使用体验,这个相对上面我提到的那三个来说,性能,功能扩展(比如我文中提到的功能都能实现吗),语言支持等是怎么样的?
好的 我想问一下,就你们生产环境的使用体验,这两相对上面我提到的那三个来说,性能,功能扩展(比如我文中提到的功能都能实现吗),语言支持等是怎么样的?有什么局限性?
你提到的这些功能,nginx+脚本应该大部分都能实现。只是实现后 ng 性能不知还能否保持强劲,另外维护成本,对于 Java 开发人员来说还是比较高的。但如果从一切为了产品更好的角度来说,性能好和功能实现才是关键。
嗯,我看网上大部分也是这么做的,不过从这三者的性能比较来看,nginx 做网关的性能似乎明显比后两者高,而且大部分应用层网关的功能,nginx 配合脚本应该也是可以实现的,如果把应用层网关需要的功能迁移到 nginx 后,性能还是明显比应用层网关好的话,那何乐而不为。当然这只是我的假设,我也没去测过,只是想在这里问问大家,看看有没有人在生产环境中对比过这几个。
我们用了 Spring Gateway + ambassador
Spring Gateway 开发容易,有特定业务要求
ambassador 用的 enterprise,用来做 k8s 上部分 service 的 API Gateway,性能和扩展性都很好. enterprise 的不便宜
gateway 应该是和你业务用的语言 decouple 的吧
Kong 的话可以用 lua 做二次开发
性能是最不值钱的指标之一,比性能更不值钱的也就只有存储空间了。所以完全没有必要,也不应该为了追求性能而放弃其他优势。
性能在你的业务规模没上来之前是最没用的指标 , springmvc 性能排行榜在 170 多名开外,影响了他统治 java web 领域吗?
嗯嗯,谢谢分享。如你所说,网关大部分情况下是跟业务无关的,但应用级别的网关,可能有时会考虑一些功能性的业务。kong 配合 lua 确实可以辅助网关开发,Openresty 好像也可以。
是的,技术选择确实要综合各种因素,好的选择应该是结合现有条件做出的最优解,不同情况下采取的选择可能是不一样的。
嗯,如我上一层所说,性能确实不是唯一要素,但个人觉得也不能说就没有用,只是在某个时间点上,可以暂时不考虑,比如初创团队,人员少,事情多,这时要快速出产品或者周期迭代,有些技术成本比较高的方案可能就暂时不会被考虑,但如果现在面临的是一个稳定的团队,产品也逐渐成熟,用户量级逐步上升,面对一些新需求(比如产品 /服务优化)或者新产品,就可能要考虑一些更适合的方案了,而这时候性能可能就是其中需要考虑的一个重要的因素了。总之,既要拥抱技术,也要灵活使用技术,没有最好的选择,只有某个时间点最优的选择(个人认为)。
追求性能和功能的话,可以考虑一个新的 Nginx 发行版,可以访问 nginx.zone,这上面的功能应该能满足你的需要,保证性能的同时也包含了你要的功能需求。
嗯嗯,谢谢分享,这里主要是想知道大家对网关的选择和做出该选择考虑的因素,换句话说就是生产环境经验。不局限于考虑某个条件。
可以考虑 APISIX,各项功能可自行使用 Lua 开发,当前生态也挺不错。
谢谢,看起来不错的样子。
如果是应用网关,zuul 挺好,不适合国内的还是要用这个,支持 spring 微服务网关的 fizz gateway,动态热更新的带后台管理的支持聚合配置的网关。
嗯嗯,谢谢,提供新方案。