【PmHub面试篇】Gateway全局过滤器统计接口调用耗时面试要点解析

news2025/6/6 9:26:25

你好,欢迎来到本次关于Gateway全局过滤器统计接口调用耗时的面试系列分享。在这篇文章中,我们将深入探讨这一技术领域的相关面试题预测。若想对相关内容有更透彻的理解,强烈推荐参考之前发布的博文:【PmHub后端篇】PmHub Gateway全局过滤器:接口调用耗时统计及黑白名单配置技术深度解析

1 什么是网关,网关在微服务架构中的作用是什么?

  • 微服务网关是一个位于微服务架构前端的组件,它充当了所有微服务的入口
  • 微服务网关负责路由请求、负载均衡、安全认证、流量控制、监控和日志记录等任务。
  • 微服务网关可以将多个微服务组合成一个统一的API,从而简化了客户端与微服务之间的通信。

2 有 Nginx 了为什么还要 SpringCloud Gateway 做网关,两者有啥区别?

  • Nginx 是基于 C 语言的高性能 HTTP 服务器和反向代理,主要用于静态资源处理、负载均衡、反向代理等,适合处理高并发的流量,性能比较高。
  • 而 SpringCloud Gateway 是基于 Spring Boot 和 Spring WebFlux 的反应式编程模型,属于 Java 生态的微服务网关,集成在 Spring Cloud 体系中,更适合微服务架构下的动态路由、熔断、监控等功能
  • 在生产环境中,通常会把两者结合起来,Nginx 用来处理静态资源和高并发流量,Spring Cloud Gateway 用来实现动态路由、权限校验和业务逻辑处理
[客户端][Nginx] — 负载均衡/静态资源代理
    ↓
[Spring Cloud Gateway] — 动态路由/业务逻辑处理
    ↓
[微服务集群]

3 你是如何编写SpringCloud Gateway全局过滤器的?

在 PmHub 项目中,我单独在网关服务中新建了过滤器类 AuthFilter ,实现了 gatewayGlobalFilter 接口,并自定义了 filter 方法实现,方法里面主要是做了几个事情,分别是:

  • 白名单过滤,即过滤掉不需要验证的请求路径;
  • 进行token鉴权,确保令牌不能为空且未过期,并将用户信息放在请求头中,方便服务调用传递;
  • 记录访问接口的开始时间,用于统计接口调用的耗时情况。
  • AuthFilter实现了 Spring 的 Ordered 接口,并设置 -200 返回,以用来提高 AuthFilter 在 spring 中的加载顺序为最先。

4 你是如何统计接口调用耗时情况的?具体实现细节是什么?

接口调用耗时情况的统计是通过记录接口访问的开始时间和结束时间来实现的。
①、 在接口调用开始时,记录当前时间戳,并将其存储在 ServerWebExchange 的属性中

// 4.1 记录开始访问时间
exchange.getAttributes().put(BEGIN_VISIT_TIME, System.currentTimeMillis());

②、在接口调用结束时,通过 Mono.fromRunnablethen 方法,获取存储的开始时间,计算当前时间与开始时间的差值,即为接口调用的耗时。

return chain.filter(exchange).then(Mono.fromRunnable(() -> {
    try {
        // 4.2 记录接口访问日志
        Long beginVisitTime = exchange.getAttribute(BEGIN_VISIT_TIME);  // 开始访问时间
        if (beginVisitTime != null) {
            URI uri = exchange.getRequest().getURI();
            Map<String, Object> logData = new HashMap<>();
            logData.put("host", uri.getHost());
            logData.put("port", uri.getPort());
            logData.put("path", uri.getPath());
            logData.put("query", uri.getQuery());
            // 4.3 接口耗时
            logData.put("duration", (System.currentTimeMillis() - beginVisitTime) + "ms");

            log.info("访问接口信息: {}", logData);
            log.info("我是美丽分割线: ###################################################");
        }
    } catch (Exception e) {
        log.error("记录日志时发生异常: ", e);
    }
}));

5 在自定义网关鉴权过程中,你遇到了哪些挑战?你是如何解决的?

  • 性能挑战:在高并发场景下,网关的鉴权逻辑可能成为系统的瓶颈,导致请求延迟增加。

解决办法:使用缓存机制减少对数据库或认证服务器的调用次数,将用户的认证信息缓存一段时间。

  • 可扩展性:随着系统的扩展,新的服务和认证方式可能会不断增加,如何保证鉴权系统的可扩展性是一个挑战

解决办法:将鉴权逻辑独立为一个服务,方便独立扩展和维护。

  • 日志和监控:在鉴权过程中,需要对用户的认证行为进行详细的日志记录和监控,以便在出现问题时进行排查。

