【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博客

相关推荐
侠客行03178 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪8 小时前
深入浅出LangChain4J
java·langchain·llm
较劲男子汉9 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
灰子学技术9 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
老毛肚9 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
wypywyp10 小时前
8. ubuntu 虚拟机 linux 服务器 TCP/IP 概念辨析
linux·服务器·ubuntu
风流倜傥唐伯虎10 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
Doro再努力10 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
senijusene10 小时前
Linux软件编程:IO编程,标准IO(1)
linux·运维·服务器
不像程序员的程序媛10 小时前
Nginx日志切分
服务器·前端·nginx