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-servercloud:gateway:routes:- id: user-service #路由iduri: http://localhost:9001 #目标url,路由到微服务的地址predicates: #断言条件- Path=/user-service/**filters: #过滤器- StripPrefix=1
- 将网关服务注册到注册中心
eureka:instance:prefer-ip-address: trueinstance-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 #路由iduri: 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: trueroutes:- id: user-service #路由iduri: lb://user-servicepredicates: #断言条件- Path=/user-service/**- Query=abc- Method=post- After=
filters使用
- 全局过滤器:Spring Cloud Gateway内置了很多不同类型的过滤器,另外也可以自定义全局过滤器
@Component
public class CustomGlobalGateWayFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("自定义全局过滤器执行了");return chain.filter(exchange);}/** 过滤器执行顺序,数值越小优先级越高*/@Overridepublic int getOrder() {return 0;}
}
- 局部过滤器
@Component
public class CustomGateWayFilter implements GatewayFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("自定义过滤器执行了");return chain.filter(exchange);}/** 过滤器执行顺序,数值越小优先级越高*/@Overridepublic int getOrder() {return 0;}
}
- 注册过滤器
@Configuration
public class RoutesConfiguration {@Beanpublic RouteLocator routeLocator(RouteLocatorBuilder builder) {return builder.routes().route(r -> r.path("/user/**").uri("lb://user-service").filters(new CustomGateWayFilter()).id("user-service")).build();}
}