Spring Cloud Gateway中的GlobalFilter

本文介绍了一种在SpringBoot和SpringCloud Gateway环境中实现全局日志记录的方法,利用GlobalFilter进行请求鉴权及日志收集,展示了如何通过GatewayFilterChain获取请求详细信息并输出运行时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近公司在用springboot构架,以及springCloud gateway.老大让我去搞日志,一脸懵逼,我一个刚毕业的大学生可以说会的不多,这可是多服务的日志.怎么搞,百度,百度,百度,百度好久,全是废话连篇.....找了好久终于找到一个有用的.  

用了GlobalFilter,全局过滤器.由于所有请求都走gateway网关,所以毫无疑问写在gateway中.

代码如下,不多比比

package com.eastcom.gocp.gateway.config;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 调用鉴权
 */
@Component
public class AuthSignatureFilter implements GlobalFilter, Ordered {

    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  
        long startTime = System.currentTimeMillis();
        //可以得到url
        System.out.println(exchange.getRequest().getURI());
        //可以得到请求路径
        System.out.println(exchange.getRequest().getRemoteAddress());
        //可以拿到token
        String token = exchange.getRequest().getHeaders().get("token")+"" ;
        int size = token.length();
        token = token.substring(1,size-1);
        //公司用的jwt,所以通过该方法能拿到用户id
        Integer userId = Integer.valueOf((String) JwtCreate.getFromJwt(token, "jti"));
        long endTime = System.currentTimeMillis();
        System.out.println("程序运行时间:" + (endTime - startTime) + "ms");    //输出程序运行时间
        //网关是非常重要的,在这里不让写过多代码,整个流程下来最好不要超过30ms
        //别的需要的数据可以自己根据需求去取
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -200;
    }


}
### Spring Cloud GatewayGlobalFilter 的使用教程 #### 1. 全局过滤器简介 全局过滤器(`GlobalFilter`)是 Spring Cloud Gateway 提供的一种机制,用于拦截并处理所有的 HTTP 请求和响应。它可以用来实现诸如认证授权、日志记录、性能监控等功能[^3]。 #### 2. 引入必要的依赖 为了在项目中使用 `GlobalFilter`,需要确保项目的 `pom.xml` 文件中包含了以下依赖项: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> ``` 此依赖会自动引入 Spring Cloud Gateway 所需的核心组件[^4]。 #### 3. 实现自定义的全局过滤器 创建一个类继承 `GlobalFilter` 并实现其接口中的方法。下面是一个完整的示例代码: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Configuration public class CustomGlobalFilterConfig { private static final Logger log = LoggerFactory.getLogger(CustomGlobalFilterConfig.class); @Bean public GlobalFilter customGlobalFilter() { return new CustomGlobalFilter(); } public static class CustomGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 记录请求的日志信息 log.info("Custom global filter is processing request: {}", exchange.getRequest().getPath()); // 可在此处添加额外逻辑,比如权限校验或修改请求头 // 将控制权交给下一个过滤器链 return chain.filter(exchange).then(Mono.fromRunnable(() -> { // 响应完成后可以执行一些清理操作 log.info("Response has been processed by the custom global filter."); })); } @Override public int getOrder() { // 设置过滤器优先级,数值越小优先级越高 return -100; } } } ``` 这段代码展示了如何创建一个名为 `CustomGlobalFilter` 的全局过滤器,并将其注册为 Bean。该过滤器会在每次请求到达网关时打印日志信息[^1]。 #### 4. 配置调试日志 如果希望查看更详细的流程信息,可以通过配置文件启用 Debug 模式: ```yaml logging: level: org.springframework.cloud.gateway: DEBUG reactor.netty.http.client: DEBUG ``` 这将帮助开发者更好地理解过滤器的行为及其与其他组件之间的交互情况。 #### 5. 工作原理概述 当客户端向 API Gateway 发送请求时,Spring Cloud Gateway 会依次调用所有已注册的 `GlobalFilter` 和特定于某个路由的 `GatewayFilter`。这些过滤器按照它们各自的顺序属性 (`getOrder`) 来决定执行次序[^2]。 --- ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值