SpringCloud微服务实战系列:04用了spring-cloud-gateway网关,为什么外面还需要加一层nginx网关
目录
一个完整的项目项目除了spirngcloud 后端各个模块实现的动态接口外,还有大量的静态资源:比如前端页面相关的js、html 、css 图片等资源。客户端(app或者浏览器)一般都是通过统一域名访问这些资源的,那么就需要统一的网关绑定域名作为出口, 而nginx就是这个统一出口比较好的选择,主要是性能方面的考虑。
原因分析:
1.Nginx的高性能
Nginx是一个基于C++编写的高性能Web服务器和反向代理服务器,它以事件驱动的方式处理请求,能够高效地处理大量并发连接。
Nginx的底层实现使其在处理静态资源、SSL终止、HTTP压缩等方面具有显著优势。
2. SpringCloud Gateway的Java性能瓶颈
SpringCloud Gateway是基于Java编写的,虽然Java语言本身具有强大的功能和丰富的生态系统,但在处理高并发请求时,其性能可能受到JVM(Java虚拟机)和垃圾回收机制的限制。
因此,在高并发场景下,Nginx的性能优势更加明显。
各自的职责:
它们性能的差别决定了它们职责不同:
Nginx的静态资源处理:
Nginx非常适合作为静态资源的服务器,它可以高效地缓存和分发静态文件,如图片、CSS、JavaScript等。这有助于减轻后端服务的压力,提高系统的整体性能。
因为在流量处理上的能力很强,所以转发后端接口对nginx来说就是小case了,所以后端接口也会经过nginx转发到SpringCloud Gateway。
SpringCloud Gateway的动态路由和API管理:
SpringCloud Gateway 是springcloud 全家桶体系,所以和其他组件交互就比较容易,能和其他组件顺畅对接,实现复杂的业务网关能力:
1. 请求转发:可以读取注册中心的下游服务器信息,实现请求转发
2. 用户认证鉴权、风控:读取用户模块信息,做用户认证鉴权、风控。
3. 限流和接口灰度转发:可以根据用户信息做限流和灰度路由。
4. 其他业务网关的功能还有很多。
当然你也可以通过自己扩展nginx模块实现这些功能,但因为nginx是C++写的,所以整个技术栈和springcloud 完全不兼容,实现代价就非常大。
网关可实现的功能:
在网关层其实可以做很多事情,至于你是放在nginx里面做,还是spring-cloud-gateway里面做,并没与明确规定。但是只要是java能做的,性能上和C++没有明显区别的,大多数公司都会选择放到spring-cloud-gateway来实现, 从项目管理和成本上考虑,后端业务基于springcloud 技术栈的公司,是不会轻易用C++进行nginx扩展模块开发的, 大多数java技术栈的公司也不具备C++的开发能力。
更多推荐




所有评论(0)