镇江建设网站的公司,织梦网站做站群,iis网站权限配置,国内优秀网页设计网站在做go和Java之间gRPC调用之前需要完成以下两项工作#xff1a;
go语言版本的gRPC调用#xff0c;实现server端和client端Java语言版本的gRPC调用#xff0c;实现server端和client端
由于gRPC是跨语言的通信协议#xff0c;所以我们可以相互调用#xff0c;有以下2种调用…在做go和Java之间gRPC调用之前需要完成以下两项工作
go语言版本的gRPC调用实现server端和client端Java语言版本的gRPC调用实现server端和client端
由于gRPC是跨语言的通信协议所以我们可以相互调用有以下2种调用方式
go程序作为server端Java程序作为client端Java程序作为server端go程序作为client端
还是拿之前写的一个student.proto文件为例
step1.student.proto文件定义
syntaxproto3;
option go_package./;student; //关于最后生成的go文件是处在哪个目录哪个包中.代表在当前目录生成student代表了生成的go文件的包名是studentoption 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.接口调用测试
选择以下两种方式都可以测试
go程序作为server端Java程序作为client端Java程序作为server端go程序作为client端
根据接口定义调用Sender方法时发现一个问题
UNIMPLEMENTED: unknown service student.DemoService
经过排查发现go程序里的student.proto没有定义package 而Java程序里的student.proto有package定义。修改保持student.proto文件一致即我文章开始贴的proto文件即可测试通过。
测试过程简单描述如下 go程序作为server端Java程序作为client端 启动go rpc server运行Java rpc client 调用Sender接口测试 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文件里定义常量如下
const (DemoService_Sender_FullMethodName /student.DemoService/Sender
)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博客