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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80978.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80978.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80978.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解密企業級大模型智能體Agentic AI 關鍵技術:MCP、A2A、Reasoning LLMs-強化學習算法

解密企業級大模型智能體Agentic AI 關鍵技術&#xff1a;MCP、A2A、Reasoning LLMs-強化學習算法 現在我們的核心問題是有一些同學會知道要才能強化學習。為什么才能強化學習&#xff1f;是實現AGI。例如從這個其實你從第一階段開始以后&#xff0c;就是chatbot&#xff0c;這…

音頻分類的學習

1.深度學習PyTorch入門-語音分類 https://blog.csdn.net/sinat_41787040/article/details/129795496 https://github.com/musikalkemist/pytorchforaudio https://github1s.com/musikalkemist/pytorchforaudio/blob/main/04%20Creating%20a%20custom%20dataset/urbansoundda…

美SEC主席:探索比特幣上市證券交易所

作者/演講者&#xff1a;美SEC主席Paul S. Atkins 編譯&#xff1a;Liam 5月12日&#xff0c;由美國SEC加密貨幣特別工作組發起的主題為《資產上鏈&#xff1a;TradFi與DeFi的交匯點》系列圓桌會議如期舉行。 會議期間&#xff0c;現任美SEC主席Paul S. Atkins發表了主旨演講。…

Qt file文件操作詳解

1.引言 很多應用程序都具備操作文件的能力&#xff0c;包括對文件進行寫入和讀取&#xff0c;創建和刪除文件等等&#xff0c;甚至某些應用程序的就是為了操作文件&#xff0c;像WPS Office。基于此Qt框架中專門提供了對文件操作的類&#xff1a;QFile。 2.QFile文件操作 QF…

【測試開發知識儲備】之Jacoco(Java Code Coverage)

文章目錄 Jacoco是什么Jacoco的主要功能&#xff08;一&#xff09;多樣化覆蓋率指標分析&#xff08;二&#xff09; 豐富的報告生成&#xff08;三&#xff09;實時數據收集 Jacoco的工作原理&#xff08;一&#xff09;字節碼增強&#xff08;二&#xff09;測試執行與數據收…

Docker 介紹與使用

Docker 文章目錄 Docker介紹與虛擬機的比較啟動速度占用資源 優勢更容易遷移更容易維護更容易擴展 使用場景持續集成提供可伸縮的云服務搭建微服務架構 鏡像與容器鏡像構成&#xff08;分層結構&#xff09;鏡像與容器的區別 安裝 Docker常用命令介紹鏡像相關容器相關 實戰&…

《AI大模型應知應會100篇》第62篇:TypeChat——類型安全的大模型編程框架

第62篇&#xff1a;TypeChat——類型安全的大模型編程框架 摘要 在構建 AI 應用時&#xff0c;一個常見的痛點是大語言模型&#xff08;LLM&#xff09;輸出的不確定性與格式不一致問題。開發者往往需要手動解析、校驗和處理模型返回的內容&#xff0c;這不僅增加了開發成本&a…

upload-labs通關筆記-第5關 文件上傳之.ini繞過

目錄 一、ini文件繞過原理 二、源碼審計 三、滲透實戰 1、查看提示 2、制作.user.ini文件 &#xff08;1&#xff09;首先創建一個文本文件 &#xff08;2&#xff09;保存文件名為.user.ini 2、制作jpg后綴腳本 &#xff08;1&#xff09;創建一個文本文件 &#xf…

為什么 Linux 上默認沒有 host.docker.internal

在 Linux 環境中&#xff0c;host.docker.internal 是 Docker 為容器提供的一個特殊 DNS 名稱&#xff0c;用于指向宿主機的 IP 地址&#xff08;類似 macOS/Windows 中的行為&#xff09;。但這個功能在 Linux 上默認不啟用&#xff0c;需要手動配置才能使用。以下是詳細解釋和…

C++GO語言微服務和服務發現②

01 創建go-micro項目-查看生成的 proto文件 02 創建go-micro項目-查看生成的main文件和handler ## 創建 micro 服務 命令&#xff1a;micro new --type srv test66 框架默認自帶服務發現&#xff1a;mdns。 使用consul服務發現&#xff1a; 1. 初始consul服務發現&…

