6.8 KiB
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
脚本执行流程:
- 设置
GOPROXY并执行go mod tidy - 交叉编译为 Linux amd64 静态二进制,输出到
./build/app - 使用
DockerfileForLocal构建镜像libreoffice-micro:v1
注意:
- 每次修改业务代码后,重新执行此脚本即可,无需重新构建基础镜像。
第三步:启动项目容器
.\run-local.ps1
脚本执行流程:
- 停止并删除同名旧容器(如存在)
- 重新编译并构建镜像(包含第二步的操作)
- 启动容器
容器启动参数说明:
| 参数 | 值 | 说明 |
|---|---|---|
--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=linux(PowerShell 中后者对当前进程无效)。