如何理解Spring Cloud gateway网关服务中断言和过滤器

发布时间:2021-09-29 16:48:52 作者:iii
来源:亿速云 阅读:127

这篇文章主要介绍“如何理解Spring Cloud gateway网关服务中断言和过滤器”,在日常操作中,相信很多人在如何理解Spring Cloud gateway网关服务中断言和过滤器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Spring Cloud gateway网关服务中断言和过滤器”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

内置的断言工厂

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

如何理解Spring Cloud gateway网关服务中断言和过滤器

可以看到gateway 提供如此之多丰富的断言,方式。

具体使用还得参照业务场景来选择更适合我们的业务场景。

gateway 过滤器 分为全局过滤器,个性化过滤器

gateway 已经给我们提供了非常丰富的过滤器

-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}

这会将其余的过滤器包装在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/**
					filters:
					- name: Hystrix
						args:
							name: fetchIngredients
							fallbackUri: forward:/fallback
				- id: ingredients-fallback
					uri: http://localhost:9994
					predicates:
					- Path=/fallback

在此示例中,fallback网关应用程序中没有终结点或处理程序,但是另一个应用程序中有一个终结点或处理程序,在下注册localhost:9994。

如果将请求转发给后备,则Hystrix网关过滤器还会提供Throwable引起请求的。它已ServerWebExchange作为 ServerWebExchangeUtils.HYSTRIX_EXECUTION_EXCEPTION_ATTR属性添加到,可以在网关应用程序中处理后备时使用。

对于外部控制器/处理程序方案,可以添加带有异常详细信息的标头。您可以在FallbackHeaders GatewayFilter Factory部分中找到有关它的更多信息。

Hystrix设置(例如超时)可以使用全局默认值配置,也可以使用Hystrix Wiki上说明的应用程序属性在逐条路由的基础上进行配置。

要为上述示例路由设置5秒超时,将使用以下配置:

hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds: 5000

在此示例中,在运行时发生执行异常后HystrixCommand,该请求将转发到在上fallback运行的应用中的端点或处理程序localhost:9994。具有异常类型,消息和-if available-根本原因异常类型和消息的标头将由FallbackHeaders过滤器添加到该请求。

通过设置下面列出的参数的值及其默认值,可以在配置中覆盖标头的名称:

- executionExceptionTypeHeaderName("Execution-Exception-Type")

- executionExceptionMessageHeaderName("Execution-Exception-Message")

- rootCauseExceptionTypeHeaderName("Root-Cause-Exception-Type")

- rootCauseExceptionMessageHeaderName("Root-Cause-Exception-Message")

您可以在Hystrix GatewayFilter Factory部分中找到有关Hystrix如何与Gateway一起工作的更多信息。

这会将X-Request-Foo:<values>标头添加到下游请求的标头中,其中包含来自传入的HTTP请求Bar标头的更新值。

这将/mypath作为所有匹配请求的路径的前缀。因此,对的请求/hello将发送给/mypath/hello。

因为spring cloud gateway 提供的内置过滤器太多了。不在这里一一介绍 可以查看官方的文档 进行了解学习

gateway官方文档

https://cloud.spring.io/spring-cloud-gateway/reference/html/

接下来讲一下,全局过滤器GlobalFilter接口。

可以看一下默认的实现的全局过滤器 ,除去AuthorizeFilter过滤器都是默认的过滤器

如何理解Spring Cloud gateway网关服务中断言和过滤器

具体的里面的作用,其实上面的已经有了简单的描述不在复述。有兴趣的同学可以看看里面的实现,都是利用过滤器做转发或者一些对流量请求的修改、鉴权、等操作

可以通过actuator 模块监控查询 GlobalFilter实现类

1、pom引入spring-boot-starter-actuator 。因为之前就直接在parent pom 进行了引入操作。不再次引入

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、配置文件bootstrap.yml中开启监控管理端点

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: ALWAYS

3、请求浏览器 http://localhost:9000/actuator/gateway/globalfilters

{
org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter@4b957db0: -2147482648,
org.springframework.cloud.gateway.filter.WebsocketRoutingFilter@273fa9e: 2147483646,
com.xian.cloud.filter.AuthorizeFilter@4b03cbad: 0,
org.springframework.cloud.gateway.filter.ForwardRoutingFilter@8840c98: 2147483647,
org.springframework.cloud.gateway.filter.NettyRoutingFilter@5c313224: 2147483647,
org.springframework.cloud.gateway.filter.NettyWriteResponseFilter@1e1e837d: -1,
org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter@5d71b500: 10000,
org.springframework.cloud.gateway.filter.LoadBalancerClientFilter@5b29ab61: 10100,
org.springframework.cloud.gateway.filter.GatewayMetricsFilter@527a8665: -2147473648,
org.springframework.cloud.gateway.filter.ForwardPathFilter@626b639e: 0
}

观察这些实现类。都是实现 GlobalFilter、Ordered俩个接口 实现自己的全局过滤器

创建 AuthorizeFilter

package com.xian.cloud.filter;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * <Description>
 *
 * @author xianliru@100tal.com
 * @version 1.0
 * @createDate 2019/11/04 18:06
 */
@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<Void> 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 gateway网关服务中断言和过滤器”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. 微服务网关实战——Spring Cloud Gateway
  2. 服务网关 Spring Cloud GateWay 服务化和过滤器

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring cloud gateway

上一篇:Linux上如何设置双网卡单网关

下一篇:如何配置Sendmail服务器以防治垃圾邮件

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》