11 微服务架构学习与思考:开源 API 网关02-以 Java 为基础的 API 网关详细介绍

微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍
上一篇关于网关的文章:
微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍,介绍了为什么会有网关及以 Nginx 为基础的网关 。
一、网关 zuulzuul 网关使用 java 语言开发,是 Netflix 公司出品的开源网关 。它是 SpringCloud 的组件之一 。zuul 有 2 个大的版本:

  • zuul1:zuul1 wiki
  • zuul2:zuul2 wiki
1.1 zuul1 架构zuul1 是基于 Servlet 构建的,采用的是阻塞和多线程方式,它一个线程处理一次连接 。I/O 操作是通过从线程池中选择一个工作线程执行 I/O 来完成的,并且请求线程将阻塞,直到工作线程完成为止 。工作线程在其工作完成时通知请求线程 。如下图:
11 微服务架构学习与思考:开源 API 网关02-以 Java 为基础的 API 网关详细介绍

文章插图
(netflix blog: https://netflixtechblog.com/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c)
这种处理线程模型,当后端API延迟增加或错误导致重试,线程数也会随之增加 。这种情况发生时,就会给节点服务器带来麻烦,使服务器负载激增,为了消除这种麻烦,构建了限流机制(比如hystrix)保持系统的稳定 。
zuul1 中网关功能怎么实现,在请求周期通过 Filter 实现,如下图:
11 微服务架构学习与思考:开源 API 网关02-以 Java 为基础的 API 网关详细介绍

文章插图
?(from:https://github.com/Netflix/zuul/wiki/How-it-Works)
1.2 zuul2 架构zuul2 对 zuul1 进行了重大的重构,采用异步和事件驱动模式处理程序 。请求和响应的生命周期通过事件和回调机制来处理 。没有像 zuul1 那样针对每个请求使用一个线程,不需要大量的线程成本,只需要一个文件描述符和一个监听器 。而且像 zuul1 发生后端延迟和“重试风暴”,不是增加线程,zuul2 中是在队列中增加事件,这个开销比多个线程开销小得多 。
11 微服务架构学习与思考:开源 API 网关02-以 Java 为基础的 API 网关详细介绍

文章插图
(netflix blog: https://netflixtechblog.com/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c)
关于高性能网络IO编程模型,可以看我之前的文章,点击这里看文章
zuul2 网关中那么多功能是怎么实现的呢?是在请求周期(request cycle)中,通过 Filter 来处理实现 。
11 微服务架构学习与思考:开源 API 网关02-以 Java 为基础的 API 网关详细介绍

文章插图
?(from:https://github.com/Netflix/zuul/wiki/How-It-Works-2.0)
Filter:
Filter 过滤器是 zuul2 业务逻辑处理的核心,它可以在请求-响应周期的不同部分运行 。分为 3 个 Filter:
  1. Inbound Filters:Inbound 过滤器,在请求到源之前执行,可用于身份验证、路由和装饰请求等处理操作
  2. Endpoint Filters:Endpoint 过滤器,可用于返回静态响应,否则内置的 ProxyEndpoint 过滤器会将请求路由到源 。
  3. Outbound Filters:Outbound 过滤器,请求处理之后执行,可用于度量、装饰处理之后的请求或增加自定义 header 。
更多 zuul2 Filter 用法请查看 Filter wiki 。
说明:在 zuul2 中编写 Filter,使用的是 groovy 语言,它可以动态更新,不需要重启服务器 。
1.3 zuul2 特性