解决方案:在关键的鉴权步骤添加详细的日志记录,记录请求、响应、错误等信息。
部署监控系统对鉴权服务的性能、错误率等进行实时监控。

  • 一开始,把网关的配置信息都放到了配置文件中,这样就没办法在线更新

解决方案:通过 Nacos 把配置信息持久化到了 MySQL 当中,这样当我需要调整过滤器的白名单啊、路由规则啊,就可以直接通过 Nacos 的配置管理中心实时进行修改。

6 参考链接

  1. 网关和Nginx及Filter
  2. PmHub Gateway全局过滤器统计接口调用耗时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2398545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

neo4j 5.19.0两种基于向量进行相似度查询的方式

介绍 主要讲的是两种相似度查询 一种是创建向量索引&#xff0c;然后直接从索引的所有数据中进行相似度搜索&#xff0c;这种不支持基于自己查询的结果中进行相似度匹配另一种是自己调用向量方法生产相似度进行相似度搜索&#xff0c;这种可以基于自己的查询结果中进行相似度…

华为云Flexus+DeepSeek征文|利用华为云 Flexus 云服务一键部署 Dify 平台开发文本转语音助手全流程实践

目录 前言 1 华为云 Flexus 与 Dify 平台简介 1.1 Flexus&#xff1a;为AI而生的轻量级云服务 1.2 Dify&#xff1a;开源的LLM应用开发平台 2 一键部署Dify平台至Flexus环境 3 构建文本转语音助手应用 3.1 创建ChatFlow类型应用 3.2 配置语音合成API的HTTP请求 3.3 设…

ck-editor5的研究 (7):自定义配置 CKeditor5 的 toolbar 工具栏

文章目录 一、前言二、实现步骤1. 第一步: 搭建目录结构2. 第二步:配置toolbar工具栏的步骤(2-1). 配置粗体和斜体(2-2). 配置链接和标题+正文(2-3). 配置列表和引用(2-4). 配置自动格式化3. 第三步:更多工具三、测试效果和细节四、总结一、前言 在前面的文章中,我们已经对…

MPLS-EVPN笔记详述

目录 EVPN简介: EVPN路由: 基本四种EVPN路由 扩展: EVPN工作流程: 1.启动阶段: 2.流量转发: 路由次序整理: 总结: EVPN基本术语: EVPN表项: EVPN支持的多种服务模式: 简介: 1.Port Based: 简介: 配置实现: 2.VLAN Based: 简介: 配置实现: 3.VLAN Bundle: 简…

无人机甲烷检测技术革新:开启环境与能源安全监测新时代

市场需求激增&#xff0c;技术革新势在必行 随着全球气候变化加剧&#xff0c;甲烷作为第二大温室气体&#xff0c;其减排与监测成为国际社会关注焦点。据欧盟甲烷法规要求&#xff0c;2024 年起欧洲能源基础设施运营商需定期测量甲烷排放并消除泄漏。与此同时&#xff0c;极端…

mysql数据库实现分库分表,读写分离中间件sharding-sphere

一 概述 1.1 sharding-sphere 作用&#xff1a; 定位关系型数据库的中间件&#xff0c;合理在分布式环境下使用关系型数据库操作&#xff0c;目前有三个产品 1.sharding-jdbc&#xff0c;sharding-proxy 1.2 sharding-proxy实现读写分离的api版本 4.x版本 5.x版本 1.3 说明…

普通二叉树 —— 最近公共祖先问题解析(Leetcode 236)

&#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 普通二叉树 —— 最近公共祖先问题解析&#xff08;Leetcode 236&#xff09;&#x1f9e0; 问题理解普通二叉树与 BST 的区别&#xff1a; &#x1f4a1; 解题思路关键思想&#xff1a;&#x1f4cc; 举个例子&#xff1a…

Spring AOP:面向切面编程 详解代理模式

文章目录 AOP介绍什么是Spring AOP&#xff1f;快速入门SpringAop引入依赖Aop的优点 Spring Aop 的核心概念切点(Pointcut)连接点、通知切面通知类型PointCut注解切面优先级Order切点表达式executionwithinthistargetargsannotation自定义注解 Spring AOP原理代理模式&#xff…

零知开源——STM32F407VET6驱动ILI9486 TFT显示屏 实现Flappy Bird游戏教程

简介 本教程使用STM32F407VET6零知增强板驱动3.5寸 ILI9486的TFT触摸屏扩展板实现经典Flappy Bird游戏。通过触摸屏控制小鸟跳跃&#xff0c;躲避障碍物柱体&#xff0c;挑战最高分。项目涉及STM32底层驱动、图形库移植、触摸控制和游戏逻辑设计。 目录 简介 一、硬件准备 二…

数据安全中心是什么?如何做好数据安全管理?

