gateway
GATEWAY
导包
<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);
}