【Go<—>Java】gRPC测试注意事项

在做go和Java之间gRPC调用之前需要完成以下两项工作:

  1. go语言版本的gRPC调用,实现server端和client端
  2. Java语言版本的gRPC调用,实现server端和client端

由于gRPC是跨语言的通信协议,所以我们可以相互调用,有以下2种调用方式:

  1. go程序作为server端,Java程序作为client端
  2. Java程序作为server端,go程序作为client端

还是拿之前写的一个student.proto文件为例

step1.student.proto文件定义

复制代码
syntax="proto3";
option go_package="./;student"; //关于最后生成的go文件是处在哪个目录哪个包中,.代表在当前目录生成,student代表了生成的go文件的包名是student

option java_multiple_files = true; //表示下面的message需要编译成多个java文件
option java_package = "grpc.student"; //指定该proto文件编译成的java源文件的包名
option java_outer_classname = "StudentProto"; // 表示下面的message编译成的java类文件的名字

package student; // 定义作用域

service DemoService {
  rpc Sender(StudentRequest) returns (StudentResponse){}
}

message StudentRequest {
  string Id = 1;
}

message StudentResponse {
  bytes result =1;
}

message Student {
  int64 Id = 1;
  string Name =2;
  string No =3;
}

step2.生成各自的代码程序

这里不详细写生成过程了,之前写了两篇文章可参考:

1.Java生成gRPC程序:【JAVA】Maven构建java-grpc-protobuf代码生成测试-CSDN博客

2.Go生成gRPC程序:【GO】protobuf在golang中的测试用例-CSDN博客

step3.接口调用测试

选择以下两种方式都可以测试

  1. go程序作为server端,Java程序作为client端
  2. Java程序作为server端,go程序作为client端

根据接口定义调用Sender方法时发现一个问题

UNIMPLEMENTED: unknown service student.DemoService

经过排查发现go程序里的student.proto没有定义package ,而Java程序里的student.proto有package定义。修改保持student.proto文件一致,即我文章开始贴的proto文件即可,测试通过。

测试过程简单描述如下:

  1. go程序作为server端,Java程序作为client端

启动go rpc server,运行Java rpc client 调用Sender接口测试

  1. Java程序作为server端,go程序作为client端

启动Java rpc server,运行go rpc client 调用Sender接口测试

通过查阅资料proto文件定义需要满足以下要求:

1.package 必须一致,package限制说明你所定义的接口属于那个作用域下的。

例如student.proto文件定义package student,也就是DemoService Sender接口属于student作用域下,如果go或者java或者其他语言定义的package不相同是无法相互调用的,就是报错类似:UNIMPLEMENTED: unknown service student.DemoService

复制代码
package student; // 定义作用域

生成go程序和Java程序会发现程序里有所对应代码指定

go程序:student_grpc.pb.go文件里定义常量如下

Go 复制代码
const (
	DemoService_Sender_FullMethodName = "/student.DemoService/Sender"
)

Java程序:

java 复制代码
public class DemoServiceGrpc {

  private DemoServiceGrpc() {}

  public static final String SERVICE_NAME = "student.DemoService";

  .....

}

2.接口名称和方法名称定义签名必须一致,需要维护一套proto文件即可解决此类问题。

3.proto文件编写注意事项,可参考

protobuf一些注意事项_proto packed = true-CSDN博客

.proto 文件中 import 其他 .proto 文件时的注意事项_proto可以import远程proto-CSDN博客

相关推荐
极客先躯38 分钟前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
FellAveal43 分钟前
【Go语言入门学习笔记】Part18.工作池与WaitGroup(也即协程池)
笔记·学习·golang
xqqxqxxq1 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记
wang09071 小时前
自己动手写一个spring之aop_1
java·后端·spring
国科安芯2 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
deng12042 小时前
【Thread类的用法(1)-- Thread类的基本用法】
java·java-ee
三言老师3 小时前
CentOS7.9:Redis‑Cluster集群部署结构化实战教程
linux·运维·服务器·数据库
suconnect3 小时前
Spring Boot接入企业RAG:文档切分、向量检索、权限过滤和答案溯源
java·spring boot·后端
weixin_BYSJ19873 小时前
springboot校园自习室管理小程序---附源码32142
java·javascript·spring boot·python·django·flask·php
ClickHouseDB3 小时前
ClickHouse托管Postgres:OLTP+OLAP,新能力解锁最佳数据平台
java·前端·数据库