Redis--常見數據類型List列表

目錄 一、概念 二、命令 2.1 LPUSH 2.2 LPUSHX 2.3 RPUSH 2.4 RPUSHX 2.5 LRANGE 2.6 LPOP 2.7 RPOP 2.8 LINDEX 2.9 LINSERT 2.10 LLEN 2.11 阻塞版本命令 三、內部編碼 一、概念 列表類型是用來存儲多個有序的字符串&#xff0c;列表中的每個字符串稱為元素&…

QListWedget控件使用指南

QListWedget公共函數 函數簽名功能描述QListWidget(QWidget *parent nullptr)構造函數&#xff0c;創建一個QListWidget對象&#xff0c;可指定父部件&#xff08;默認為nullptr&#xff09;。virtual ~QListWidget()虛析構函數&#xff0c;釋放QListWidget對象及其資源。voi…

Seata源碼—1.Seata分布式事務的模式簡介

大綱 1.Seata分布式事務框架簡介 2.Seata AT模式實現分布式事務的機制 3.Seata AT模式下的寫隔離機制 4.Seata AT模式下的讀隔離機制 5.官網示例說明Seata AT模式的工作機制 6.Seata TCC模式的介紹以及與AT模式區別 7.Seata Saga模式的介紹 8.單服務多個庫的分布式事務…

【Qt】之音視頻編程2:QtAV的使用篇

QtAV 基本播放控制功能實現&#xff08;C & QML&#xff09; QtAV 提供了完整的播放控制 API&#xff0c;支持 播放、暫停、停止、快進快退、截屏 等功能。以下是具體實現方法&#xff1a; 1. C 控制方式 基本播放控制 #include <QtAV> #include <QtAV/AVPlaye…

歌詞滾動效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 設置標簽頁圖標 --><link rel"shortcut icon&…

基于大模型的TIA診療全流程智能決策系統技術方案

目錄 一、多模態數據融合與預處理系統1.1 數據接入模塊1.2 數據預處理偽代碼二、TIA智能預測模型系統2.1 模型訓練流程2.2 混合模型架構偽代碼三、術中智能監測系統3.1 實時監測流程3.2 實時預測偽代碼四、智能診療決策系統4.1 手術方案推薦流程4.2 麻醉方案生成偽代碼五、預后…

Java 日期解析與格式化:從標準格式到自然語言解析

使用 Java 搭配 Apache Commons Lang3 和 Natty 庫&#xff0c;實現靈活高效的日期解析與格式化。 一、背景 將不同格式的日期統一成一個格式。日期格式可能有以下幾種類型&#xff1a; 標準格式&#xff1a;2024-02-28、14/05/2022、2002年5月6日非英文月份縮寫&#xff1a;…

Room持久化庫:從零到一的全面解析與實戰

簡介 在Android開發中,Room作為官方推薦的數據庫持久化庫,提供了對SQLite的抽象層,使得數據庫操作更加安全、高效且易于維護。 Room通過注解處理器和編譯時驗證,顯著降低了數據庫操作的復雜度,同時支持響應式編程模式,使開發者能夠輕松實現數據變化的實時監聽。對于企業…

MySQL(6)如何刪除數據庫和表?

在 MySQL 中刪除數據庫和表是常見的管理操作。下面將詳細介紹如何使用 SQL 語句以及圖形化工具來刪除數據庫和表。 步驟一&#xff1a;連接 MySQL 服務器 首先&#xff0c;連接到 MySQL 服務器&#xff0c;可以使用命令行工具 mysql 或圖形化工具如 MySQL Workbench。 使用命…

攜固態電池、新形態鋼殼疊片電池等產品 豪鵬科技將亮相CIBF 2025

攜固態電池、新形態鋼殼疊片電池等產品 豪鵬科技將亮相CIBF 2025 來源&#xff1a; 電池百人會-電池網 豪鵬科技&#xff08;展位號:14W001&#xff09;將攜固態電池、新形態鋼殼疊片電池及高安全性鈉離子電池等前沿技術產品亮相CIBF 2025&#xff0c;憑借多年的技術積累和產…