当前位置: 首页 > article >正文

openfeign与dubbo调用下载excel实践

一、前言

openfeign和dubbo均是rpc框架

RPC(Remote Procedure Call,远程过程调用)框架 是一种允许程序像调用本地方法一样调用远程服务器上函数的技术。它隐藏了底层网络通信的复杂性,让开发者可以专注于业务逻辑,实现分布式系统中不同服务之间的高效协作

文本计划在一个应用中同时使用openfeigndubbo来进行远程调用,前端提供el-switch组件来进行切换

showCase

分别使用dubbo和feign进行了1万笔数据的导出测试

请添加图片描述

二、实践

2-1、模块拆分

先前只有一个security-demo服务,如今拆分成security-demobase-service两个服务,其中model-manage模块用来管理微服务中通用的实体类,remote-client用来管理远程调用:
在这里插入图片描述
其中和excel导出相关的具体实现被移动到了base-service服务中,计划在security-demo通过openfeign和dubbo等方式来调用导出接口。

2-2、依赖引入

在远程调用管理中引入dubbo、openfeign、nacos、通用实体相关依赖,其中${dubbo.version}取父pom的<dubbo.version>2.7.15</dubbo.version>

		<dependencies><!-- Dubbo Spring Boot Starter --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.version}</version></dependency><!-- Dubbo Registry Nacos --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId><version>${dubbo.version}</version></dependency><!-- Spring Cloud Alibaba Nacos Discovery --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- Spring Boot Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- OpenFeign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.tgh</groupId><artifactId>model-manage</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency></dependencies>

在服务调用方security-demo和服务提供方base-service引入model-manageremote-client

        <dependency><groupId>com.tgh</groupId><artifactId>remote-client</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency>

2-3、后端环境&配置变更

由于涉及到微服务之间的通信,涉及到服务的注册和发现,本文以nacos作为注册中心,于是需要安装并运行nacos,安装细节不赘述,博主将nacos安装在ubuntu机器中

base-service yml配置

spring:profiles:active: devapplication:name: base-servicedatasource:url: jdbc:postgresql://192.168.125.102:5432/dbname?user=postgres&password=postgresdriver-class-name: org.postgresql.Drivercloud:nacos:discovery:server-addr: 192.168.125.102:8848redis:host: 192.168.125.102port: 6379password: redisdatabase: 0
server:port: 8081
management:endpoints:web:exposure:include: '*'
# Dubbo配置
dubbo:application:name: ${spring.application.name}qos-enable: falseprotocol:name: dubboport: 20881payload: 20971520provider:payload: 20971520timeout: 600000threads: 200       # 增大服务端线程池registry:address: nacos://${spring.cloud.nacos.discovery.server-addr}namespace: ${spring.cloud.nacos.discovery.namespace}scan:base-packages: com.tghconsumer:check: false
logging:level:org.springframework.boot.web.servlet.context: DEBUGorg.apache.tomcat: DEBUGorg.apache.dubbo: DEBUGorg.alibaba.dubbo: DEBUG
#sql日志
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

security-demo yml配置

#---------------dev环境配置---------------
#pg数据源
spring:datasource:url: jdbc:postgresql://192.168.125.102:5432/dbname?user=postgres&password=postgresdriver-class-name: org.postgresql.Driverapplication:name: security-democloud:nacos:discovery:server-addr: 192.168.125.102:8848redis:host: 192.168.125.102port: 6379password: redis # 如果有密码database: 0rabbitmq:host: 192.168.125.102port: 5672username: adminpassword: adminvirtual-host: /
logging:level:org.springframework.transaction: DEBUGorg.springframework.jdbc: DEBUGorg.apache.dubbo: DEBUGorg.alibaba.dubbo: DEBUG
#rabbit-mq
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
server:port: 8888
feign:client:config:default:  # 对所有Feign客户端生效connectTimeout: 5000  # 连接超时时间(毫秒)readTimeout: 100000     # 读取超时时间(毫秒)
# Dubbo配置
dubbo:application:name: ${spring.application.name}qos-enable: falseregistry:address: nacos://${spring.cloud.nacos.discovery.server-addr}namespace: ${spring.cloud.nacos.discovery.namespace}scan:base-packages: com.tghconsumer:payload: 20971520timeout: 600000check: false       # 启动时不强制检查服务可用性

ubuntu开放8848、9848、9849端口

sudo ufw allow 8848/tcp
sudo ufw allow 9848/tcp
sudo ufw allow 9849/tcp
sudo ufw enable

2-4、前端调整

工单列表查询从调用 security-demo服务调整为base-service服务

