首页 > 其他分享 >dubbo~全局异常拦截器的使用与设计缺陷~续

dubbo~全局异常拦截器的使用与设计缺陷~续

时间:2024-06-11 09:36:11浏览次数:23  
标签:dubbo exception 拦截器 return build 全局 type Response

上一次的介绍,主要围绕如何统一去捕获异常,以及为每一种异常添加自己的Mapper实现,并且我们知道,当在ExceptionMapper中返回非200的Response,不支持application/json的响应类型,而是写死的text/plain类型。

Filter为二方包异常手动捕获

参考:https://blog.csdn.net/2401_84048290/article/details/138105184

我们来看看dubbo的源码进行分析,如果Dubbo的provider端 抛出异常(Throwable),则会被 provider端 的ExceptionFilter拦截到,执行以下invoke方法,里面有个实现Listener类,重写了onResponse,我们可以自定义filter来覆盖原来的ExceptionFilter,把自定义的异常通过RuntimeException进行包裹,然后在Mapper中进行统一的捕获。

  • 添加CustomExceptionFilter类型,实现Filter和BaseFilter.Listener,重写onResponse方法,添加自定义代码,如下:
public class CustomExceptionFilter implements Filter, BaseFilter.Listener {
    public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
        	exception = appResponse.getException();
				String className = exception.getClass().getName();

				// 本项目的异常也直接抛出
				if (className.startsWith("com.myself.")) {
					appResponse.setException(new RuntimeException(exception));
					return;
				}
				// 其它原来ExceptionFilter中的代码
    }
}
  • META-INF中注册这个过滤器resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter
customExceptionFilter=com.xxx.register.exception.filter.CustomExceptionFilter
  • 配置中文中注册,并移除默认的resources/application.properties
# 自定义过滤器,上面-exception就是dubbo默认的处理异常的filter,前面-号就代表去除,注意:不需要加双引号
dubbo.provider.filter=customExceptionFilter,-exception

一个Mapper处理所有自定义异常

  • 配置文件中指定mapper,resources/application.properties
dubbo.protocols.http.extension=com.xxx.register.exception.mapper.CustomExceptionMapper
  • mapper源码如下
@Provider
public class DbViolationExceptionMapper implements ExceptionMapper<RuntimeException> {

	@Override
	public Response toResponse(RuntimeException exception) {
		Map<String, String> map = MapUtil.<String, String>builder().put("error", exception.getMessage()).build();
		if (exception.getCause() instanceof ForbiddenException) {
			return Response.status(Response.Status.FORBIDDEN).entity(map).type(MediaType.APPLICATION_JSON).build();
		}
		if (exception.getCause() instanceof CustomException) {
			return Response.status(Response.Status.BAD_REQUEST).entity(map).type(MediaType.APPLICATION_JSON).build();
		}
		if (exception.getCause() instanceof IdentityBrokerException) {
			return Response.status(Response.Status.UNAUTHORIZED).entity(map).type(MediaType.APPLICATION_JSON).build();
		}
		if (exception.getCause() instanceof UniqueException) {
			return Response.status(Response.Status.SERVICE_UNAVAILABLE).entity(map).type(MediaType.APPLICATION_JSON)
					.build();
		}
		return Response.status(Response.Status.SERVICE_UNAVAILABLE)
				.entity(MapUtil.builder().put("error", exception.getMessage()).build()).type(MediaType.APPLICATION_JSON)
				.encoding("utf-8").build();// 非200的请求,这个type无效,一直是text/plain

	}

}

未解决的问题

  • 目前非200的请求,toResponse时,响应类型还是text/plain

标签:dubbo,exception,拦截器,return,build,全局,type,Response
From: https://www.cnblogs.com/lori/p/18241517

相关文章

  • 从零手写实现 nginx-17-nginx.conf 全局的默认配置
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对nginx原理感兴趣,可以阅读:从零......
  • Dubbo消费消息的唯一性
    在Dubbo中,如果要保证消息的唯一性,通常是指需要确保消费者接收到的消息是没有被其他消费者重复消费的。这通常涉及到分布式环境下的消息传递和处理,可以通过以下几种方式实现:使用消息队列提供的唯一性保证机制:对于Kafka,可以使用消息的唯一ID(例如:消息的offset)。对于RabbitMQ,可......
  • 架构设计-全局异常处理器404、405的问题
    javaweb项目中经常会遇到异常处理的问题,普遍的做法是使用全局异常处理,这样做有以下几种原因:集中化处理:全局异常处理允许你在一个集中的地方处理整个应用程序中的异常。这有助于减少代码重复,因为你不必在每个可能抛出异常的方法中都编写相同的异常处理代码。统一错误响应:通过......
  • 记一次锁使用不当导致Dubbo线程阻塞问题
    背景线上环境一个后台项目,提供基于dubbo实现的事件分发服务,最近突然出现心跳超时。问题分析检查内存是否溢出jstat-gcutil81661000意料之中,内存正常,因为内部有接入内存溢出告警,如果是内存溢出应该有收到通知,但是这次没有溢出通知。查看线程栈jstack-l8166发现有大......
  • IDEA 12大全局配置,快速提供开发效率
    IDEA相关配置整理于2024.06.0923:23@程序员猴哥1编码设置:File-->newprojectssettings-->settingsfornewprojects-->editor--->fileencodings-->globalencodeing:utf-8;projectencoding:utf-8;defaultencodingforpropertiesfiles:utf-8![img](file......
  • Dubbo 3.x源码(21)—Dubbo服务引用源码(4)
    基于Dubbo3.1,详细介绍了Dubbo服务的发布与引用的源码。此前我们学习了createInvokerForRemote方法中的Wrapper有哪些以及作用,接下来我们将会的学习真正的本地、应用级别、接口级别的Protocol的引入逻辑,以及创建Proxy服务接口代理对象的逻辑。Dubbo3.x服务引用源码:Dub......
  • Block Transformer:通过全局到局部的语言建模加速LLM推理
    在基于transformer的自回归语言模型(LMs)中,生成令牌的成本很高,这是因为自注意力机制需要关注所有之前的令牌,通常通过在自回归解码过程中缓存所有令牌的键值(KV)状态来解决这个问题。但是,加载所有先前令牌的KV状态以计算自注意力分数则占据了LMs的推理的大部分成本。在这篇论文中,作者......
  • Dubbo面试题甄选及参考答案
    目录Dubbo是什么?Dubbo的主要使用场景有哪些?Dubbo的核心功能有哪些?Dubbo与Spring框架的集成方式是什么?Dubbo的RPC调用原理是什么?Dubbo的架构中包含哪些核心组件?Provider、Consumer、Registry、Monitor在Dubbo中分别承担什么角色?Container在Dubbo中的作用是什么?Dubbo的C......
  • 基础设施建设——全局请求参数校验
    基础设施建设——全局请求参数校验在BeanValidation漫谈一文中已经对BeanValidation进行了详细的介绍,以及SpringValidator与JakartaBeanValidation规范的关系,本文讨论在微服务架构中,如何做全局的请求参数校验。1.基于SpringMVC的http接口如何校验在SpringFramework中......
  • dubbo~全局异常拦截器的使用与设计缺陷
    异常拦截器ExceptionMapper在JAX-RS(JavaAPIforRESTfulWebServices)中,ExceptionMapper接口用于将Java异常映射到HTTP响应。通过实现ExceptionMapper接口,你可以自定义如何处理特定类型的异常,并生成相应的HTTP响应。优先级和选择当有多个ExceptionMapper可用于处理同一类型的......