概述-OVERVIEW
来自Spring官网的一段对于Spring Gateway的概述:
This project provides a library for building an API Gateway on top of Spring WebFlux. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency.
大意为:
这个项目提供了一个库,用于在Spring WebFlux之上构建API网关。
Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到api,并为它们提供横切关注点,例如:安全性、监控/指标和弹性。三个关键词来概述Gateway的作用:
- 路由
- 负载均衡
- 请求功能增强
Gateway的三个概念
核心概念 | 描述 |
---|---|
Routes(路由) | 路由是请求转发的基本模块,它定义了请求的匹配规则和如何转发请求。它包括:唯一id、目标URI以及断言+过滤器。 |
Predicate(断言) | 断言用于定义请求的匹配条件,它决定了请求是否会被路由到相应的目标。断言可以根据请求的路径、请求头、请求方法等进行匹配,如果请求与断言条件匹配成功,则会被路由到相应的目标。 |
Filter(过滤器) | 过滤器用于在请求被路由到目标之前或之后对请求和响应进行处理。过滤器可以用于日志记录、鉴权、请求转换、请求修改等用途。Spring Cloud Gateway提供了一组内置的过滤器,同时也支持自定义过滤器。 |
NGINX与Gateway
在Spring微服务架构中,请求通常是通过NGINX反向代理服务器路由到网关。下面是请求从NGINX到网关的一般流程:
- 客户端发起请求:客户端发送HTTP请求到NGINX服务器。NGINX作为反向代理服务器,监听特定的端口,并将请求转发给后端服务。
- NGINX代理配置:NGINX服务器配置文件中定义了代理规则。这些规则指示NGINX如何转发请求。其中,可以将特定的URL或路径匹配到网关的地址。
- 网关接收请求:NGINX根据代理规则将请求转发给Spring Cloud网关。Spring Cloud网关是微服务架构中的入口点,它负责路由请求到相应的微服务实例。
- 路由规则匹配:Spring Cloud网关收到请求后,将根据预先定义的路由规则进行匹配。这些路由规则指示网关将请求转发到哪个具体的微服务实例。
- 转发请求:一旦路由规则匹配成功,Spring Cloud网关将请求转发到目标微服务实例。这可以通过HTTP或负载均衡等技术实现。
Gateway在微服务中的作用
统一入口点
Spring Cloud Gateway作为微服务架构的入口点,所有的外部请求都通过网关进行访问。这样可以集中处理所有的请求,并提供一个统一的访问接口。
路由与负载均衡
Spring Cloud Gateway可以根据预定义的路由规则将请求路由到相应的微服务实例。它支持动态路由配置,可以根据需要进行灵活的路由配置。同时,Gateway还提供负载均衡功能,可以将请求均匀地分发到多个微服务实例中。
安全与认证
Spring Cloud Gateway可以实现对请求的安全性和认证控制。它可以集成各种安全机制,如基于角色的访问控制、JWT验证、OAuth2等,以确保只有经过授权的用户才能访问相应的微服务。
过滤与请求处理
Gateway通过过滤器(filters)提供了丰富的请求处理功能。过滤器可以对请求进行预处理、校验和处理响应等。开发者可以自定义过滤器来实现各种功能,如日志记录、请求转发、参数验证等。
监控和日志
Spring Cloud Gateway提供了丰富的监控和日志功能。它可以记录请求和响应的详细信息,帮助开发者进行故障排查和性能优化。此外,可以集成监控工具和日志收集系统,实现对网关的实时监控和日志分析。
降级与熔断
Gateway可以通过集成熔断器(如Hystrix)来实现微服务的降级和熔断功能。当后端微服务不可用或出现故障时,Gateway可以快速响应降级策略,返回预定义的响应或转发到备用服务,提高系统的可靠性和容错性。
Gateway请求处理
Spring Cloud Gateway通过路由规则来处理请求并将其路由到各个微服务,路由规则定义了请求的匹配条件和目标微服务的路由方式。每个路由规则由一个或多个谓词(Predicates)和一个或多个过滤器(Filters)组成。
- 谓词(Predicates):谓词用于匹配请求的条件。它可以基于请求的路径、方法、请求头等进行匹配。
- 过滤器(Filters):过滤器用于对请求进行处理和转换。它可以在请求被路由到目标微服务之前或之后执行一些操作
在JDK 8中,Predicates(谓词)是一个函数式接口,定义在java.util.function包中。它用于表示一个接受一个参数并返回布尔值的函数,常用于条件判断和筛选。Predicates的主要作用是用于对集合、流或其他数据结构中的元素进行筛选、过滤和条件判断。它可以与其他函数式接口(如Function、Consumer等)结合使用,实现更复杂的操作。
以下代码可以配置网关转发请求到各个微服务功能:
spring:
cloud:
gateway:
routes:
- id: service1_route
uri: lb://service1
predicates:
- Path=/service1/**
filters:
- Name=Weight, Args:
weight=2
- id: service2_route
uri: lb://service2
predicates:
- Path=/service2/**
filters:
- Name=Weight, Args:
weight=1
- id:路由规则的唯一标识符。
- uri:目标微服务的地址。
- predicates:谓词条件,用于匹配请求的路径。
- filters:使用weight控制不同微服务节点的流量比例
图片引用自:
http://www.ranxiao.top/2019/07/10/spring-cloud-gateway-request-process-flow/
请求分发过程
- 客户端从NGINX到达Gateway
- Gateway接收请求,根据预先定义的路由规则进行匹配
- Gateway的Predicates断言匹配到对应的路由规则,而后到达过滤器执行过滤器逻辑,如:IP黑名单校验、日志记录、鉴权、请求转换、修改等。若无法匹配到对应的路由规则,断言失败,则请求将被拒绝并返回响应的错误响应。
- 请求与某个路由规则匹配成功,确定目标服务的地址
- Gateway将请求转发到目标服务的地址
- 目标服务接收到请求并处理。
- 目标服务将响应发送回Spring Cloud Gateway。
- Spring Cloud Gateway将响应返回给客户端。
以上,一个客户端请求便从NGINX经过Gateway被负载均衡/分发到了对应的业务层。
请求响应过程
- 微服务处理请求:当请求到达微服务后,业务逻辑会根据请求进行处理,生成响应数据。
- 返回响应数据:微服务会使用HTTP响应的形式将响应数据发送回Gateway。这通常包括设置HTTP状态码、响应头和响应体等信息。
- 网络传输:响应数据通过网络传输回Gateway。这可以通过HTTP协议或其他适用的通信协议来完成。
- Gateway接收响应:Gateway会接收到微服务返回的响应数据。它会根据路由规则将响应数据发送给相应的客户端。
原图请下载:
引用请标明出处,原创不易!
感谢您阅读到这里,如果您对笔者其他文章感兴趣,可以扫一扫关注笔者的公众号:种颗代码技术树