Gateway
Gateway 网关是微服务架构中的重要组件,作为所有微服务的统一入口,扮演着“门卫”的角色。它负责处理进入系统的所有请求,并根据预设的规则将请求路由到相应的微服务进行处理。(需要进行服务的注册与发现)
官网地址:Spring Cloud Gatewayhttps://docs.spring.io/spring-cloud-gateway/docs/4.0.4/reference/html/
Gateway 网关的核心功能
路由和负载均衡
Gateway 网关能够根据请求的路径、请求头等信息,将请求路由到相应的微服务实例。当目标服务有多个实例时,Gateway 还能实现负载均衡,确保请求被均匀地分发到各个实例上。
权限控制
作为服务的入口,Gateway 网关可以对进入系统的请求进行权限校验。只有通过了权限校验的请求,才能被转发到相应的微服务进行处理。
请求限流
当系统面临大量请求时,Gateway 网关可以通过限流策略,控制进入系统的请求数量,避免系统因过载而崩溃。
熔断机制
Gateway 网关还可以集成熔断机制,当检测到下游服务异常时,自动切断对该服务的请求,防止异常服务的扩散,提高系统的整体可用性。
Gateway三大核心
路由(Route)
-
ID:路由的唯一标识符,用于区分不同的路由规则。
-
目标URI:请求被转发到的目标地址,可以是具体的服务地址,也可以是服务名(用于服务发现)。
-
断言(Predicates):一系列条件表达式,用于判断请求是否符合该路由的转发规则。
-
过滤器(Filters):一系列过滤器,用于在请求被转发之前或之后对请求进行修改。
当客户端向网关发送请求时,网关会根据配置的路由规则进行匹配。如果请求符合某个路由的断言条件,那么该请求就会被转发到该路由指定的目标URI。在转发过程中,还可以应用一系列过滤器对请求进行修改。
断言(Predicate)
-
Path:根据请求的URL路径进行匹配。
-
Method:根据请求的方法(如GET、POST等)进行匹配。
-
Header:根据请求头中的某个字段进行匹配。
-
Query:根据请求参数进行匹配。
-
RemoteAddr:根据请求的来源IP地址进行匹配。
当请求到达网关时,网关会依次检查配置的断言条件。只有所有断言条件都满足时,请求才会被转发到目标URI。
过滤器(Filter)
-
RewritePath:重写请求的URL路径。
-
ModifyRequestBody:修改请求的请求体。
-
ModifyResponseBody:修改响应的响应体。
在请求被转发到目标服务之前或之后,网关会依次执行配置的过滤器。每个过滤器都可以对请求或响应进行修改,以满足特定的业务需求。例如,可以在请求中添加认证信息,或在响应中添加自定义的响应头。
Gateway 网关的工作流程
-
请求接收:客户端向 Gateway 网关发送请求。
-
路由匹配:Gateway 根据预设的路由规则,判断请求应该被路由到哪个微服务。
-
权限校验:对请求进行权限校验,确保请求者具有访问权限。
-
负载均衡:如果目标服务有多个实例,Gateway 会根据负载均衡策略选择一个实例进行处理。
-
请求转发:将请求转发到目标微服务实例。
-
响应处理:接收微服务的响应,并根据需要进行处理(如添加响应头、修改响应体等)。
-
响应返回:将处理后的响应返回给客户端
操作流程:
============================改pom文件,添加相关依赖================================
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--服务注册发现consul discovery,网关也要注册进服务注册中心统一管控-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- 指标监控健康检查的actuator,网关是响应式编程删除掉spring-boot-starter-web dependency-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
==========================写yml文件,配置相关信息==================================
server:
port: 9527
spring:
application:
name: cloud-gateway #以微服务注册进consul或nacos服务列表内
cloud:
consul: #配置consul地址
host: localhost
port: 8500
discovery:
prefer-ip-address: true
service-name: ${spring.application.name}
gateway:
routes:
- id: pay_routh1 #pay_routh1 #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
predicates:
- Path=/pay/gateway/get/** # 断言,路径相匹配的进行路由
- id: pay_routh2 #pay_routh2 #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
predicates:
- Path=/pay/gateway/info/** # 断言,路径相匹配的进行路由
Gateway高级特性
Route(路由),痛点当端口号发生改变时URL地址写死,服务网关的灵活性下降不方便。Route可以以微服务名来进行动态获取服务的URL
具体语法:uri:lb://cloud-payment-service
predicate(断言),spring cloudgateway将路由匹配作为Spring WebFlux Handler Mapping基础框架的一部分。
SpringCloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性相匹配。多个Route Predicate工厂可以进行组合。
SpringCloud Gateway创建Route对象时,使用Route PredicateFactory创建Predicate对象Predicate对象可以赋值给Route,SpringCloud Gateway包含许多内置的Route PredicateFactories,所有这些谓词都匹配HTTP请求的不同属性,多种谓词工厂可以进行组合,并通过逻辑and
配置路由断言工厂和网关过滤器工厂
有两种方法可以配置谓词和过滤器shortcuts 和 fully expanded arguments即快捷方式配置,完全展开的参数配置。如果想要了解更加全面的路由断言工厂与过滤器工厂请移步至官网进行学习,这里列举出一些常见的工厂配置
快捷方式配置
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- Cookie=mycookie,mycookievalue
完全展开参数配置
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- name: Cookie
args:
name: mycookie
regexp: mycookievalue
Route Predicate Factories(路由谓词工厂)
Spring Cloud 网关将路由作为 Spring WebFlux 基础结构的一部分进行匹配。 Spring Cloud 网关包括许多内置的路由谓词工厂。 所有这些谓词都与 HTTP 请求的不同属性匹配。 您可以将多个路由谓词工厂与逻辑语句组合在一起
-
After Route谓词工厂:路由谓词工厂采用一个参数a。此谓词匹配在指定日期/时间之后发生的请求。配置after路由谓词:
After datetime ZonedDateTime
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- After=2024-12-26T15:46:08.362726100+08:00[Asia/Shanghai]
#此路由匹配2024年12月26日 15:45 山区时间(上海)之后发出的任何请求
-
Before Route谓词工厂:路由谓词工厂采用一个参数a。此谓词匹配在指定日期/时间之前发生的请求。配置before route谓词:
Before datetime ZonedDateTime
spring:
cloud:
gateway:
routes:
- id: before_route
uri: https://example.org
predicates:
- Before=2024-12-26T15:46:08.362726100+08:00[Asia/Shanghai]
#此路由匹配2024年12月26日 15:45 山区时间(上海)之前发出的任何请求。
-
Between路由谓词工厂:路由谓词工厂采用两个参数,它们是Java对象。此谓词匹配在指定时间段发送的请求。配置between route谓词:
datetime1 ZonedDateTime1
,datetime2 ZonedDateTime2
spring:
cloud:
gateway:
routes:
- id: between_route
uri: https://example.org
predicates:
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], spring:
cloud:
gateway:
routes:
- id: between_route
uri: https://example.org
predicates:
- Between=2024-12-26T15:46:08.362726100+08:00[Asia/Shanghai], 2017-01-21T17:42:47.789-07:00[America/Denver]
#此路由匹配2024年12月26日 15:45 山区时间(上海)到2024年12月26日 15:50 山区时间(上海)时间段内发出的任何请求
-
Cookie路由谓词工厂:路由谓词工厂采用两个参数Cookie和a(正则表达式)。
Cookie
路由谓词工厂会检查请求中的Cookie,并根据你指定的Cookie名称和值来决定是否满足路由条件。如果请求中包含指定名称的Cookie,并且其值与预期的值匹配,那么该请求就会被路由到相应的下游服务。配置cookie路由谓词工厂:Cookie name regexp
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://example.org
predicates:
- Cookie=chocolate, ch.p
#表示要具有cookie的请求,cookie名称与其值与正则表达式匹配
-
Header路由谓词工厂它根据HTTP请求中的Header信息来决定是否将请求路由到指定的下游服务。Header路由谓词工厂接受两个参数:Header的名称(name)和对应的值(value,支持正则表达式)。只有当请求中包含指定名称的Header,并且其值与预期的正则表达式匹配时,请求才会被路由到目标服务。配置Header路由谓词工厂:
Header header regexp
spring:
cloud:
gateway:
routes:
- id: header_route
uri: https://example.org
predicates:
- Header=X-Request-Id, \d+
#表示请求头要包含X-Request-Id属性并且值为整数的正则表达式
-
Host路由谓词工厂:它基于HTTP请求中的Host头部信息来进行路由决策。当HTTP请求的Host头部与配置的Host模式匹配时,该请求就会被路由到指定的下游服务。配置主机路由谓词工厂:
Host patterns
.Host
spring:
cloud:
gateway:
routes:
- id: host_route
uri: https://example.org
predicates:
- Host=**.somehost.org,**.anotherhost.org
#请求标头中必须要含有主机相关的key-value信息,并且值与正则表达式相匹配
-
Method路由谓词工厂:它根据HTTP请求的方法(如GET、POST、PUT、DELETE等)来决定是否将请求路由到指定的下游服务。当请求的方法与配置的HTTP方法匹配时,该请求就会被路由到相应的服务。配置方法路由谓词工厂:
Method methods
spring:
cloud:
gateway:
routes:
- id: method_route
uri: https://example.org
predicates:
- Method=GET,POST
#满足对应的请求方式才允许被访问
-
path路由谓词工厂:它基于HTTP请求的URI路径来决定是否将请求路由到指定的下游服务。Path路由谓词工厂允许你定义一系列的路径模式,当请求的URI路径与这些模式中的任何一个匹配时,请求就会被路由到相应的服务。配置路径路由谓词工厂:
Path PathMatcher patterns matchTrailingSlash true
spring:
cloud:
gateway:
routes:
- id: path_route
uri: https://example.org
predicates:
- Path=/red/{segment},/blue/{segment}
#符合上述路径格式的请求才允许被访问
-
Query路由谓词工厂:路由谓词工厂采用两个参数,一个required(属性名)和一个optional(属性值/正则表达式)。配置查询路由谓词工厂:
Query param regexp
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://example.org
predicates:
- Query=username,\d+
#要有参数名username并且值还要是整数才能路由
-
RemoteAddr 路由谓词工厂:路由谓词工厂采用 的列表(最小大小 1),这些列表是 CIDR 表示法(IPv4 或 IPv6)字符串,例如(其中 是 IP 地址,是子网掩码)。配置远程路由谓词工厂:
RemoteAddr sources 192.168.0.1/16 192.168.0.1 16
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: https://example.org
predicates:
- RemoteAddr=192.168.1.1/24
Gateway Filter Factories(网关过滤工厂)
路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。 路由过滤器的范围限定为特定路由。 Spring Cloud 网关包括许多内置的 GatewayFilter 工厂。
①与请求头相关的过滤工厂
-
AddRequestHeaderGatewayFilter工厂:AddRequestHeaderGatewayFilter工厂是Spring Cloud Gateway中的一个内置过滤器工厂,它允许你为所有匹配的HTTP请求添加一个或多个自定义的请求头。
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: https://example.org
filters:
- AddRequestHeader=X-Request-name, hulmose
-
RemoveResponseHeader GatewayFilter工厂:RemoveResponseHeader GatewayFilter工厂是Spring Cloud Gateway提供的一个内置过滤器工厂,它用于从HTTP响应中移除指定的响应头。这在某些场景下非常有用,比如当你想要隐藏或移除某些敏感信息或不必要的响应头时。
spring:
cloud:
gateway:
routes:
- id: requestheadersize_route
uri: https://example.org
filters:
- RequestHeaderSize=1000B
-
SetRequestHeader GatewayFilter 工厂:SetRequestHeader GatewayFilter 工厂是Spring Cloud Gateway提供的一个内置过滤器工厂,它允许你为所有匹配的HTTP请求设置一个或多个自定义的请求头。与AddRequestHeader GatewayFilter工厂不同,SetRequestHeader会替换或覆盖已有的同名请求头,而不仅仅是添加。
spring:
cloud:
gateway:
routes:
- id: setrequestheader_route
uri: https://example.org
filters:
- SetRequestHeader=X-Request-Red, Blue
②与请求参数相关的过滤工厂
-
AddRequestParameter GatewayFilter 工厂:AddRequestParameter GatewayFilter 工厂是Spring Cloud Gateway提供的一个内置过滤器工厂,它允许你为所有匹配的HTTP请求添加一个或多个自定义的请求参数。这对于在请求转发到下游服务之前,向请求中添加额外的参数非常有用。
spring:
cloud:
gateway:
routes:
- id: add_request_parameter_route
uri: https://example.org
filters:
- AddRequestParameter=red, blue
-
RemoveRequestParameter GatewayFilter 工厂:RemoveRequestParameter GatewayFilter 工厂是Spring Cloud Gateway提供的一个内置过滤器工厂,它允许你从所有匹配的HTTP请求的查询字符串中移除指定的参数。这在某些情况下非常有用,比如当你想要清除某些敏感信息或不必要的参数时。
spring:
cloud:
gateway:
routes:
- id: removerequestparameter_route
uri: https://example.org
filters:
- RemoveRequestParameter=red
③与响应头相关的过滤工厂
-
AddResponseHeader GatewayFilter 工厂:AddResponseHeader GatewayFilter 工厂是Spring Cloud Gateway提供的一个内置过滤器工厂,它允许你为所有匹配的HTTP响应添加一个或多个自定义的响应头。这对于在响应返回给客户端之前,向响应中添加额外的信息非常有用。
spring:
cloud:
gateway:
routes:
- id: add_response_header_route
uri: https://example.org
filters:
- AddResponseHeader=X-Response-Red, Blue
-
RemoveResponseHeader GatewayFilter 工厂:RemoveResponseHeader GatewayFilter 工厂是Spring Cloud Gateway提供的一个内置过滤器工厂,它允许你从所有匹配的HTTP响应中移除指定的响应头。这在某些场景下非常有用,比如当你想要清理或隐藏某些不必要的或敏感的响应头信息时。
spring:
cloud:
gateway:
routes:
- id: removeresponseheader_route
uri: https://example.org
filters:
- RemoveResponseHeader=X-Response-Foo
-
SetResponseHeader GatewayFilter 工厂:SetResponseHeader GatewayFilter 工厂是Spring Cloud Gateway提供的一个内置过滤器工厂,它允许你为所有匹配的HTTP响应设置一个或多个自定义的响应头。与AddResponseHeader GatewayFilter工厂不同,SetResponseHeader会替换或覆盖已有的同名响应头,而不仅仅是添加。
spring:
cloud:
gateway:
routes:
- id: setresponseheader_route
uri: https://example.org
filters:
- SetResponseHeader=X-Response-Red, Blue
④与前缀和路径相关的过滤工厂
-
The PrefixPath GatewayFilter Factory:PrefixPath GatewayFilter Factory 是 Spring Cloud Gateway 提供的一个内置过滤器工厂,它允许你为所有匹配的 HTTP 请求添加一个指定的路径前缀。这在某些场景下非常有用,比如当你想要将特定路由的请求重定向到一个特定的路径下时。
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- PrefixPath=/mypath
-
RedirectTo GatewayFilter 工厂:RedirectTo GatewayFilter 工厂是Spring Cloud Gateway提供的一个内置过滤器工厂,它允许你将匹配的HTTP请求重定向到指定的URL。这在处理某些路由时非常有用,特别是当你想要将用户引导到另一个页面或站点时。
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- RedirectTo=302, https://acme.org
⑤其它
-
默认过滤器:在Spring Cloud Gateway中,默认过滤器(Default Filters)允许你为所有的路由(routes)配置一组公共的过滤器。这意味着,当你定义了默认过滤器后,它们会自动应用到所有未显式指定过滤器的路由上。这大大简化了配置过程,尤其是当多个路由需要共享相同的过滤逻辑时。
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Response-Default-Red, Default-Blue
- PrefixPath=/httpbin
以上的部分断言与过滤器均取自官网: