• 首页
  • 邻居
  • 关于
  • 归档
  • 搜索
  • 夜间模式
    ©2020-2026  我的学习笔记 Theme by OneBlog

    我的学习笔记博客

    搜索
    标签
    # 随笔 # Java # 教程 # openwrt # Mysql # SQL # 爬虫 # post # Js调优 # MAVEN
  • 首页>
  • 随笔>
  • 正文
  • Dubbo如何处理业务异常

    2023年04月24日 1.6 k 阅读 0 评论 6662 字

    https://blog.csdn.net/m0_57077948/article/details/117524555?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-117524555-blog-128680545.235^v31^pc_relevant_default_base3&spm=1001.2101.3001.4242.2&utm_relevant_index=4

    https://deepmind.t-salon.cc/article/5835

    方案

    即采用dubbo的filter重写,dubbo的异常处理。

    1、将dubbo源码中ExceptionFilter复制到我们的项目改名为DubboExceptionFilter
    修改一些代码

    2、在此处加上一段代码来过滤我们项目中的异常,以免被dubbo重新封装
    3、在resources目录下添加纯文本文件META-INF/dubbo/com.alibaba.dubbo.rpc.Filter并添加内容

    dubboExceptionFilter=com.rainbow.goods.server.filter.DubboExceptionFilter
    
    

    4.修改dubbo 的配置文件,将DubboExceptionFilter加载进去并且去掉自身的ExceptionFilter

    <dubbo:providerfilter="dubboExceptionFilter,-exception"/>

    上面exception就是dubbo默认的处理异常的filter,前面-号就代表去除

    /* 
     * Copyright 1999-2011 Alibaba Group. 
     *   
     * Licensed under the Apache License, Version 2.0 (the "License"); 
     * you may not use this file except in compliance with the License. 
     * You may obtain a copy of the License at 
     *   
     *      http://www.apache.org/licenses/LICENSE-2.0 
     *   
     * Unless required by applicable law or agreed to in writing, software 
     * distributed under the License is distributed on an "AS IS" BASIS, 
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
     * See the License for the specific language governing permissions and 
     * limitations under the License. 
     */  
    package com.alibaba.dubbo.rpc.filter;  
    import java.lang.reflect.Method;  
    import com.alibaba.dubbo.common.Constants;  
    import com.alibaba.dubbo.common.extension.Activate;  
    import com.alibaba.dubbo.common.logger.Logger;  
    import com.alibaba.dubbo.common.logger.LoggerFactory;  
    import com.alibaba.dubbo.common.utils.ReflectUtils;  
    import com.alibaba.dubbo.common.utils.StringUtils;  
    import com.alibaba.dubbo.rpc.Filter;  
    import com.alibaba.dubbo.rpc.Invocation;  
    import com.alibaba.dubbo.rpc.Invoker;  
    import com.alibaba.dubbo.rpc.Result;  
    import com.alibaba.dubbo.rpc.RpcContext;  
    import com.alibaba.dubbo.rpc.RpcException;  
    import com.alibaba.dubbo.rpc.RpcResult;  
    import com.alibaba.dubbo.rpc.service.GenericService;  
    /** 
     * ExceptionInvokerFilter 
     * <p> 
     * 功能: 
     * <ol> 
     * <li>不期望的异常打ERROR日志(Provider端)
     
     *     不期望的日志即是,没有的接口上声明的Unchecked异常。 
     * <li>异常不在API包中,则Wrap一层RuntimeException。
     
     *     RPC对于第一层异常会直接序列化传输(Cause异常会String化),避免异常在Client出不能反序列化问题。 
     * </ol> 
     *  
     * @author william.liangf 
     * @author ding.lid 
     */  
    @Activate(group = Constants.PROVIDER)  
    public class ExceptionFilter implements Filter {  
        private final Logger logger;  
        public ExceptionFilter() {  
            this(LoggerFactory.getLogger(ExceptionFilter.class));  
        }  
        public ExceptionFilter(Logger logger) {  
            this.logger = logger;  
        }  
        public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {  
            try {  
                Result result = invoker.invoke(invocation);  
                if (result.hasException() && GenericService.class != invoker.getInterface()) {  
                    try {  
                        Throwable exception = result.getException();  
                        // 如果是checked异常,直接抛出  
                        if (! (exception instanceof RuntimeException) && (exception instanceof Exception)) {  
                            return result;  
                        }  
                        // 在方法签名上有声明,直接抛出  
                        try {  
                            Method method = invoker.getInterface().getMethod(invocation.getMethodName(), invocation.getParameterTypes());  
                            Class<?>[] exceptionClassses = method.getExceptionTypes();  
                            for (Class<?> exceptionClass : exceptionClassses) {  
                                if (exception.getClass().equals(exceptionClass)) {  
                                    return result;  
                                }  
                            }  
                        } catch (NoSuchMethodException e) {  
                            return result;  
                        }  
                        // 未在方法签名上定义的异常,在服务器端打印ERROR日志  
                        logger.error("Got unchecked and undeclared exception which called by " + RpcContext.getContext().getRemoteHost()  
                                + ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName()  
                                + ", exception: " + exception.getClass().getName() + ": " + exception.getMessage(), exception);  
                        // 异常类和接口类在同一jar包里,直接抛出  
                        String serviceFile = ReflectUtils.getCodeBase(invoker.getInterface());  
                        String exceptionFile = ReflectUtils.getCodeBase(exception.getClass());  
                        if (serviceFile == null || exceptionFile == null || serviceFile.equals(exceptionFile)){  
                            return result;  
                        }  
                        // 是JDK自带的异常,直接抛出  
                        String className = exception.getClass().getName();  
                        if (className.startsWith("java.") || className.startsWith("javax.")) {  
                            return result;  
                        }  
                        // 是Dubbo本身的异常,直接抛出  
                        if (exception instanceof RpcException) {  
                            return result;  
                        }  
                        // 否则,包装成RuntimeException抛给客户端  
                        return new RpcResult(new RuntimeException(StringUtils.toString(exception)));  
                    } catch (Throwable e) {  
                        logger.warn("Fail to ExceptionFilter when called by " + RpcContext.getContext().getRemoteHost()  
                                + ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName()  
                                + ", exception: " + e.getClass().getName() + ": " + e.getMessage(), e);  
                        return result;  
                    }  
                }  
                return result;  
            } catch (RuntimeException e) {  
                logger.error("Got unchecked and undeclared exception which called by " + RpcContext.getContext().getRemoteHost()  
                        + ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName()  
                        + ", exception: " + e.getClass().getName() + ": " + e.getMessage(), e);  
                throw e;  
            }  
        }  
    } 
    本文著作权归作者 [ admin ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    首页邻居关于归档
    Copyright©2020-2026  All Rights Reserved.  Load:0.017 s
    京ICP备18019712号
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。