zuul网关Filter处理流程及异常处理

OpenClaw实战系列·进阶特辑02:多智能体协同——打造企业级AI中台 **企业级AI中台面临多Agent协同的挑战,本文提出基于多智能体协同的解决方案。通过分析单Agent的局限性(上下文溢出、专业度稀释等)和多Agent的核心优势(任务专注度、故障隔离等),提出三种协作架构模式(指挥型、联邦型、点对点型),并强调人格化设计的重要性。文章详细介绍Agent间通讯机制(同步/异步会话、文件系统协作)和"身脑分离"的解耦架构设计,提供可落地的企业级AI中台实施方案。 阅读详情

首先看到Filter的四个方法,FilterType,filterOrder,shouldFilter,run。

filterType代表过滤类型
PRE: 该类型的filters在Request routing到源web-service之前执行。用来实现Authentication、选择源服务地址等
ROUTING:该类型的filters用于把Request routing到源web-service,源web-service是实现业务逻辑的服务。这里使用HttpClient请求web-service。
POST:该类型的filters在ROUTING返回Response后执行。用来实现对Response结果进行修改,收集统计数据以及把Response传输会客户端。
ERROR:上面三个过程中任何一个出现错误都交由ERROR类型的filters进行处理。
主要关注 pre、post和error。分别代表前置过滤,后置过滤和异常过滤。
如果你的filter是pre的,像上一篇那种,就是指请求先进入pre的filter类,你可以进行一些权限认证,日志记录,或者额外给Request增加一些属性供后续的filter使用。pre会优先按照order从小到大执行,然后再去执行请求转发到业务服务。
再说post,如果type为post,那么就会执行完被路由的业务服务后,再进入post的filter,在post的filter里,一般做一些日志记录,或者额外增加response属性什么的。
最后error,如果在上面的任何一个地方出现了异常,就会进入到type为error的filter中。
filterOrder代表过滤器顺序
这个不多说,试一下就知道了。
shouldFilter代表这个过滤器是否生效
true代表生效,false代表不生效。那么什么情况下使用不生效呢,不生效干嘛还要写这个filter类呢?
其实是有用的,有时我们会动态的决定让不让一个filter生效,譬如我们可能根据Request里是否携带某个参数来判断是否需要生效,或者我们需要从上一个filter里接收某个数据来决定,再或者我们希望能手工控制是否生效(使用如Appolo之类的配置中心,来动态设置该字段)。
Run方法
这个是主要的处理逻辑的地方,我们做权限控制、日志等都是在这里。

下图是filter的执行顺序。
在这里插入图片描述
直接用一个简单的示例来看看结果
第一个前置过滤器

package com.tianyalei.testzuul;
 
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
import javax.servlet.http.HttpServletRequest;
 
@Component
public class AccessFilter extends ZuulFilter {
 
    private static Logger log = LoggerFactory.getLogger(AccessFilter.class);
 
    @Override
    public String filterType() {
        //前置过滤器
        return "pre";
    }
 
    @Override
    public int filterOrder() {
        //优先级,数字越大,优先级越低
        return 0;
    }
 
    @Override
    public boolean shouldFilter() {
        //是否执行该过滤器,true代表需要过滤
        return true;
    }
 
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
 
        log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());
 
        //获取传来的参数accessToken
        Object accessToken = request.getParameter("accessToken");
        if(accessToken == null) {
            log.warn("access token is empty");
            //过滤该请求,不往下级服务去转发请求,到此结束
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            ctx.setResponseBody("{\"result\":\"accessToken为空!\"}");
            ctx.getResponse().setContentType("text/html;charset=UTF-8");
            return null;
        }
        //如果有token,则进行路由转发
        log.info("access token ok");
        //这里return的值没有意义,zuul框架没有使用该返回值
        return null;
    }
 
}

第二个前置过滤器

package com.tianyalei.testzuul;
 
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
import javax.servlet.http.HttpServletRequest;
 
@Component
public class SecondFilter extends ZuulFilter {
 
    private static Logger log = LoggerFactory.getLogger(SecondFilter.class);
 
    @Override
    public String filterType() {
        //前置过滤器
        return "pre";
    }
 
    @Override
    public int filterOrder() {
        //优先级,数字越大,优先级越低
        return 1;
    }
 
    @Override
    public boolean shouldFilter() {
        //是否执行该过滤器,true代表需要过滤
        return true;
    }
 
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
 
        log.info("second过滤器");
 
        return null;
 
    }
 
}

