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>

xml 复制代码
		<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

xml 复制代码
        <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配置

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

security-demo yml配置

yml 复制代码
#---------------dev环境配置---------------
#pg数据源
spring:
  datasource:
    url: jdbc:postgresql://192.168.125.102:5432/dbname?user=postgres&password=postgres
    driver-class-name: org.postgresql.Driver
  application:
    name: security-demo
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.125.102:8848
  redis:
    host: 192.168.125.102
    port: 6379
    password: redis # 如果有密码
    database: 0
  rabbitmq:
    host: 192.168.125.102
    port: 5672
    username: admin
    password: admin
    virtual-host: /
logging:
  level:
    org.springframework.transaction: DEBUG
    org.springframework.jdbc: DEBUG
    org.apache.dubbo: DEBUG
    org.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: false
  registry:
    address: nacos://${spring.cloud.nacos.discovery.server-addr}
    namespace: ${spring.cloud.nacos.discovery.namespace}
  scan:
    base-packages: com.tgh
  consumer:
    payload: 20971520
    timeout: 600000
    check: false       # 启动时不强制检查服务可用性

ubuntu开放8848、9848、9849端口

bash 复制代码
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中加入

typescript 复制代码
      '/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机器上,可执行如下指令:

bash 复制代码
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的配置

服务提供方

yml 复制代码
  protocol:
    name: dubbo
    payload: 20971520  # 20MB
  provider:
    payload: 20971520
    timeout: 600000
    threads: 200       # 增大服务端线程池

服务调用方

yml 复制代码
  consumer:
    payload: 20971520
    timeout: 600000
    check: 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

相关推荐
工业互联网专业2 小时前
基于springboot+vue的医院门诊管理系统
java·vue.js·spring boot·毕业设计·源码·课程设计·医院门诊管理系统
九月TTS2 小时前
TTS-Web-Vue系列:Vue3实现内嵌iframe文档显示功能
前端·javascript·vue.js
我爱加班、、3 小时前
Chrome安装最新vue-devtool插件
javascript·vue.js·chrome·vue-devtool
澄江静如练_3 小时前
小程序 存存上下滑动的页面
前端·javascript·vue.js
源码方舟3 小时前
基于SpringBoot+Vue的房屋租赁管理系统源码包(完整版)开发实战
vue.js·spring boot·后端
m0_513962534 小时前
vue-ganttastic甘特图label标签横向滚动固定方法
javascript·vue.js·甘特图
菜鸟una4 小时前
【taro3 + vue3 + webpack4】在微信小程序中的请求封装及使用
前端·vue.js·微信小程序·小程序·typescript·taro
Java&Develop4 小时前
怎么查看当前vue项目,要求的node.js版本
vue.js
lichuangcsdn5 小时前
【springcloud学习(dalston.sr1)】使用Feign实现接口调用(八)
学习·spring·spring cloud