最近公司要引入统一网关,自己也参与调研了几种,当在研究Netflix的Zuul2和SpringCloudGateway时被网络上杂七杂八的材料跟震惊了,不客气地说很多国内博客都是在误人子弟,充斥着那些基于SpringCloud全家桶号称自己使用的是zuul2的“专家”。所以下定决心用一个系列好好介绍下第二代NIO的两个网关:SpringCloudGateway和NetflixZuul2。

背景介绍

我们系统架构面临现状和痛点

1.  流量调度不灵活,完全依赖DNS

虽然后端服务已经实现了多云多活,但是每次做流量割接的时候都要从DNS层一个运营商一个运营商的一点点的做调度。我需要有个统一接入层,可以直接把一个云平台的所有流量直接调到另一个云平台上

2.  各IDC的LB组件不同,配置管理不统一

对接入层的配置,变成了对每个产品LB入口的配置,我们大约有近百个应用,而且每个应用又涉及到物理机房IDC、阿里云、腾讯云这样的差异性,而且每家云平台LB的设计和操作又千差万别,所以接入层的配置变成了臃肿而且学习成本很高的一件事情。

3.  突发流量导致雪崩,无限流

公司目前没有限流策略,今年春节后因为疫情原因大家都窝在家里,我们的爆款节目就引发了两次因流量洪峰导致的重大故障。虽然后端的服务已经具备了很出色的弹性能力,但是弹性毕竟需要时间,因为缺乏接入层限流的保护,很容易造成后端服务雪崩效应。

4.  无法干预路由策略,无法混沌工程

今年我们将会启动混沌工程,更需要一个优秀的网关来配合打标或自定义路由,而且要能很好地控制网关的生命周期,因为混沌工程执行是临时性的,混沌结束后需要恢复。

我期望中的统一网关应该具备的能力

1、七层转发:基于path、host、uid、其他自定义方式。

2、拦截策略:统一安全,request、response报文干预。

3、统一管理:统一的监控、日志、配置管理方案。

4、限流熔断:基于不同粒度的限流规则。

现状图

理想图

网关发展史

选择网关之前我们要先了解下netflix与spring的恩怨情仇

蜜月期

2013: Netflix推出以zuul1为代表开的源项目

2014: SpringBoot诞生,引入Netflix开源组件

2015: SpringCloud诞生,引入Netflix开源组件

2016: 发现Zuul1存在性能问题,Netflix官宣进行优化

争执期

2016-2017: Netflix跳票

2018-05: Netflix发布Zuul 2.x,Spring未引入

2018-06: Netflix宣告Eureka 2.0 开源工作停止

分手

2018-11: Netflix宣告Hystrix开源工作停止

2018-11: Spring推出新一代网关Gateway、一些列孵化项目

2018-12:Spring官方宣布Netflix的相关项目进入维护模式

2018-12::Netflix 宣布 Spring 系列技术栈进入维护模式

SpringCloud因分手受影响的模块

spring-cloud-netflix-archaius

spring-cloud-netflix-hystrix-contract

spring-cloud-netflix-hystrix-dashboard

spring-cloud-netflix-hystrix-stream

spring-cloud-netflix-hystrix

spring-cloud-netflix-ribbon

spring-cloud-netflix-turbine-stream

spring-cloud-netflix-turbine

spring-cloud-netflix-zuul

总之一句话:爱过

网关的发展经历了BIO和NIO时代

一代网关:BIO

实现方式

基于Thread方式,当I/O阻塞系统,但CPU空闲的时候,可以利用多线程使用CPU资源

性能

严重依赖于线程,线程的创建和销毁成本很高;

线程本身占用较大内存。

代表

SpringCloudZuul(Netflix-Zuul1)

二代网关:NIO

实现方式

基于Reactor方式,成熟框架(Netty、MINA),当I/O阻塞系统,但CPU空闲的时候,可以利用多线程使用CPU资源。

性能

除了事件的轮询是阻塞的,剩余的都是纯CPU操作,单线程处理多任务;

由于线程的节约,高链接场景下线程切换带来的问题也随之解决;

I/O多路复用。

代表

SpringCloudGateway & Netflix-Zuul2

核心网关详解

Zuul2-架构

基于Filter的体系

Inbound

输入过滤器,在请求被代理之前执行。可用于:认证、路由、Ddos、指标统计等。

Endpoint

基于输入过滤器的执行情况处理请求,如:将请求代理到后端等。

Outbound

输出过滤器处理接收到后端服务返回后的操作;如:增删响应头信息、压缩等

Zuul2-动态过滤器

核心代码:ZuulFiltersModule,FilterFileManager,FilterLoader

核心配置:zuul.filters.classes,zuul.filters.packages,zuul.filters.locations

SpringCloudGateway

Gateway Handler Mapping

找到与请求相匹配的路由,将其发送到 Gateway Web Handler

Gateway Web Handler

通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑。

Filter

pre:Gateway转发请求之前

post:Gateway转发请求之后

网关对比与选型

网关对比

名称

Zuul1

Zuul2

Spring Cloud Gateway

Path注入

不自带,部分可实现

不自带,可以自己实现

自带

host转发

不支持

不自带,可以自己实现

自带

动态代码

不支持

可动态通过代码修改filter

不支持

动态配置

Archaius,Spring

Netflix Archaius

Spring(config+bus+actuator)或自开发

网关高可用

云平台的LB+弹性,Eureka

