Spring Cloud API网关之Zuul原理

  • API网关

       API网关是对外服务的一个入口,其隐藏了内部架构的实现,是微服务架构中必不可少的一个组件。API网关可以为我们管理大量的API接口,还可以对接客户、适配协议、进行安全认证、转发路由、限制流量、监控日志、防止爬虫、进行灰度发布等。

  • zuul简介 

       Zuul是Netflix OSS中的一员,是一个基于JVM路由和服务端的负载均衡器。提供路由、监控、弹性、安全等方面的服务框架。Zuul能够与Eureka、Ribbon、Hystrix等组件配合使用。Zuul的核心是过滤器,通过这些过滤器我们可以扩展出很多功能,比如:

❑ 动态路由:动态地将客户端的请求路由到后端不同的服务,做一些逻辑处理,比如聚合多个服务的数据返回。

❑ 请求监控:可以对整个系统的请求进行监控,记录详细的请求响应日志,可以实时统计出当前系统的访问量以及监控状态。

❑ 认证鉴权:对每一个访问的请求做认证,拒绝非法请求,保护好后端的服务。

❑ 压力测试:压力测试是一项很重要的工作,像一些电商公司需要模拟更多真实的用户并发量来保证重大活动时系统的稳定。通过  Zuul可以动态地将请求转发到后端服务的集群中,还可以识别测试流量和真实流量,从而做一些特殊处理。

❑ 灰度发布:灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

  •  Zuul工作原理

       Zuul可以实现很多高级的功能,比如限流、认证等。想要实现这些功能,必须要基于Zuul给我们提供的核心组件“过滤器”。

  •        过滤器机制

                 zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。

                zuul把Request route到 用户处理逻辑 的过程中,这些filter参与一些过滤处理,比如Authentication,Load Shedding 

                等。

                下图是zuul过滤器机制的原理图:

Spring Cloud API网关之Zuul原理   

  •                     Zuul提供了一个框架,可以对过滤器进行动态的加载,编译,运行。

                    Zuul的过滤器之间没有直接的相互通信,他们之间通过一个RequestContext的静态类来进行数据传递的。

                           RequestContext类中有ThreadLocal变量来记录每个Request所需要传递的数据。

                    Zuul的过滤器是由Groovy写成,这些过滤器文件被放在Zuul Server上的特定目录下面,Zuul会定期轮询这些目录,

                          修改过的过滤器会动态的加载到Zuul Server中以便过滤请求使用。

Zuul中的过滤器跟我们之前使用的javax.servlet.Filter不一样,javax.servlet.Filter只有一种类型,可以通过配置urlPatterns来拦截对应的请求。而Zuul中的过滤器总共有4种类型,且每种类型都有对应的使用场景。

❑ pre:可以在请求被路由之前调用。适用于身份认证的场景,认证通过后再继续执行下面的流程。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

❑ route:在路由请求时被调用。适用于灰度发布场景,在将要路由的时候可以做一些自定义的逻辑。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

❑ post:在route和error过滤器之后被调用。这种过滤器将请求路由到达具体的服务之后执行。适用于需要添加响应头,记录响应日志等应用场景。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

❑ error:处理请求时发生错误时被调用。在执行过程中发送错误时会进入error过滤器,可以用来统一记录错误信息。

 

  •                       内置的特殊过滤器

zuul还提供了一类特殊的过滤器,分别为:StaticResponseFilter和SurgicalDebugFilter

StaticResponseFilter:StaticResponseFilter允许从Zuul本身生成响应,而不是将请求转发到源。

SurgicalDebugFilter:SurgicalDebugFilter允许将特定请求路由到分隔的调试集群或主机。

  •                       自定义的过滤器

除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。

例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。

 

  • 过滤器的生命周期

 Zuul请求的生命周期如图,该图详细描述了各种类型的过滤器的执行顺序。

Spring Cloud API网关之Zuul原理