gateway网关
核心概念:
- 路由(route):路由信息由 D、目标 RI、一组断言和一组过滤器组成。如果断言路由为真,则说明请求的 URI 和配配
- 断言(predicate): Java8 中的断言函数,可以配置http请求的断言条件,断言成功会对匹配的路径进行路由
- 过滤器(filter):过滤器分为两种类型,分别是 Gateway Filter 和Global Filter。过滤器可以对请求和响应进行处理
工作原理
客户端向Spring Cloud网关发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序运行通过特定于请求的筛选器链发送请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前或之后执行逻辑。执行所有“前置”过滤器逻辑,然后发出代理请求。发出代理请求后,将执行“后”过滤器逻辑
开始使用
- 工程目录
gateway-demo
|----eureka-server 注册中心 8761
|----gateway-server 网关服务 9002
|----user-service 用户服务 9001,提供一个查询用户列表的功能
- 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 配置文件添加路由配置
server:
port: 9002
spring:
application:
name: gateway-server
cloud:
gateway:
routes:
- id: user-service #路由id
uri: http://localhost:9001 #目标url,路由到微服务的地址
predicates: #断言条件
- Path=/user-service/**
filters: #过滤器
- StripPrefix=1
- 将网关服务注册到注册中心
eureka:
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${server.port}
client:
service-url:
defaultZone: http://localhost:8761/eureka/
最初的路由配置还没有接入到注册中心,路由的配置uri: http://localhost:9001写死的映射地址。注册到注册中心后映射地址通过服务名动态获取
cloud:
gateway:
routes:
- id: user-service #路由id
uri: lb://user-service #目标url,路由到微服务的地址
predicates: #断言条件
- Path=/user-service/**
filters: #过滤器
- StripPrefix=1
断言的使用
predicates路由匹配规则,当匹配对应的断言条件为true,才回映射到目标url
- Path=/user/** 匹配对应的url,将匹配的url追加在目标url后面
- Query=xxx 匹配请求参数中有指定参数的请求
- Method=GET,POST 匹配任意get请求
- After= 路由指定时间之后的请求
- Before=路由指定时间之前的请求
- RemoteAddr=192.168.21.1 匹配请求远程地址是RemoteAddr的地址
- Header=X-Reques-Id \d+ 匹配包含指定请求头的请求
- Cookie=匹配带有指定cookie的请求
cloud:
gateway:
enabled: true
routes:
- id: user-service #路由id
uri: lb://user-service
predicates: #断言条件
- Path=/user-service/**
- Query=abc
- Method=post
- After=
filters使用
- 全局过滤器:Spring Cloud Gateway内置了很多不同类型的过滤器,另外也可以自定义全局过滤器
@Component
public class CustomGlobalGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("自定义全局过滤器执行了");
return chain.filter(exchange);
}
/*
* 过滤器执行顺序,数值越小优先级越高
*/
@Override
public int getOrder() {
return 0;
}
}
- 局部过滤器
@Component
public class CustomGateWayFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("自定义过滤器执行了");
return chain.filter(exchange);
}
/*
* 过滤器执行顺序,数值越小优先级越高
*/
@Override
public int getOrder() {
return 0;
}
}
- 注册过滤器
@Configuration
public class RoutesConfiguration {
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes().route(r -> r
.path("/user/**")
.uri("lb://user-service")
.filters(new CustomGateWayFilter())
.id("user-service"))
.build();
}
}