云平台的LB+弹性,Eureka

云平台的LB+弹性,Eureka

服务发现

eureka

eureka

eureka,nacos

功能扩展

只扩展过滤器

可创建路由规则,过滤规则

路由规则,过滤规则都可扩展

限流

信号量、线程数

内置限流统计,需要自己封装实现,集群可能需要自开发

引入redis计数,可细化到针对IP做限流,限流规则可自定义

熔断

Hystrix降级

需要基于内置的统计做封装

利用Hystrix

实现方式

BIO

NIO

NIO

技术选型

性能:

Gateway和Zuul2底层都是reactor模式,性能上比zuul1时代提高很多,所以zuul1不考虑。

开源:

Gateway社区更成熟,内置10种路由和20种过滤器,zuul2只有Netflix博客和github可获取相关资料,很多功能需要自己开发。

特性:

Zuul2基于groovy的filter代码动态更新是一大亮点,而且与混沌工程配合的天衣无缝,从Zuul2的设计思想来看就是要利用代码来替代配置

语言:

Netflix是Java+Groovy体系,Spring是Java体系

总结: 倾向于Zuul2

Spring Cloud Gateway VS Netflix Zuul2相关推荐

  1. Spring Cloud Gateway 能代替zuul2吗

    Spring Cloud Gateway 是 Spring Cloud Finchley 版推出来的新组件,用来代替服务网关:Zuul. 那 Spring Cloud Gateway 和 Zuul 都 ...

  2. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析

    API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...

  3. Spring Cloud Gateway一次请求调用源码解析

    简介: 最近通过深入学习Spring Cloud Gateway发现这个框架的架构设计非常简单.有效,很多组件的设计都非常值得学习,本文就Spring Cloud Gateway做一个简单的介绍,以及 ...

  4. 网关Spring Cloud Gateway的配置和使用

    文章目录 1. 什么是Spring Cloud Gateway? 2. Gateway与zuul的区别 3. Gateway的配置和使用 ①:常用的路由断言工厂 ②:常用的过滤器工厂(GatewayF ...

  5. Spring Cloud Gateway 原理与应用场景

    why 为什么需要网关? 如图可知: 在常规没有网关的情况下,无法对多个服务进行统一的处理,比如我需要做统一的鉴权,这时候需要在每个服务上增加鉴权功能来达到目的,工作量大且不好维护 在有网关的情况下, ...

  6. 青柠开车Spring Cloud(六) —— Spring Cloud Gateway与zuul使用对比

    青柠开车Spring cloud(一) -- 生态系统以及在企业项目中的基础架构图     (1-7),有时间可以看看 项目源码github地址 补充 Gateway简介 快速入门 Gateway 项 ...

  7. SpringCloud-07-新一代路由网关Spring Cloud Gateway

    服务网关Gateway 1. 概述简介 1. SpringCloud Gateway是什么? 服务网关还可以用Zuul网关,但是Zuul网关由于一些维护问题,所以这里我们学习Gateway网关,Spr ...

  8. Spring Cloud Gateway网关实战

    文章目录 介绍 基础示例 spring-cloud-gateway-service spring-cloud-gateway-sample网关 介绍 Spring Cloud Gateway是Spri ...

  9. Spring Cloud(10)——新一代网关Spring Cloud Gateway

    文章目录 Spring Cloud(10)--新一代网关Spring Cloud Gateway 1.背景知识--API网关 2.Spring Cloud Gateway 详细概述 3.Spring ...

最新文章

  1. 熵的定义(很好的方法论工具尤其第三熵增益的计算)
  2. DCMTK:搜索助手类的测试程序
  3. 318. 最大单词长度乘积 golang
  4. C++vector相关学习,我的理解
  5. LeetCode 188. 买卖股票的最佳时机 IV(动态规划)
  6. mysql定义条件和处理_mysql sql存储过程条件定义与处理
  7. python globals() 动态函数调用_[Python] 动态函数调用(通过函数名)
  8. LTE网络测试仪器和监控系统
  9. java 扇形_使用js画图之圆、弧、扇形
  10. HttpUtility.UrlEncode 方法
  11. java数组查找算法_JAVA数组中查找算法中equals和==的问题
  12. 公网服务器与局域网手机长连接
  13. hrbusrt 1900 权限问题
  14. standard、singleTop、singleTask、singleInstance
  15. Linux下 TP(触摸屏)驱动的框架分析
  16. 2022年第五届中青杯赛题浅评
  17. android抖音布局,Android快速集成抖音分享
  18. python四级考试时间_2016年四六级英语考试注意事项四六级考试建议
  19. 计算机英语rom是什么意思,rom是什么意思
  20. 建立您的启动:自定义会议视图

热门文章

  1. bool Frame::PosInGrid(const cv::KeyPoint kp, int posX, int posY)
  2. socket网络程序设计实验一,通过域名查询IP/gethostbyname(基于python3.7、PyQt5)
  3. 图片编辑工具有哪些?图片编辑修改文字工具安利
  4. 企业架构(EA)产生背景
  5. User Datagram Protocol (UDP)
  6. android avrcp处理流程,Android Bluetooth AVRCP
  7. 数据泄露DLP 简单理解
  8. 恭主驾到——老司机是怎么年检的?
  9. C++游戏手柄编程-基于windowsAPI-JOYSTICKID
  10. 3D与Blender:开源的3D计算机图形软件集