摘要:微服务架构把臃肿的服务拆分为多个服务进行治理。在这种情况下,有多个服务就会有多个接口和多个域名,这会造成客户端访问的混乱等问题。网关可方便地对多个微服务接口进行管理,对客户端提供统一的服务入口,同时还可以对鉴权、限流和降级进行控制。本章主要讲解Spring C
微服务架构把臃肿的服务拆分为多个服务进行治理。在这种情况下,有多个服务就会有多个接口和多个域名,这会造成客户端访问的混乱等问题。网关可方便地对多个微服务接口进行管理,对客户端提供统一的服务入口,同时还可以对鉴权、限流和降级进行控制。本章主要讲解Spring Cloud网关的使用方法。
API网关本身也是一个服务。作为一种微服务的统一入口,API网关不仅为客户端提供接口,而且还增加了一些功能,如权限管理、指标监控、限流、降级、缓存及负载均衡等。简而言之,网关为客户端提供统一的访问入口,并做一些非业务的逻辑处理。
当前常见的API主要有基于OpenResty的Kong、基于Go语言开发的Tyk、基于Netflix开源的Zuul及Spring Cloud出品的Spring Cloud网关。本节主要介绍Spring Cloud网关。
API网关作为业务网关,可以定制与扩展,一般包含以下功能和特性:
性能:具有高可用、负载均衡和容错机制等特性。
安全:提供权限认证。
全链路日志:可以进行全链路调用系统分析。
缓存:返回数据缓存。
监控:进行QPS和响应时间等的信息监控。
限流:进行流量限流控制。
降级:进行系统降级与熔断。
路由:提供动态路由规则。
Spring Cloud网关提供了一个基于Spring 5、Spring Boot 2.x和Project Reactor等技术的API网关,旨在为微服务架构提供一种简单、有效的方式对接口进行路由调用,并提供安全、监控、埋点和限流等方面的功能。Spring Cloud网关是基于Spring WebFlux框架实现的,而Spring WebFlux框架的底层是基于Reactor模式的Netty框架。
Spring Cloud网关的主要特性如下:
基于Spring 5、Spring Boot 2.x及Project Reactor进行架构。
集成Hystrix断路器。
集成服务发现。
集成Actuator API。
提供动态路由规则。
可以进行限流。
提供Predicates和Filters规则。
下面介绍Spring Cloud网关中的3个重要概念。
Route(路由):Spring Cloud网关的基本组成模块。Route模块是由一个ID、目标URI、一组断言和一组过滤器来定义的,如果断言为真,则路由匹配,目标URI就会被访问。
Predicate(断言):从Java 8以后提供了断言函数。SpringCloud网关中的断言函数的输入类型是ServerWebExchange,该函数允许开发者定义来自于HTTP请求中的任何信息,如请求头和参数等。
Filter(过滤器):Spring Framework GatewayFilter的实例,由特定工厂生成,可以对请求和响应进行修改。
Spring Cloud网关的架构如图9.1所示
从图9.1中可以看到,客户端首先向Spring Cloud网关发出请求,然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送给Gateway Web Handler进行处理,Gateway Web Handler再通过指定的Filter Chain将请求发送给代理服务执行业务逻辑,最终将结果返回。过滤器可能会在发送代理服务之前(pre)或之后(post)执行过滤逻辑。
配置断言与过滤器一般有两种方式,一种是快捷方式,另一种是全展开参数方式。下面分别给出两种官方示例。
下面的例子使用快捷方式定义一个Cookie断言,其中有两个参数,表示Cookie名称的是mycookie, Cookie的值为mycookievalue。
spring:
cloud:
gateway:
routes:
-id: after_route
uri: https://example.org
predicates:
-Cookie=mycookie,mycookievalue
下面的例子使用全展开参数的方式配置断言,其类似于标准的YAML配置方式。本例提供了name key和args key,其中,args key的值是一个map类型的参数。
spring:
cloud:
gateway:
routes:
-id: after_route
uri: https://example.org
predicates:
-name: Cookie
args:
name: mycookie
regexp: mycookievalue
来源:大数据架构师