《架构世界》2020微服务刊:微服务分布式事务实战
上QQ阅读APP看书,第一时间看更新

1Spring Cloud Gateway简介

API网关

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

• 客户端会多次请求不同的微服务,增加了客户端的复杂性。

• 存在跨域请求,在一定场景下处理相对复杂。

• 认证复杂,每个服务都需要独立认证。

• 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。

• 某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。

以上这些问题可以借助API网关解决。API网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过API网关这一层。

使用API网关后的优点如下:

• 易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。

• 易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。

• 减少了客户端与各个微服务之间的交互次数。

Spring Cloud Gateway

Spring Cloud GatewaySpring官方基于Spring 5.0Spring Boot 2.0Project Reactor等技术开发的网关。Spring Cloud Gateway旨在为微服务架构提供一种简单有效而统一的API路由管理方式。

Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关各类功能,例如:安全,监控/埋点,和限流等。

SCG架构

如图所示,Spring Cloud Gateway的架构如上,看起来很简单。它内部包含了一个高性能的Netty Server,用来接收各类网络请求。请求进来之后,会根据配置的各个路由进行匹配并处理请求。每个路由都可以定义多个断言(Predicate),用于路由匹配。

SCG默认提供了10多个内建的断言,可以基于请求的各个方面(请求头,路径,路径,时间,Cookiehttp方法等)进行路由匹配。如果还不够,用户还可以自已扩展。

请求匹配到了合适的路由之后,就会按照路由中配置的各过滤器(filter),按顺序对请求进行处理。Filter也基本上可以对请求的所有属性做处理,修改,添加或者除请求头,修改请求数据,修改返回的数据等,几乎无所不能。当然,修改请求也只是一方面的用途,认证,鉴权,记录日志等也都可以在网关中统一来做。

所有filter形成处理链,直到所有的filter处理完,才会交给最后面的Netty Client,由它将处理过的请求发送至对应的微服务。

在请求发送至微服务之前,还可以定义它的负载均衡策略(LoadBalancerRule),以决定请求至底发往微服务的哪个实例。

FilterLoadBalancerRule都支持自行扩展。