上一篇我们讲述了gateway 的路由功能其实也类似与zuul服务的路由转发。
今天主要讲一下断言机制。
可以看到gateway 提供如此之多丰富的断言,方式。
- 比如说时间控住的,我们能想到秒杀场景。
- ip 的我们能想到金丝雀测试
- 权重我们可以使用灰度等等场景的应用
具体使用还得参照业务场景来选择更适合我们的业务场景。
gateway 过滤器 分为全局过滤器,个性化过滤器gateway 已经给我们提供了非常丰富的过滤器
-
AddRequestHeader GatewayFilter工厂采用名称和值参数。
这会将X-Request-Foo:Bar标头添加到所有匹配请求的下游请求的标头中。 spring: cloud: gateway: routes: - id: add_request_header_route uri: https://example.org filters: - AddRequestHeader=X-Request-Foo, Bar AddRequestHeader知道用于匹配路径或主机的URI变量。URI变量可用于该值,并将在运行时扩展。 spring: cloud: gateway: routes: - id: add_request_header_route uri: https://example.org predicates: - Path=/foo/{segment} filters: - AddRequestHeader=X-Request-Foo, Bar-{segment}
-AddResponseHeader GatewayFilter工厂采用名称和值参数。
spring: cloud: gateway: routes: - id: add_request_parameter_route uri: https://example.org filters: - AddRequestParameter=foo, bar
这将添加foo=bar到所有匹配请求的下游请求的查询字符串中。
AddRequestParameter知道用于匹配路径或主机的URI变量。URI变量可用于该值,并将在运行时扩展。
spring:
cloud:
gateway:
routes:
- id: add_request_parameter_route
uri: https://example.org
predicates:
- Host: {segment}.myhost.org
filters:
- AddRequestParameter=foo, bar-{segment}
-
AddResponseHeader GatewayFilter工厂采用名称和值参数。
spring:
cloud:
gateway:
routes:
- id: add_response_header_route
uri: https://example.org
filters:
- AddResponseHeader=X-Response-Foo, Bar这会将X-Response-Foo:Bar标头添加到所有匹配请求的下游响应的标头中。
AddResponseHeader知道用于匹配路径或主机的URI变量。URI变量可用于该值,并将在运行时扩展。
spring:
cloud:
gateway:
routes:
- id: add_response_header_route
uri: https://example.org
predicates:
- Host: {segment}.myhost.org
filters:
- AddResponseHeader=foo, bar-{segment} -
DedupeResponseHeader GatewayFilter工厂采用一个name参数和一个可选strategy参数。name可以包含标题名称列表,以空格分隔。
spring:
cloud:
gateway:
routes:
- id: dedupe_response_header_route
uri: https://example.org
filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin如果网关CORS逻辑和下游逻辑都添加了重复的值Access-Control-Allow-Credentials和Access-Control-Allow-Origin响应标头,则这将删除它们。
DedupeResponseHeader过滤器还接受可选strategy参数。可接受的值为RETAIN_FIRST(默认值)RETAIN_LAST,和RETAIN_UNIQUE
-
Hystrix是Netflix的一个库,用于实现断路器模式。Hystrix GatewayFilter允许您将断路器引入网关路由,保护您的服务免受级联故障的影响,并允许您在下游故障的情况下提供后备响应
要在项目中启用Hystrix GatewayFilters,请spring-cloud-starter-netflix-hystrix从Spring Cloud Netflix添加依赖项。Hystrix GatewayFilter工厂需要一个name参数,它是的名称HystrixCommand。
spring:
cloud:
gateway:
routes:
- id: hystrix_route
uri: https://example.org
filters:
- Hystrix=myCommandName
这会将其余的过滤器包装在HystrixCommand带有命令名的中myCommandName。
Hystrix过滤器还可以接受可选fallbackUri参数。当前,仅forward:支持计划的URI。如果调用了后备,则请求将被转发到与URI相匹配的控制器。
spring: cloud: gateway: routes: - id: hystrix_route uri: lb://backing-service:8088 predicates: - Path=/consumingserviceendpoint filters: - name: Hystrix args: name: fallbackcmd fallbackUri: forward:/incaseoffailureusethis - RewritePath=/consumingserviceendpoint, /backingserviceendpoint
/incaseoffailureusethis调用Hystrix后备时,它将转发到URI。请注意,此示例还通过lb目标URI 上的前缀演示了(可选)Spring Cloud Netflix Ribbon负载平衡。
主要方案是对fallbackUri网关应用程序中的内部控制器或处理程序使用。但是,也可以将请求重新路由到外部应用程序中的控制器或处理程序,如下所示:
spring:
cloud:
gateway:
routes:
- id: ingredients
uri: lb://ingredients
predicates:
- Path=//ingredients
@Component
@Slf4j
public class AuthorizeFilter implements GlobalFilter, Ordered {
private static final String AUTHORIZE_TOKEN = "Authorization";
private static final String AUTHORIZE_UID = "uid";
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
HttpHeaders headers = request.getHeaders();
ServerHttpRequest.Builder mutate = request.mutate();
String token = headers.getFirst( AUTHORIZE_TOKEN );
String uid = headers.getFirst( AUTHORIZE_UID );
String method = request.getMethodValue();
log.info( "AuthorizeFilter token 全局过滤器 token:{},uid:{}",token,uid );
if (token == null) {
token = request.getQueryParams().getFirst( AUTHORIZE_TOKEN );
}
if(StringUtils.isNotBlank(token)){
//TODO 权限验证
}
return chain.filter( exchange );
}
@Override
public int getOrder() {
return 0;
}
}
然后启动服务。
curl http://localhost:9000/client/client/test
日志打印
[2019-11-05 19:30:52.802] [INFO ] com.xian.cloud.filter.AuthorizeFilter - AuthorizeFilter token 全局过滤器 token:null,uid:null
下一篇我们将介绍定制的过滤器,针对下游服务对应过滤器
摘自参考 spring cloud 官方文档
示例代码地址
服务器nacos 地址 http://47.99.209.72:8848/nacos
往期地址 spring cloud alibaba 地址
spring cloud alibaba 简介
Spring Cloud Alibaba (nacos 注册中心搭建)
Spring Cloud Alibaba 使用nacos 注册中心
Spring Cloud Alibaba nacos 配置中心使用
spring cloud 网关服务
Spring Cloud zuul网关服务 一
Spring Cloud 网关服务 zuul 二
Spring Cloud 网关服务 zuul 三 动态路由
Spring Cloud alibaba网关 sentinel zuul 四 限流熔断
Spring Cloud gateway 网关服务 一
如何喜欢可以关注分享本公众号。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。转载请附带公众号二维码



