使用API网关进行路由和过滤
本章将讨论基于微服务架构的下一个重要元素,即API网关(API Gateway)。这不是我们在实践中第一次遇到这个元素。本书在第4章“服务发现”中实现了一个简单的网关模式,目的是介绍分区机制如何在使用Eureka的情况下进行服务发现。我们还曾经使用过Netflix的Zuul库,它是一个基于Java虚拟机(Java Virtual Machine, JVM) 的路由器和服务器端负载均衡器。Netlix 设计了Zuul,以提供身份验证、压力测试和金丝雀测试(Canary Test) 、动态路由,以及主动流量管理/主动多区域流量管理( Active Multregional Traffic Management)等功能。虽然没有明确说明,但它也可以充当微服务架构中的网关,其主要任务是从外部客户端隐藏系统的复杂性。
事实上,到目前为止,Zuul 在Spring Cloud框架内的API网关模式实现方面没有任何竞争对手。但是,随着一个名为Spring Cloud Gateway的新项目的逐步发展,情况正在发生变化。这个新项目建立在Spring Framework 5. Project Reactor和Spring Boot 2.0的基础之上。该库的最近一个稳定版本是1.0.0,但目前正在开发的版本2.0.0中则有许多重要的变化,它仍然处于里程碑阶段。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由API, 并提供与其相关的跨领域问题,如安全性、监控/指标和弹性。虽然该解决方案相对较新,但绝对值得关注。
本章将要讨论的主题包括:
口基于URL的静态路由和负载均衡。
口将Zuul和Spring Cloud Gateway与服务发现集成。
口使用Zuul创建自定义过滤器。
口使用Zuul自定义路由配置。
口在路由失败的情况下提供Hytrix后备。
口对Spring Cloud Gateway中包含的主要组件——谓词和网关过滤器的说明。
使用Spring Cloud Netflix Zul
SpringCloud实现了一个嵌入式Zuul代理,允许前端应用程序对后端服务的代理调用。此功能对外部客户端非常有用,因为它隐藏了系统复杂性,有助于避免为所有微服务独立管理跨源资源共享(Cross-Origin Resource Sharing,CORS) 和身份验证问题。要启用它,可以使用@EnableZulProxy注解Spring Boot 的main类,并将传入的请求转发到目标服务。当然,Zuul也可以与Ribbon负载均衡器、Hystrix 断路器和服务发现(如使用Eureka)集成在一起。
构建网关应用程序
现在不妨先回到第7章中的示例,将最后一个元素附加到基于微服务的架构: API网关中。我们尚未考虑的是外部客户端调用服务的方式。首先,我们不希望公开系统内运行的所有微服务的网络地址。我们还可以在一个地方执行某些操作,如请求身份验证或设置跟踪标头。对于上述问题的解决方案是仅共享单个边缘网络地址,该地址会将所有传入请求代理到适当的服务。当前示例的系统架构如图8.1所示。
对于当前示例的这些需求,不妨回过头来参考一下第7章已经讨论过的项目。它可以在GitHub的master分支(tps:/ithib com/piomin/sample-spring -cloud-comm.gt)中找到。现在,我们将为该项目添加-一个名为gateway-service 的新模块。第一步就是将Zuul包含在Maven依赖项中,这里必须使用spring- cloud-starter-zuul启动器