一、前言
openfeign和dubbo均是rpc框架
RPC(Remote Procedure Call,遠程過程調用)框架 是一種允許程序像調用本地方法一樣調用遠程服務器上函數的技術。它隱藏了底層網絡通信的復雜性,讓開發者可以專注于業務邏輯,實現分布式系統中不同服務之間的高效協作
文本計劃在一個應用中同時使用openfeign
和dubbo
來進行遠程調用,前端提供el-switch
組件來進行切換
showCase
分別使用dubbo和feign進行了1萬筆數據的導出測試
二、實踐
2-1、模塊拆分
先前只有一個security-demo
服務,如今拆分成security-demo
和base-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-manage
和remote-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