与 Java 互操作
JNI、gRPC 跨语言;微服务分工。
25 分钟
与 Java 互操作
Polyglot 不是「一个 repo 里混写五种 main」,而是 边界清晰的多进程协作。Java 服务仍是 CodeRoadMap backend 与 spring-cloud-essentials 的主轴;Go/Rust/Python 等通过 HTTP、消息、gRPC、JNI/FFI 接入。本节讲 怎么连、连哪里、别踩坑。
学习目标
- 区分进程间(微服务)与进程内(JNI/FFI)互操作
- 理解 gRPC + Protobuf 作为跨语言契约的首选理由
- 设计微服务语言边界时的职责划分
进程间:首选 HTTP 与 gRPC
| 方式 | 优点 | 缺点 |
|---|---|---|
| REST + JSON | 人类可读、调试易 | schema 松散、性能一般 |
| gRPC + Protobuf | 强类型、多语言 codegen、HTTP/2 | 浏览器需 grpc-web 网关 |
| 消息队列 | 解耦、削峰 | 最终一致、运维复杂 |
本站 grpc-essentials 从 grpc-proto 到 grpc-spring:一份 .proto,Java/Go/Python 各生成 stub。
service TrackService {
rpc GetTrack(GetTrackRequest) returns (Track);
}
Java 侧 BindableService;Go 侧 grpc.Server;业务 DTO 不再手抄三套。
进程内:JNI 与 FFI(慎用)
- JNI:Java 调 C/C++ 库;Rust 可通过
cdylib+ JNI 暴露 - Panama / FFM(Java 22+):替代部分 JNI 样板
- 适用:加密、编解码、遗留 native SDK
- 风险:崩溃在 native 层 拖垮整个 JVM;部署要配齐
.so/.dll
默认选微服务 + gRPC,除非延迟要求 μs 级且团队能维护 native。
与 Node、Python、PHP 的衔接
- BFF:nodejs-essentials 聚合 Java API 给前端
- AI/批处理:python-fundamentals 推理服务,Java 调 REST/gRPC
- 遗留 CMS:php-essentials 只暴露 HTTP,Java 不直连 PHP 内存
微服务语言分工示例
┌─────────────┐ gRPC ┌──────────────┐
│ Java 订单域 │ ◄──────────► │ Go 读模型/cache │
│ Spring Boot │ │ 高 QPS 查询 │
└─────────────┘ └──────────────┘
│ HTTP
▼
┌─────────────┐
│ Python 推荐 │ 训练离线,在线 gRPC
└─────────────┘