5.GetWay的高级特性(实际工作中使用)
5.1.Predicate介绍:
a.Predicate源码阅读:
- 1.由以下代码可以看出Predicate是一个接口,且由注解
@FunctionalInterface
可以看出他是一个函数式接口,即接口中就只有个抽象方法
a.Predicate是什么:
- 1.启动9527,可以看到如下Predicate
- 2.断言:路径相匹配的进行路由
b.Route Predicate Factories是什么东东??
- 1.Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分
- 2.Spring Cloud Gateway包括许多
内置的Route Predicate 工厂
,所有这些Predicate都与Http请求的不同属性相匹配,多个Route Predicate工厂可以进行组合
- 3.Spring Cloud Gateway创建Route对象时,使用RoutePredicateFactory创建Predicate对象,Predicate对象可以赋值给Route,
SpringCloudGateway包含许多内置的RoutePredicateFactores
- 4.所有这些谓词都匹配Http请求的不同属性。多种谓词工厂可以组合,并通过逻辑 and
c.常用的RoutePredicate:
d.常用的Predicate
- After Route Predicate:在什么时间之后执行
- Before Route Predicate:在什么时间之前执行
- Between Route Predicate:在什么时间之间执行
- Cookie Route Predicate:Cookie级别
6.5.常用的测试工具:
- jmeter
- postman
- curl
// curl命令进行测试,携带Cookie
curl http://localhost:9527/payment/lb --cookie "username=zzyy"
- Header Route Predicate:携带请求头
- Host Route Predicate:什么样的URL路径过来
- Method Route Predicate:什么方法请求的,Post,Get
- Path Route Predicate:请求什么路径
- Path=/api-web/**
- Query Route Predicate:带有什么参数的
6.Filter的使用
7.1.概念
- 1.指的是Spring框架中GatewayFilter的实例
,使用过滤器,可以在请求被路由前或者路由之后对请求进行修改
- 2.路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用
- 3.Spring Cloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生的
7.2.生命周期:
- 1.pre
- 2.Post
7.3.种类:
- 1.GatewayFilter:单一功能的过滤器
- 2.GlobalFilter:全局的过滤器
7.4.自定义全局GlobalFilter
a.主要作用:
- 全局日志记录
- 统一网关鉴权
b.需要实现接口:
- 1.
implements GlobalFilter, Ordered
c.全局过滤器代码如下:
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("come in global filter: {}", new Date());
ServerHttpRequest request = exchange.getRequest();
String uname = request.getQueryParams().getFirst("uname");
if (uname == null) {
log.info("用户名为null,非法用户");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
// 放行
return chain.filter(exchange);
}
/**
* 过滤器加载的顺序 越小,优先级别越高
*
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
===========
============================================
- 4.GetWay有如下特点:
- 动态路由,能匹配任何请求属性
- 可以对路由指定Predicate(断言) 和 Filter(过滤器)
- 集成Hystrix的断路器功能
- 集成Spring Cloud服务发现功能
- 易于编写Predicate 和 Filter
- 请求限流功能
- 支持路径重写
c.GetWay模型:
- 1.传统的Web框架,比如Struts2,Spring MVC等都是基于Servlet API 与Servlet容器基础之上运行的
- 2.但是在Servlet 3.1之后有了
异步非阻塞的支持
,而WebFlux是一个典型的非阻塞异步的框架,它的核心是基于Reactor的相关API实现的,相对于传统的Web框架来说,它可以运行在如 Netty,Undertow 及支持Servlet3.1的容器上。非阻塞式 + 函数式编程(Spring5必须让你使用Java8) - 3.Spring WebFlux是Spring 5.0引入的新的响应式框架,区别与Spring MVC,他不依赖Servlet API,它是完全异步非阻塞的,并且基于Reactor来实现响应式流规范