目录 一、数据安全中心是什么 &#xff08;一&#xff09;数据安全中心的定义 &#xff08;二&#xff09;数据安全中心的功能 1. 数据分类分级 2. 访问控制 3. 数据加密 4. 安全审计 5. 威胁检测与响应 二、数据安全管理的重要性 三、如何借助数据安全中心做好数据安…

Monorepo 详解:现代前端工程的架构革命

以下是一篇关于 Monorepo 技术的详细技术博客&#xff0c;采用 Markdown 格式&#xff0c;适合发布在技术社区或团队知识库中。 &#x1f9e9; 深入理解 Monorepo&#xff1a;现代项目管理的利器 在现代软件开发中&#xff0c;项目规模日益庞大&#xff0c;模块之间的依赖关系…

16-前端Web实战(Tlias案例-部门管理)

在前面的课程中&#xff0c;我们学习了Vue工程化的基础内容、TS、ElementPlus&#xff0c;那接下来呢&#xff0c;我们要通过一个案例&#xff0c;加强大家对于Vue项目的理解&#xff0c;并掌握Vue项目的开发。 这个案例呢&#xff0c;就是我们之前所做的Tlias智能学习辅助系统…

电路学习(二)之电容

电容的基本功能是通交流隔直流、存储电量&#xff0c;在电路中可以进行滤波、充放电。 1.什么是电容&#xff1f; &#xff08;1&#xff09;电容定义&#xff1a;电容器代表了器件存储电荷的能力&#xff0c;通俗来理解是两块不连通的导体与绝缘的中间体组成。当给电容充电时…

CTA-861-G-2017中文pdf版

CTA-861-G标准&#xff08;2016年11月发布&#xff09;规范未压缩高速数字接口的DTV配置&#xff0c;涵盖视频格式、色彩编码、辅助信息传输等&#xff0c;适用于DVI、HDMI等接口&#xff0c;还涉及EDID数据结构及HDR元数据等内容。

港大NVMIT开源Fast-dLLM:无需重新训练模型,直接提升扩散语言模型的推理效率

作者&#xff1a;吴成岳&#xff0c;香港大学博士生 原文&#xff1a;https://mp.weixin.qq.com/s/o0a-swHZOplknnNxpqlsaA 最近的Gemini Diffusion语言模型展现了惊人的throughput和效果&#xff0c;但是开源的扩散语言模型由于缺少kv cache以及在并行解码的时候性能严重下降等…

ESP32-C3 Vscode+ESP-IDF开发环境搭建 保姆级教程

1.背景 最近esp32的芯片很火&#xff0c;因为芯片自带了WIFI和BLE功能&#xff0c;是物联网项目开发的首选芯片&#xff0c;所以&#xff0c;我也想搞个简单的esp32芯片试试看。于是&#xff0c;我设计了一个简单的板子。如下 这块板子很简单&#xff0c;主要的电路来自于乐鑫…

解决vscode打开一个单片机工程文件(IAR/keil MDK)因无法找到头文件导致的结构体成员不自动补全问题。

最近一直在用vscode安装c/c插件后编辑STM32标准库&#xff08;keil MDK&#xff09;项目源文件&#xff0c;因为我感觉vscode在代码编辑方面比keil MDK本身优秀太多。发现打开工程后&#xff0c;结构体变量的成员在输入“.”后不自己弹出的问题&#xff0c;后来查找各方资料&am…

【Node.js 深度解析】npm install 遭遇:npm ERR! code CERT_HAS_EXPIRED 错误的终极解决方案

目录 &#x1f4da; 目录&#xff1a;洞悉症结&#xff0c;精准施治 &#x1f50d; 一、精准剖析&#xff1a;CERT_HAS_EXPIRED 的本质 &#x1f575;️ 二、深度溯源&#xff1a;证书失效的 N 重诱因 &#x1f4a1; 三、高效解决策略&#xff1a;六脉神剑&#xff0c;招招…

Vue内置组件Teleport和Suspense

一. Vue内置组件Teleport 认识Teleport( teleport&#xff1a;允许我们把组件的模板渲染到特定的元素上) 1.1. 在组件化开发中&#xff0c;我们封装一个组件A&#xff0c;在另外一个组件B中使用 组件A中template的元素&#xff0c;会被挂载到组件B中template的某个位置&#xf…

Java网络编程实战:TCP/UDP Socket通信详解与高并发服务器设计

&#x1f50d; 开发者资源导航 &#x1f50d;&#x1f3f7;️ 博客主页&#xff1a; 个人主页&#x1f4da; 专栏订阅&#xff1a; JavaEE全栈专栏 内容&#xff1a; socket(套接字)TCP和UDP差别UDP编程方法使用简单服务器实现 TCP编程方法Socket和ServerSocket之间的关系使用简…