gateway

发布时间 2023-10-18 15:16:47作者: 吾执青剑向天涯

GATEWAY

image-20231017113000602

导包

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

编写配置文件

server:
  port: 10010

spring:
  application:
    name: getaway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/order/**   

参数详情

  • 路由id:路由唯一标识
  • uri:路由目的地,支持lb和http两种
  • predicates: 路由断言,判断请求是否 符合要求,符合就转发给目的地
  • filters:路由过滤器,处理请求或响应

断言工厂

  • 我们配置在文件中的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
  • 例如Path=/user/**是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRouteFactory类来处理的
  • 像这样的断言工厂在SpringCloudGateway还有几十个。

路由断言工厂Route Predicate Factory

Spring 提供了11种基本的Predicate工厂:

名称 说明 示例
After 是某个时间点后的请求 - After=2037-01-20T17:42:47.789-07:00[Amerca/Denver]
Before 是某个时间点之前的请求 - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between 是某两个时间点之间的请求 - Between=2037-01-20T17:42:47.789-07:00[America/Denver],2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie 请求必须包含某些Cookie - Cookie=chocolate,ch.p
Header 请求必须包含某些header - Header=X-Request-Id,\d+
Host 请求必须是访问某个host(域名) - Host=**.somehost.org,**.anotherhost.org
Method 请求方式必须是指定方式 - Method=GET,POST
Path 请求路径必须符合指定规则 - Path=/red/{segment},/blue/**
Query 请求参数必须包含指定参数 - Query=name,Jack或者- Query=name
RemoteAddr 请求的ip必须是指定范围 - RemoteAddr=192.168.1.1/24
Weight 权重处理

路由过滤器 GatewayFilter

filters:

Spring提供了有31个过滤工厂

名称 说明 示例
AddRequestHeader 给当前请求添加一个请求头 - AddrequestHeader=True,nb
RemoveRequestHeader 移除请求中的一个请求头
AddResponseHeader 给响应结果中添加一个响应头
RemoveResponseHeader 从响应结果中移除有一个响应头
RequestRateLiniter 限制请求的流量
  • AddrequestHeader=True,nb [True,nb 是key=value]

默认过滤器

对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

和routes同级

spring:
	gateway:
		routes:
			- id: user-service
			  uri: lb://userservice
			  prodicates:
			  	- Path=/user/**
			  filters:
			  	# - AddRequestHeader=True,nb  # 局部过滤器
		default-filters:
			- AddRequestHeader=True,nb # 对所有路由都生效
	

全局过滤器 GlobalFilter

全局过滤器的作用也是处理一切进入网关的请求和微服务响应

实现GlobalFilter

public interface GlobalFikter{
    /**
    * 处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
    *
    * @param exchange 请求上下文,里面可以获取Request,Response等信息
    * @param chain 用来吧请求委托给下一个过滤器
    * @retrun {@code Mono}
    */
    Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain);
}