上传文件Dubbo报错: Data length too large: xxxxx, max payload: 8388608

一、场景:

服务端是微服务,服务A有个上传图片的功能,需求是限制大小为10M,用户通过客户端把图片上传到服务AA再调用服务B把文件上传至阿里oss。
功能实际上很简单,实现的代码如下:
服务A的Controller层逻辑

@PostMapping("/upload")
public Result<String> upload(@RequestParam MultipartFile file) {Long userId = SecurityContextHolder.getUserId();return Result.success(feedbackService.uploadAttachment(userId, file));
}

服务A的Service层逻辑

@DubboReference(version = "1.0.0")
private RemoteFileService fileService;@Override
public String uploadAttachment(Long userId, MultipartFile file) {    // 文件大小限制为10Mif (file.getSize() > 10 * 1024 * 1024) {throw new ClientErrorException("文件大小超过10M限制");}// 文件上传OSSreturn fileService.storage(file.getBytes(), file.getOriginalFilename(), userId);   
}

服务B的业务逻辑,文件保存到阿里云OSS

@DubboService(version = "1.0.0")
public class DubboFileService implements RemoteFileService {@Overridepublic String storage(byte[] bytes, String fileName, Long userId) {String fileId = String.format("file/%d-%d%s", userId, System.currentTimeMillis(), fileName.substring(fileName.lastIndexOf('.')));//上传到ossif (!ossService.upload(fileId, bytes)) {throw new ServerErrorException("上传失败");}//文件信息FileInfo info = new FileInfo();info.setUserId(userId);info.setMd5(Md5Utils.getMD5(bytes));info.setSize(bytes.length);info.setName(fileName);//完整路径String filePath = String.format("%s/%s", ExternalUrl.CDN_HOST, fileId);info.setDownload(filePath);//保存到数据库fileMapper.addOne(info);return filePath;}
}

两个服务调用是采用的dubbo协议,配置如下:
公共配置:

dubbo:	application:name: ${spring.application.name}protocol:# dubbo 协议name: dubbo# dubbo 协议端口( -1 表示自增端口,从 20880 开始)port: -1threads: 2000registry:address: nacos://${spring.cloud.nacos.discovery.server-addr}/?namespace=dubbocheck: false#生产者provider:timeout: 25000#消费者consumer:timeout: 25000check: false

服务A配置

# dubbo
dubbo:scan:# dubbo 服务扫描基准包base-packages: com.xxx.feedback.dubbocloud:subscribed-services: feedback

服务B配置

# dubbo
dubbo:scan:# dubbo 服务扫描基准包base-packages: com.xxx.file.dubbocloud:subscribed-services: file

二、测试过程

测试上传9.83M文件,报500错误,显示后台异常,查看日志,异常日志如下

[ERROR] 2023-12-13 10:42:31.918 o.a.d.r.transport.AbstractCodec         [52]: Data length too large: 12111020, max payload: 8388608, channel: NettyChannel [channel=[id: 0x25031a14, L:/192.168.0.2:53556 - R:/192.168.0.2:20881]]
org.apache.dubbo.remoting.transport.ExceedPayloadLimitException: Data length too large: 10307502, max payload: 8388608, channel: NettyChannel [channel=[id: 0x25031a14, L:/192.168.0.2:53556 - R:/192.168.0.2:20881]]at org.apache.dubbo.remoting.transport.AbstractCodec.checkPayload(AbstractCodec.java:50)at org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.encodeRequest(ExchangeCodec.java:270)at org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.encode(ExchangeCodec.java:71)at org.apache.dubbo.rpc.protocol.dubbo.DubboCountCodec.encode(DubboCountCodec.java:40)at org.apache.dubbo.remoting.transport.netty4.NettyCodecAdapter$InternalEncoder.encode(NettyCodecAdapter.java:69)
... ...

查了资料,dubbo默认的传输大小是8388608B(8M)。修改配置,公共配置增加了dubbo.protocol.dubbo.payload一项。

# dubbo配置,其他略
dubbo:protocol:# dubbo 协议name: dubbo# dubbo 协议端口( -1 表示自增端口,从 20880 开始)port: -1threads: 2000dubbo:# 传输大数据容量 10MBpayload: 10485760

继续测试,问题依旧,配置完全没有生效。继续查资料,又看到另外一种配置方式

# dubbo
dubbo:application:name: ${spring.application.name}protocol:# dubbo 协议name: dubbo# dubbo 协议端口( -1 表示自增端口,从 20880 开始)port: -1threads: 2000# 传输大数据容量 10Mpayload: 10485760registry:address: nacos://${spring.cloud.nacos.discovery.server-addr}/?namespace=dubbocheck: false#生产者provider:payload: 10485760timeout: 25000#消费者consumer:parameters:payload: 10485760timeout: 25000check: false

测试成功,说明配置已经生效了。更新到生产环境,再次测试,上传界面一直无响应,等了许久显示超时。日志打印的错误如下:

[ERROR] 2023-12-13 11:23:44.471 c.i.c.s.h.GlobalExceptionHandler        [96]: 请求地址'/upload'发生未知异常.
org.apache.dubbo.rpc.RpcException: Failed to invoke the method storage in the service com.xxx.file.api.RemoteFileService. Tried 3 times of the providers [192.168.0.2:20881] (1/1) from the registry 192.168.0.234:8848 on the consumer 192.168.0.2 using the dubbo version 2.7.15. Last error is: Invoke remote method timeout. method: storage, provider: dubbo://192.168.0.2:20881/com.xxx.file.api.RemoteFileService?anyhost=true&application=feedback&category=providers&check=false&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&init=false&interface=com.xxx.file.api.RemoteFileService&metadata-type=remote&methods=download,storage,allFiles&path=com.xxx.file.api.RemoteFileService&payload=11557050&pid=24099&protocol=dubbo&qos.enable=false&register.ip=192.168.0.2&release=2.7.15&remote.application=file&revision=1.0.0&service.name=ServiceBean:/com.xxx.file.api.RemoteFileService:1.0.0&side=consumer&sticky=false&timeout=25000&timestamp=1699945248523&version=1.0.0, cause: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2023-12-13 11:23:19.423, end time: 2023-12-13 11:23:44.443, client elapsed: 86 ms, server elapsed: 24934 ms, timeout: 25000 ms, request: Request [id=591, version=2.0.2, twoway=true, event=false, broken=false, data=null], channel: /192.168.0.2:40518 -> /192.168.0.2:20881at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:110)at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:265)at org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor.intercept(ClusterInterceptor.java:47)at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$InterceptorInvokerNode.invoke(AbstractCluster.java:92)at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:98)at org.apache.dubbo.registry.client.migration.MigrationInvoker.invoke(MigrationInvoker.java:170)at org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareClusterInvoker.doInvoke(ZoneAwareClusterInvoker.java:100)at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:265)at org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor.intercept(ClusterInterceptor.java:47)at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$InterceptorInvokerNode.invoke(AbstractCluster.java:92)at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:96)at org.apache.dubbo.common.bytecode.proxy2.storage(proxy2.java)at com.xx.feedback.service.impl.FeedbackServiceImpl.uploadAttachment(FeedbackServiceImpl.java:387)at com.xxx.feedback.service.impl.FeedbackServiceImpl$$FastClassBySpringCGLIB$$f1a53452.invoke(<generated>)
... ...        

尝试修改超时配置,把timeout时长改长1分钟。

# dubbo配置
dubbo:application:name: ${spring.application.name}protocol:# dubbo 协议name: dubbo# dubbo 协议端口( -1 表示自增端口,从 20880 开始)port: -1threads: 2000# 传输大数据容量 10Mpayload: 10485760registry:address: nacos://${spring.cloud.nacos.discovery.server-addr}/?namespace=dubbotimeout: 25000check: false#生产者provider:payload: 10485760timeout: 65000#消费者consumer:parameters:payload: 10485760timeout: 60000check: false

再次测试依旧报错,难道说超时配置也不生效?没办法了,只能修改代码了。
服务A(服务消费者)增加timeout参数,但这个时间比消费者略大一点

@DubboReference(version = "1.0.0", timeout = 60 * 1000)

服务B(服务生产者)增加timeout参数,但这个时间比消费者略大一点

@DubboService(version = "1.0.0", timeout = 65 * 1000)

重启生效。

三、总结

相同的代码在不同的环境可能执行效果不一样,一定要认真检查和测试,保证功能没有任何问题才能正式使用。
另外,payload最好设置大一点,我们正常的业务可能是文件+表单一起提交的,大小可能超过10M,防止这种情况就把payload设置大一点。
还有人说可以使用dubbo的hessian协议来解决大文件传输,这个我还没研究,后面有时间再看看。

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

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

相关文章

快速准确翻译文件夹名:英文翻译成中文,文件夹批量重命名的技巧

在处理大量文件夹时&#xff0c;可能会遇到要将英文文件夹名翻译成中文的情况。同时也可能要批量重命名这些文件夹。今天一起来看下云炫文件管理器如何快速准确翻译文件夹名&#xff0c;进行批量重命名的技巧。 下图是文件夹名翻译前后的效果图。 英文文件夹名批量翻译成中文…

3Dmax快捷键大全,让你的创作飞起来!附赠3dmax工具箱插件,快来收藏吧!

你是否曾经在3Dmax中因为繁琐的操作而感到困扰&#xff1f; 今天&#xff0c;我将为大家带来一份精心整理的3Dmax常用快捷键宝典&#xff0c;让你在建模、材质编辑、动画制作等各个方面都能游刃有余&#xff0c;让你的创作飞起来&#xff01;&#xff01; &#x1f4a1; 选择与…

7-1 jmu-python-输入输出-处理不定行输入

7-1 jmu-python-输入输出-处理不定行输入 分数 15 作者 郑如滨 单位 集美大学 处理一段文字&#xff08;可能有很多行&#xff0c;行数不确定&#xff09;&#xff0c;输出每行包含的单词数(单词之间以空格或多个空格分隔)。 注意&#xff1a;处理的时候要忽略掉空行或者空格行…

27. 深度学习进阶 - 为什么RNN

文章目录 一个柯基的例子为什么RNN or CNN Hi&#xff0c;你好。我是茶桁。 这节课开始&#xff0c;我们将会讲一个比较重要的一种神经网络&#xff0c;它对应了咱们整个生活中很多类型的一种问题结构&#xff0c;它就是咱们的RNN网络。 咱们首先回忆一下&#xff0c;上节课咱…

【计算机网络】TCP|IP协议

目录 前言 什么是TCP/IP协议&#xff1f; TCP/IP协议的层次结构 TCP/IP协议的工作原理 TCP/IP协议的重要性 结语 前言 TCP/IP协议是当今互联网世界中最重要的网络协议之一&#xff0c;它是网络通信的基石&#xff0c;为数据在网络中的传输提供了可靠性和有效性。本文将深…

前段js解决文本框录入保留多位小数设置

自己在前段开发所遇到的问题整理了一下&#xff0c;供大家参考&#xff1a; 原本的代码&#xff1a;<input type"text" class"form-control" id"yfprice" style"text-align:right;" value"0" οnkeyup"valuevalue.…

python编程需要的电脑配置,python编程用什么电脑

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python编程对笔记本电脑配置的要求&#xff0c;python编程对电脑配置的要求有哪些&#xff0c;现在让我们一起来看看吧&#xff01; 学习python编程需要什么配置的电脑 简单的来讲&#xff0c;Python的话普通电脑就可以…

SAP UI5 walkthrough step1 hello word

这里我用的VS Studio 来进行本地化学习 关于SAP UI5是啥&#xff0c;我就不再赘述了&#xff0c;另外还有VS Studio 的安装&#xff0c;请提前做好准备 下面我们直接进入正文 1.首先在你的本地新建一个文件夹&#xff0c;此处我命名为&#xff1a;walkthrough 2.在VS中打开…

​fractions --- 分数​

源代码 Lib/fractions.py fractions 模块支持分数运算。 分数实例可以由一对整数&#xff0c;一个分数&#xff0c;或者一个字符串构建而成。 class fractions.Fraction(numerator0, denominator1) class fractions.Fraction(other_fraction) class fractions.Fraction(flo…

【数据结构与算法】JavaScript实现图结构

文章目录 一、图论1.1.图的简介1.2.图的表示邻接矩阵邻接表 二、封装图结构2.1.添加字典类和队列类2.2.创建图类2.3.添加顶点与边2.4.转换为字符串输出2.5.图的遍历广度优先搜索深度优先搜索 2.6.完整实现 一、图论 1.1.图的简介 什么是图&#xff1f; 图结构是一种与树结构…

正则表达式的规则

文章目录 一、&#x1f94f;正则表达式的简述1、&#x1f9ff;什么是正则表达式2、&#x1f9eb;正则表达式特点 二、&#x1f30a;正则表达式的规则三、&#x1f3af;常用的正则表达式⚛️正则表达式语法 一、&#x1f94f;正则表达式的简述 1、&#x1f9ff;什么是正则表达式…

Java中的反射

反射 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c; Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. 反射相关的概念 2. 反射的…

Thread-Per-Message设计模式

Thread-Per-Message是为每一个消息的处理开辟一个线程&#xff0c;以并发方式处理&#xff0c;提高系统整体的吞吐量。这种模式再日常开发中非常常见&#xff0c;为了避免线程的频繁创建和销毁&#xff0c;可以使用线程池来代替。 示例代码如下&#xff1a; public class Requ…

HarmonyOS4.0从零开始的开发教程12给您的应用添加弹窗

HarmonyOS&#xff08;十&#xff09;给您的应用添加弹窗 概述 在我们日常使用应用的时候&#xff0c;可能会进行一些敏感的操作&#xff0c;比如删除联系人&#xff0c;这时候我们给应用添加弹窗来提示用户是否需要执行该操作&#xff0c;如下图所示&#xff1a; 弹窗是一种…

工作招聘

https://jobs.bilibili.com/social/positions/16978 Java开发工程师&#xff08;交易业务&#xff09; 上海全职技术类2023-11-15 发布 职位描述 工作职责: 1、B站电商平台架构整体设计&#xff0c;B站电商业务高速发展背景下&#xff0c;电商业务中台建设&#xff0c;如商品…

AI全栈大模型工程师(二十八)如何做好算法备案

互联网信息服务算法 什么情况下要备案&#xff1f; 对于B2B业务&#xff0c;不需要备案。 但在B2C领域&#xff0c;一切要视具体情况而定。 如果我们自主训练大型模型&#xff0c;这是必要的。 但如果是基于第三方模型提供的服务&#xff0c;建议选择那些已获得备案并且具有较大…

前端小记--4.前端终止jquery的ajax请求

在项目中&#xff0c;有时需要主动终止数据请求&#xff0c;比如&#xff0c;某个数据请求响应时间比较慢&#xff0c;用户在等待请求的过程中取消请求&#xff0c;但后台服务器仍在执行计算&#xff0c;此时就需要前端主动终止请求&#xff0c;避免资源浪费。 这里以终止jque…

前端打包工具之Webpack5

前端打包工具之Webpack5 什么是打包工具打包工具的作用常见的打包工具一、Webpack1、什么是[webpack](https://webpack.docschina.org/concepts/)2、webpack本身的功能是有限的3、webpack基本使用&#xff1a;基于本身功能只解析JS资源4、webpack配置4.1、entry&#xff08;入口…

Python脚本打包

一.Windows操作系统 Python脚本打包 1.cmd窗口执行如下指令&#xff1a;pip install pyinstaller C:\Users\ZhuQing>pip install pyinstaller2.执行以下指令验证pyinstaller是否安装成功&#xff08;pyinstaller&#xff09; C:\Users\ZhuQing>pyinstaller3.被打包程序…

frp配置内网穿透步骤

frp配置内网穿透步骤 1.环境准备1.1 云服务器1.2 frp包 2. frp安装2.1 server服务端设置2.2 客户端配置 实现目标通过云服务器ip:8080访问内网电脑启动的web项目localhost:8080 1.环境准备 1.1 云服务器 服务器安装centos7.9, 安全组入口方向开通 7500 7000 8080 8060端口 …