栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java > SpringBoot

Spring Cloud gateway 网关服务二 断言、过滤器

SpringBoot 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Cloud gateway 网关服务二 断言、过滤器

微服务当前这么火爆的程度,如果不能学会一种微服务框架技术。怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习。说没有时间?没有精力?要学俩个框架?而Spring Cloud alibaba只需要你学会一个就会拥有俩种微服务治理框架技术。何乐而不为呢?加油吧!骚猿年

上一篇我们讲述了gateway 的路由功能其实也类似与zuul服务的路由转发。
今天主要讲一下断言机制。

内置的断言工厂 介绍 Spring Cloud Gateway将路由作为Spring WebFlux HandlerMapping基础架构的一部分进行匹配。Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些断言都与HTTP请求的不同属性匹配。多个Route Predicate工厂可以合并,也可以通过逻辑合并

可以看到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 版权协议,转载请附上原文出处链接和本声明。转载请附带公众号二维码

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/234570.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号