libreoffice-micro/README.md
2026-04-30 19:25:59 +08:00

6.8 KiB
Raw Permalink Blame History

libreofficeMicro

基于 Dubbo-Go (Triple 协议) 的 LibreOffice 文档转换微服务,提供 Office 文档docx/xlsx/pptx 等)转 PDF 的 RPC 能力。


目录结构

libreofficeMicro/
├── cmd/
│   ├── app.go                    # 服务入口
│   ├── service/
│   │   └── libreofficeService.go # Dubbo Provider 注册层
│   └── logic/
│       └── libreofficeLogic.go   # 业务逻辑(调用 LibreOffice CLI
├── pb/
│   ├── libreoffice.proto         # Protobuf 接口定义
│   └── libreoffice/              # 生成的 Go 代码
├── conf/
│   ├── local/                      # 联调环境配置
│   │   ├── dubbogo.yaml
│   │   └── conf.ini
│   ├── test/                     # 测试环境配置
│   └── k8s/                      # 生产环境配置
├── pkg/
│   ├── config/                   # 配置加载
│   └── logger/                   # Zap 日志
├── build/                        # 编译产物Linux amd64 静态二进制)
├── DockerfileForLocal            # 本地联调用 Dockerfile
├── DockerfileBase                # 基础镜像 Dockerfile
├── docker-entrypoint.sh          # 容器启动脚本(自动设置注册 IP
├── run-local.ps1                 # 本地一键编译 + 运行脚本
└── build-image.ps1               # 仅构建镜像脚本

服务接口

接口定义见 pb/libreoffice.proto,服务名为 com.fontree.microservices.common.libreoffice

RPC 方法 请求 响应 说明
ConvertToPdf 文件 URL + 文件名 PDF 二进制数据 服务端下载文件后转换,适合文件已在可访问 URL 上的场景
ConvertToPdfFromBytes 文件二进制数据 + 文件名 PDF 二进制数据 直接传字节流转换,调用方无需先上传文件,推荐使用

环境要求

  • Go 1.23+
  • Docker本地运行需要
  • ZooKeeper作为服务注册中心

容器运行时依赖基础镜像 registry.cn-hangzhou.aliyuncs.com/dorlolo_j/xjj/libreoffice:v1,该镜像已内置 LibreOffice。


配置说明

通过环境变量 MODE_ENV 选择配置目录:

MODE_ENV 配置目录 适用场景
local(默认) conf/local/ 本地联调
test conf/test/ 测试环境
prod conf/k8s/ 生产环境K8s

dubbogo.yaml 关键配置

dubbo:
  registries:
    demoZK:
      protocol: zookeeper
      address: zookeeper:2181   # ZooKeeper 地址
  protocols:
    triple:
      name: tri
      ip: 0.0.0.0
      port: 20119               # 服务监听端口
  provider:
    services:
      LibreofficeProvider:
        interface: com.fontree.microservices.common.libreoffice
        retries: 0

本地运行Docker

完整流程分三步:构建基础镜像 → 构建项目镜像 → 启动容器

第一步:构建基础镜像

基础镜像基于 Ubuntu 22.04,安装了 LibreOffice、中文字体文泉驿黑体/微米黑以及微软常用字体Calibri、Arial、Times New Roman 等),只需构建一次,后续迭代项目代码无需重复执行。

docker build -f DockerfileBase -t libreoffice-base:v1 .

注意

  • 构建时会通过 apt-get 安装 LibreOffice耗时较长5~15 分钟),请耐心等待。
  • 需要提前将 Shanghai 时区文件放到 conf/Shanghai(或确认该路径存在),否则构建报错。
  • 构建成功后可推送到私有镜像仓库,团队成员直接拉取,无需各自重新构建:
    docker tag libreoffice-base:v1 registry.cn-hangzhou.aliyuncs.com/dorlolo_j/xjj/libreoffice:v1
    docker push registry.cn-hangzhou.aliyuncs.com/dorlolo_j/xjj/libreoffice:v1
    

第二步:构建项目镜像

项目镜像基于第一步的基础镜像,将编译好的 Go 二进制与配置文件打包进去。执行:

.\build-image.ps1

脚本执行流程:

  1. 设置 GOPROXY 并执行 go mod tidy
  2. 交叉编译为 Linux amd64 静态二进制,输出到 ./build/app
  3. 使用 DockerfileForLocal 构建镜像 libreoffice-micro:v1

注意

  • 每次修改业务代码后,重新执行此脚本即可,无需重新构建基础镜像。

第三步:启动项目容器

.\run-local.ps1

脚本执行流程:

  1. 停止并删除同名旧容器(如存在)
  2. 重新编译并构建镜像(包含第二步的操作)
  3. 启动容器

容器启动参数说明:

参数 说明
--network microservicebaseenv_dockercompose_backend 与 ZooKeeper 等基础服务同网络,确保能连通注册中心
-p 20119:20119 宿主机端口映射 允许宿主机上运行的客户端通过 127.0.0.1:20119 访问
-e MODE_ENV local 使用 conf/local/ 联调环境配置
-e DUBBO_IP_TO_REGISTRY 127.0.0.1 向 ZooKeeper 注册宿主机回环地址,供宿主机客户端访问
--restart unless-stopped 宿主机重启后自动拉起容器

注意

  • DUBBO_IP_TO_REGISTRY=127.0.0.1 适用于客户端(如 performance-client在宿主机直接运行的场景。若客户端也在 Docker 容器内,去掉该变量,docker-entrypoint.sh 会自动将容器 IP 注册到 ZooKeeper。
  • 启动前确保 microservicebaseenv_dockercompose_backend 网络已存在(即基础环境的 docker-compose 已启动)。

查看运行日志:

docker logs -f libreoffice-micro

停止并删除容器:

docker stop libreoffice-micro && docker rm libreoffice-micro

重新生成 Protobuf 代码

cd pb
protoc libreoffice.proto --go_out=. --go-triple_out=useOldVersion=true:. libreoffice.proto

客户端接入Dubbo-Go 消费方)

在消费方的 dubbogo.yaml 中添加引用:

dubbo:
  consumer:
    references:
      LibreofficeServiceClientImpl:
        protocol: tri
        interface: com.fontree.microservices.common.libreoffice
        retries: 0

常见问题

Q: 容器内找不到 libreoffice 可执行文件?
A: 确认使用的是正确基础镜像。服务启动时会依次在 PATH/usr/bin/libreoffice/usr/lib/libreoffice/program/soffice/opt/libreoffice/program/soffice 中查找。

Q: 客户端连接超时(i/o timeout
A: 检查 ZooKeeper 中注册的服务 IP 是否可被客户端访问。若客户端在宿主机,启动容器时需设置 -e DUBBO_IP_TO_REGISTRY=127.0.0.1 并映射端口 -p 20119:20119

Q: 二进制文件在容器内运行报 Windows 相关错误?
A: 编译时必须设置 $env:GOOS="linux",不能使用 go env -w GOOS=linuxPowerShell 中后者对当前进程无效)。