后置过滤器

package com.tianyalei.testzuul;
 
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
@Component
public class PostFilter extends ZuulFilter {
 
    private static Logger log = LoggerFactory.getLogger(PostFilter.class);
 
    @Override
    public String filterType() {
        //后置过滤器
        return "post";
    }
 
    @Override
    public int filterOrder() {
        //优先级,数字越大,优先级越低
        return 0;
    }
 
    @Override
    public boolean shouldFilter() {
        //是否执行该过滤器,true代表需要过滤
        return true;
    }
 
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        log.info("进入post过滤器");
        System.out.println(ctx.getResponseBody());
 
        ctx.setResponseBody("post后置数据");
 
        int i = 1 / 0;
 
        return null;
 
    }
 
}

异常过滤器

package com.tianyalei.testzuul;
 
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
@Component
public class ErrorFilter extends ZuulFilter {
 
    private static Logger log = LoggerFactory.getLogger(ErrorFilter.class);
 
    @Override
    public String filterType() {
        //异常过滤器
        return "error";
    }
 
    @Override
    public int filterOrder() {
        //优先级,数字越大,优先级越低
        return 0;
    }
 
    @Override
    public boolean shouldFilter() {
        //是否执行该过滤器,true代表需要过滤
        return true;
    }
 
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
 
        log.info("进入异常过滤器");
 
        System.out.println(ctx.getResponseBody());
 
        ctx.setResponseBody("出现异常");
 
        return null;
 
    }
 
}

定义好之后,直接测试看看

可以看到结果就是按照上面说的顺序在执行。
但是最终给用户呈现这样一个界面就不合适的,我们应该去处理这个"/error"映射的问题。
所以我再定义一个Controller

package com.tianyalei.testzuul;
 
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class ErrorHandlerController implements ErrorController {
 
    /**
     * 出异常后进入该方法,交由下面的方法处理
     */
    @Override
    public String getErrorPath() {
        return "/error";
    }
 
    @RequestMapping("/error")
    public String error() {
        return "出现异常";
    }
}

在"/error"方法里返回你想给客户端返回的值即可。

013:无人机航线规划的概念 航线规划是无人机任务规划的核心环节,它决定了无人机在整个任务执行过程中的飞行路径。航线规划需要考虑多种因素,包括飞行时间、飞行距离、能源消耗、飞行安全等。 阅读详情

相关推荐

保姆级教程:用MATLAB搞定双目相机标定,从导入图片到参数解读全流程

本文提供了一份详细的MATLAB双目相机标定全流程指南,涵盖从图片准备到参数解读的每个环节。重点讲解了棋盘格选择、拍摄技巧、MATLAB工具箱设置及参数优化,帮助读者避免常见错误并提升标定精度。特别适合机器人导航、三维重建等领域的开发者。

weixin_33737134的博客 431

自定义 ZuulFilter抛出异常