在这里插入图片描述
在前缀调整后,需在vite.config.ts的server.proxy中加入

      '/base': { // 以 '/asset' 开头的请求会被代理target: 'http://localhost:8081', // 后端服务器地址changeOrigin: true, // 允许跨域rewrite: (path) => path.replace(/^\/base/, '') // 重写路径,去掉 '/asset'}

工单列表查询页面,增加el-switch组件来进行切换dubbo和feign

在这里插入图片描述

三、补充说明

3-1、使用dubbo可能遇到的问题

3-1-1、com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING

nacos新增的gRPC通信方式,需要多开两个端口9848、9849,博主的nacos安装在ubuntu机器上,可执行如下指令:

sudo ufw allow 9848/tcp
sudo ufw allow 9849/tcp
sudo ufw enable

3-1-2、Caused by: java.lang.IllegalStateException: Serialized class com.tgh.entity.excel.WorkOrderLogSearchVO must implement java.io.Serializable

Dubbo方法的入参和入参都需要实现Serializable,为什么?

(1) 二进制协议需要严格序列化

Dubbo 默认使用 Hessian2 或 Kryo 等二进制序列化协议,要求所有跨网络传输的对象必须实现 Serializable 接口,因为:

二进制切割:需要精确计算对象字节大小和字段偏移量。类型安全:反序列化时必须还原原始类结构,避免数据丢失。

(2) 性能优化考虑

二进制序列化比JSON更高效,但需要预先定义类型结构。非 Serializable 对象无法保证序列化/反序列化的确定性。

3-1-3、org.apache.dubbo.remoting.RemotingException: Data length too large: 15871746, max payload: 8388608

Dubbo默认只能传输小于8M的内容,需要手动修改Dubbo的配置
服务提供方

  protocol:name: dubbopayload: 20971520  # 20MBprovider:payload: 20971520timeout: 600000threads: 200       # 增大服务端线程池

服务调用方

  consumer:payload: 20971520timeout: 600000check: false       # 启动时不强制检查服务可用性

3-1、测试数据初始化

本文采用pg数据库,工单初始化脚本可以参考PostgreSQL 分区表——范围分区SQL实践的执行脚本新增2400w行。
也可从后端代码script/sql/init.sql中获取

3-2、代码仓

后端:https://gitee.com/pinetree-cpu/parent-demon
前端:https://gitee.com/pinetree-cpu/hello_vue3

相关文章:

openfeign与dubbo调用下载excel实践

一、前言 openfeign和dubbo均是rpc框架 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;框架 是一种允许程序像调用本地方法一样调用远程服务器上函数的技术。它隐藏了底层网络通信的复杂性&#xff0c;让开发者可以专注于业务逻辑&#xff0c;实现…...

ISP有感自发

一、黑电平 由于传感器&#xff0c;即便在无光的情况下&#xff0c;依然会产生微小的暗电流&#xff0c;这些暗电流可能是噪点会影响后期的调试。因此&#xff0c;我们便将这些电流处理为0&#xff0c;成为纯黑的颜色。可以在源头消除这些误差。 如何矫正黑电平&#xff1a; …...

web 自动化之 PO 设计模式详解

文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构&#xff1f;1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…...

NVMe简介1

它分为两部分&#xff0c;这里是第一部分。 NVM Express&#xff08;NVMe&#xff09;是一种高性能、可扩展的接口协议&#xff0c;用于通过PCI express&#xff08;PCIe&#xff09;总线&#xff0c;实现主机软件与NVM设备之间的通信。目前&#xff0c;由于NVMe SSD相比于SATA…...

【python机器学习】Day 25 异常处理

知识点&#xff1a; 异常处理机制debug过程中的各类报错try-except机制try-except-else-finally机制 在即将进入深度学习专题学习前&#xff0c;我们最后差缺补漏&#xff0c;把一些常见且重要的知识点给他们补上&#xff0c;加深对代码和流程的理解。 借助ai写代码的时候&…...

数学建模初等模型应用

一、目的 掌握初等模型的建模方法,对简单的初等模型能借助Matlab工具软件进行辅助建模、求解和检验。 二、实验内容与设计思想&#xff08;设计思路、主要代码分析&#xff09; 1、预测鱼的质量 &#xff08;1&#xff09;设计思路&#xff1a;使用线性回归模型预测鱼的质量…...

占位符读取标准输入缓冲区规则

1、如果标准输入缓冲区中的前若干个字符都是空白字符&#xff0c;%s&#xff0c;%d&#xff0c;%f都能直接跳过并且从第一个非空白字符开始读取&#xff0c;但%c不能&#xff0c;而是直接读取。 2、%s遇到空白字符时停止&#xff0c;不会读取遇到的空白字符。 3、%d遇到非数字…...

【MCP教程系列】SpringBoot 搭建基于 Spring AI 的 SSE 模式 MCP 服务

原文地址&#xff1a;https://developer.aliyun.com/article/1662946 在当今快速发展的AI技术背景下&#xff0c;如何高效地集成模型能力成为开发者关注的重点。本文将手把手教你如何基于 Spring AI 搭建支持 SSE&#xff08;Server-Sent Events&#xff09;模式的 MCP 服务 相…...

【kafka】kafka概念,使用技巧go示例

1. Kafka基础概念 1.1 什么是Kafka&#xff1f; Kafka是一个分布式流处理平台&#xff0c;用于构建实时数据管道和流式应用。核心特点&#xff1a; 高吞吐量&#xff1a;每秒可处理百万级消息持久化存储&#xff1a;消息按Topic分区存储在磁盘分布式架构&#xff1a;支持水平…...

利用散点图探索宇航员特征与太空任务之间的关系

利用散点图探索宇航员特征与太空任务之间的关系 import matplotlib.pyplot as plt import numpy as np import pandas as pdfrom flexitext import flexitext from matplotlib.patches import FancyArrowPatchplt.rcParams.update({"font.family": "Corbel&quo…...

Ubuntu 命令行显示中文输出信息

Ctrl Alt T 打开终端命令行, 输入命令: sudo apt-get install language-pack-zh-hans安装中文语言支持包 sudo apt-get install language-pack-zh-hans-base配置环境变量 sudo vim /etc/profile进入文件后&#xff0c;按下 a 进入编辑模式&#xff0c;shift ↓ \downarr…...

Linux文件编程——read函数与lseek函数

一、read函数 在 Linux 文件编程中&#xff0c;read 函数是一个系统调用&#xff0c;用于从文件描述符&#xff08;File Descriptor&#xff09;指向的文件或设备中读取数据到缓冲区。它是 Unix/Linux 系统编程中实现底层 I/O 操作的核心函数之一。以下是 read 函数的详细使用…...

[思维模式-38]:看透事物的关系:什么是事物的关系?事物之间的关系的种类?什么是因果关系?如何通过数学的方式表达因果关系?

一、什么是事物的关系&#xff1f; 事物的关系是指不同事物之间存在的各种联系和相互作用&#xff0c;它反映了事物之间的相互依存、相互影响、相互制约等特性。以下从不同维度为你详细阐述&#xff1a; 1、关系的类型 因果关系 定义&#xff1a;一个事件&#xff08;原因&a…...

【2025.5.12】视觉语言模型 (更好、更快、更强)

【2025.5.12】Vision Language Models (Better, Faster, Stronger)&#xff1a; https://huggingface.co/blog/vlms-2025 【2024.4.11】Vision Language Models Explained【先了解视觉语言模型是什么】&#xff1a; https://huggingface.co/blog/vlms nanoVLM: https://github.…...

Spring的bean的生命周期?

Spring中bean的生命周期包括以下步骤&#xff1a; 通过BeanDefinition获取bean的定义信息。 调用构造函数实例化bean。 进行bean的依赖注入&#xff0c;例如通过setter方法或Autowired注解。 处理实现了Aware接口的bean。 执行BeanPostProcessor的前置处理器。 调用初始化…...

Qwen集成clickhouse实现RAG

一、RAG概要 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种结合了信息检索技术与语言生成模型的人工智能技术。旨在通过检索相关文档来增强大模型的生成能力&#xff0c;从而提高预测的质量和准确性。RAG模型在生成文本或回答…...

Excel分组计算求和的两种实现方案

文章目录 背景样例数据方案一、函数求和实现步骤缺点 方案二、数据透视表实现步骤优点 背景 在Excel文档中&#xff0c;经常会进行数据的求和计算&#xff0c;可使用不同的方式实现&#xff0c;记录下来&#xff0c;方便备查。 样例数据 已有商品销量信息&#xff0c;包含销…...

深入理解卷积神经网络:从基础原理到实战应用

在人工智能领域&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称 CNN&#xff09;凭借其强大的图像识别、处理能力&#xff0c;成为深度学习中不可或缺的技术。无论是自动驾驶汽车识别道路标志&#xff0c;还是医学影像分析辅助疾病诊断&…...

LLM定制新路径:微调与上下文学习的博弈与融合

在当今人工智能的浪潮中&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已成为推动行业进步的关键力量。无论是自然语言处理、文本生成还是多模态应用&#xff0c;LLMs都在展现着它们的强大能力。然而&#xff0c;当我们将这些强大的模型应用于特定的下游任务时&#xf…...

【江苏省】《信息技术应用创新软件适配改造成本评估规范》(DB32/T 4935-2024)-标准解读系列

在信息技术应用创新产业蓬勃发展的当下&#xff0c;软件适配改造成本评估成为项目实施的关键环节。《DB32/T 4935-2024 信息技术应用创新软件适配改造成本评估规范》应运而生&#xff0c;为成本评估提供了专业依据。同时&#xff0c;《省级政务信息化项目建设方案编制规范&…...

JDK 命令行工具大全与学习方法总结 —— 从帮助文档到高效实践

JDK 命令行工具大全与学习方法总结 —— 从帮助文档到高效实践 Java开发与运维过程中&#xff0c;JDK自带的命令行工具是定位问题、性能调优、编译调试的基石。本文全面梳理JDK常用命令工具、帮助文档的获取方式&#xff0c;并总结类似Linux命令行的学习方法&#xff0c;助你系…...

嵌入式中深入理解C语言中的指针:类型、区别及应用

在嵌入式开发中,C语言是一种基础且极为重要的编程语言,其中指针作为一个非常强大且灵活的工具,广泛应用于内存管理、动态数据结构的实现以及函数参数的传递等方面。然而,尽管指针的使用极为常见,很多开发者在掌握其基本使用后,往往对指针的深入理解还不够。本文将深入分析…...

香港维尔利健康科技集团成都区域运营中心投入使用,西南市场战略全面提速

近日&#xff0c;香港维尔利健康科技集团正式宣布&#xff0c;其位于四川成都的西南区域运营中心已全面建成并投入使用。该中心将集设备调配、技术支持、客户服务、运营管理及数字健康平台维护于一体&#xff0c;成为集团在中国内地智慧医疗战略版图中的关键枢纽&#xff0c;对…...

STM32CubeMX HAL库 串口的使用

1.配置 2.开启中断后&#xff0c;生成代码 3.串口的接收 1&#xff09;.开启空闲中断接收 __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE); // 关键步骤&#xff1a;启用空闲中断 2&#xff09;. 启动接收 调用 HAL_UARTEx_ReceiveToIdle_IT 启动异步接收&#xff0c;可以使用…...

二手车估值接口介绍

二手车估值接口是基于大数据和机器学习技术开发的工具&#xff0c;旨在为二手车交易、金融评估等场景提供快速、精准的车辆价值评估服务。以下从核心功能、技术原理、接口特点及应用场景等方面进行综合介绍&#xff1a; 一、核心功能 多维度数据采集与分析 接口整合了车辆基础…...

flutter 视频通话flutter_webrtc

flutter 比较热门的库 flutter_webrtc | Flutter package agora_rtc_engine | Flutter package 我使用的是flutter_webrtc 下面是官方推荐的demo库 GitHub - flutter-webrtc/flutter-webrtc-demo: Demo for flutter-webrtc 其中 https://demo.cloudwebrtc.com:8086/ 已经停…...

Babylon.js学习之路《四、Babylon.js 中的相机(Camera)与视角控制》

文章目录 1. 引言&#xff1a;为什么相机是 3D 场景的“眼睛”&#xff1f;1.1 相机的核心作用1.2 常见相机类型概览 2. 相机基础参数解析2.1 通用属性2.2 相机坐标系 3. 详解常用相机类型3.1 自由相机&#xff08;FreeCamera&#xff09;3.2 弧形旋转相机&#xff08;ArcRotat…...

【Redis实战篇】秒杀优化

1. 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单…...

RHCE认证通过率

红帽RHCE考试总体通过率38%&#xff08;2023年数据&#xff09;&#xff0c;细分数据显示自学者通过率18%&#xff0c;参加官方培训者47%&#xff0c;企业团体考生53%。通过率差异由备考资源和考试策略决定。 RHCE考试重点考Ansible自动化运维&#xff0c;需在3.5小时内完成12…...

外贸礼品禁忌

一、亚洲 1.印度 牛是神圣动物&#xff0c;别送牛皮制品。另外&#xff0c;左手不洁&#xff0c;送礼得用右手或双手。 2.日本 “梳” 和 “苦” 谐音&#xff0c;不送梳子。日本男性不咋佩戴首饰&#xff0c;除结婚戒指。礼物得装盒、纸包、绳饰&#xff0c;白色包装得有…...