前提:项目中统一使用 HttpResponseCode 来作为服务正常的返回, body 中放具体返回的内容.如果抛出异常的情况下,期望 code 是4XX,body 中存放错误信息给用户友好提示但是,在SpringCloud 中默认的异常抛出是一个包含五个字段的对象.如下:{ "timestamp": 1513303905953, "status": 400, "erro...

UncleTian的博客 3414

【Chisel】2.4 时序逻辑

2.4 时序逻辑@[TOC](2.4 时序逻辑)前言寄存器(`Reg`)实例Chisel的状态函数实例2 RegNext实例3 RegInit移位器附录 显式的时钟信号和复位信号 前言 没有状态机的逻辑电路是不完整的,没有状态机的逻辑电路是不完整的,没有状态机的逻辑电路是不完整的,重要的事情说三遍。 这一节我们将要学习Chisel中的时序逻辑。在最后我们会实现一个移位器。 这里你需要知道的是,前面的这几节实际上都是对Chisel的基础语法的学习,它并不会给你带来很大的“惊喜”。Chisel真正的作用是把电路

快乐学习小猪猪的博客 846

SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由网关的过滤器Filter以及异常处理的教程。 SpringCloud Zuul Filter 介绍 过滤器概述 Zuul的中心是一系列过滤器,能够在HTTP请求和响应的路由过程中执行一系列操作。 以下...

weixin_33882443的博客 543

(论文速读)PTV3: 更简单、更快速、更强大的3D点云处理新突破

该论文提出PointTransformerV3(PTv3),通过简化设计实现3D点云处理的效率突破。该研究摒弃复杂注意力机制,转而采用点云序列化和补丁注意力等高效方法,将感受野从16点扩展到1024点,在保持高精度的同时实现3倍速度提升和10倍内存优化。PTv3在超过20个室内外场景任务中取得SOTA结果,ScanNet语义分割达79.4%mIoU,Waymo检测提升3.3%APH。核心创新包括四种空间填充曲线序列化模式和xCPE位置编码,为3D感知的工业应用提供了高效解决方案。

LJ1147517021的博客 1380

工控安全政策系列导读:国际标准IEC 62443标准系列

IEC 62443由ANSI/ISA提出,被ISO/IEC采纳,所以该标准会以不同的名字出现,包括:ANSI/ISA-99,ISA-99,ISA 62443,ISO/IEC 62443,ISO 62443,IEC 62443。其中IEC 62443-2-1已等同采纳为国标,于2016年10月发布,标准编号为GB/T 33007。 IEC 62443是在国...

weixin_34132768的博客 2624

Spring Cloud 实战之 Zuul 网关不响应任何请求

欢迎访问陈同学博客原文 本文基于一个线上真实问题。在 Zuul 无任何安全防护措施时,若遇到较大流量(单个Zuul应用在默认配置下200并发即可),将产生非常严重的后果。 本文主要是探寻下问题产生的原因。 问题背景与即时处理 先简述下问题背景与即时处理。 网络拓扑:请求 -> nginx -> 容器编排工具的LB(Haproxy) -> 网关(Zuul) -> 具体...

码代码的陈同学 5656

VASP实战:从非共线磁矩到自旋轨道耦合磁各向异性能的完整计算流程解析

本文详细解析了VASP中从非共线磁矩计算到自旋轨道耦合磁各向异性能的完整流程。通过实战案例和参数配置技巧,帮助研究者掌握非线性磁矩计算的关键步骤,包括SOC参数设置、文件传递逻辑以及磁各向异性能的精确提取方法,为材料磁性研究提供实用指导。

weixin_31102231的博客 411

Zuul 修改 请求头、响应头 (死磕)

疯狂创客圈 Java 高并发【 亿级流量聊天室实战】实战系列 【博客园总入口 】 架构师成长+面试必备之 高并发基础书籍 【Netty Zookeeper Redis 高并发实战 】 疯狂创客圈 高并发 环境 视频,陆续上线: Windows Redis 安装(带视频) Linux Redis 安装(带视频) Windows Zookeeper 安装(带视频) Linux Zo...

架构师尼恩 4046

Unity如何实现3D物体拆解组装

最近有一个需求,是做一个发动机的拆卸和安装功能,其实是一个很简单的功能,但是其中有一个点我觉的非常有意思,就是拖拽组装时,物体如何精准拖到目标位置,思路有了,但是我一直找不到实现方式,早晨刷牙时无意间想到了叉乘,我才有了解决方案。就凭这一次的灵光乍现,也很有必要写篇博客来记录一下。首先,我们先来看下我们要实现的效果,就是对一个发动机(任意多组件物体,如:车)的360°预览查看,手动拖拽拆解,手动拖拽组装。360°旋转视角远近拉伸视角点击拖拽拆卸拖拽组装。

TxNet 1万+

竞赛经验——挑战杯、互联网加、北斗杯、微软创新杯、计算机设计等比赛教训与经验

最近参加一些比赛,北斗杯、挑战者杯、微软创新杯等比赛,每次比赛都有不少需要总结的地方,特别是项目展示上技巧很多,总结一下。 首先最重要的是作品自身硬!自身的作品完成度不高,或者是没有创新点,就没必要参加了。 比如是出去比赛的话,我反正每次碰到最多的是智慧农场、智慧家居之类,不知道为啥这种的太多了。如果是创业型比赛,评委基本会问小米已经做得很好了很便宜了,你的优势在哪里?这些都是常见的问题提前要...

沉迷单车的追风少年 7329

API网关的实现---3 zuul网关Filter处理流程及异常处理

上一篇介绍了java网关Zuul的简单使用,进行请求路由转发和过滤器的基本操作。 这一篇主要看一下它的过滤器Filter的工作流程及异常处理。 首先看到Filter的四个方法,FilterType,filterOrder,shouldFilter,run。 filterType代表过滤类型 PRE: 该类型的filters在Request routing到源web-service之前执行。...

happyAliceYu的博客 642

手把手实现:从0到1构建基于3D Faster R-CNN的肺部结节自动检测系统(附完整代码与避坑指南)

亲爱的同学,当你能完整实现“3D Faster R-CNN肺部结节检测系统”,你会发现医学影像AI的毕设课题充满挑战与成就感。我们围绕3D Faster R-CNN模型,从数据处理、模型搭建到实验验证,一步步带你打造一个能精准检测肺部结节的智能系统,让你的毕设既体现技术深度,又能为肺部疾病早期诊断贡献实用价值。是专为3D医学影像设计的目标检测模型,能在三维CT数据中自动定位、识别肺部结节——这一课题兼具“临床价值”和“技术挑战性”,是毕设的优质选择,能充分展现你的工程能力和科研敏感度。

m0_71589036的博客 132

zuul执行顺序

zuul架构图 zuul详解 ZuulServlet类 初始化zuulRunner对象。 执行zuulFilter。@Override public void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws ServletExc...

weixin_43030513的博客 494

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

springCloud学习

1、搭建基础框架:https://blog.youkuaiyun.com/chaiqunxing51/article/details/80499727 2、实现服务发现和注册:https://www.cnblogs.com/tjlboke/p/7989090.html 3、zuul网关Filter处理流程及异常处理:https://blog.youkuaiyun.com/tianyaleixiaowu/article...

weixin_36098377的博客 124

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

springcloud 基础知识整理

一.@EnableDiscoveryClient与@EnableEurekaClient区别 在使用Spring Cloud feign使用中在使用服务发现的时候提到了两种注解,一种为@EnableDiscoveryClient,一种为@EnableEurekaClient,用法上基本一致。 spring cloud中discovery service有许多种实现(eureka、cons...

weixin_45637293的博客 241

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Zuul网关的请求与响应日志打印、服务回退和异常处理

前言: Zuul是在SpringCloud微服务框架中经常使用网关组件,它提供了认证、鉴权、限流、动态路由、监控、弹性、安全、负载均衡等功能,平时我们在项目中经常Zuul路由、鉴权、监控、负载均衡等功能。我们今天就详细介绍一下请求与响应日志打印、服务回退和异常处理这个三个功能的配置方法。 一、请求与响应日志打印: 请求与响应日志打印主要是基于Zuul的filter过滤器实现的。Zuul一共有五种类型的filter过滤器,它们分别是:PRE(在请求被路由之前调用)、ROUTING(将请求路由到微服务)、

hanxiaozhang的博客 6463

Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。

时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式。 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制,但其实Zuul还有更多的应用场景,比如:鉴权、流量转发、请求统计等等,这些功能都可以使用Zuul来实现。 Zuul的核心 Filter是Zuul的核心,用来实现对外服务的控制。Filter

纯洁的微笑 1万+

zuul异常处理

注意,关于怎样在zuul中处理异常,网上有很多方法,本文只讲述其中的一种。 首先,我们要知道以下几点: zuul中有一个默认的处理异常的filter,名为 SendErrorFilter,这个过滤器实际所做的工作只是将异常处理转发到了 ‘/error’ 这个路径上 承接上一点,在springboot中,有一个默认的处理异常的controller,名为 BasicErrorControlle...

杂货铺的小掌柜 6090

Zuul路由网关的过滤器和异常处理

SpringCloud Zuul Filter 介绍 过滤器概述 Zuul的中心是一系列过滤器,能够在HTTP请求和响应的路由过程中执行一系列操作。 以下是Zuul过滤器的主要特征: 类型:通常在应用过滤器时在路由流程中定义阶段(尽管它可以是任何自定义字符串) 执行顺序:在类型中应用,定义跨多个过滤器的执行顺序 标准:执行过滤器所需的条件 操作:满足条件时要执行的操作 Zuul提...

编程知识分享 2506

服务网关zuul之三:zuul统一异常处理

服务网关zuul之三:zuul统一异常处理 我们详细介绍了Spring Cloud Zuul中自己实现的一些核心过滤器,以及这些过滤器在请求生命周期中的不同作用。我们会发现在这些核心过滤器中并没有实现error阶段的过滤器。那么这些过滤器可以用来做什么呢?接下来,本文将介绍如何利用error过滤器来实现统一的异常处理。 过滤器中抛出异常的问题 首先,我们可以来看看默认情况下,过滤器中抛出异常...

f45056231p的博客 808
上一篇: canal同步原理,MySQL主从同步原理
下一篇: zxing介绍生成二维码
yonhu123java
博客等级 码龄14年 6粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值