使用 proto + maven 的 proto 插件
1. pom.xml
添加依赖:
1.8
1.24.0
io.grpc
grpc-netty
${grpc.version}
io.grpc
grpc-protobuf
${grpc.version}
io.grpc
grpc-stub
${grpc.version}
com.google.protobuf
protobuf-java
3.8.0
添加 protobuf-maven 插件:
org.xolstice.maven.plugins
protobuf-maven-plugin
0.5.0
com.google.protobuf:protoc:3.8.0:exe:windows-x86_64
grpc-java
io.grpc:protoc-gen-grpc-java:1.14.0:exe:windows-x86_64
compile
compile-custom
再 idea 的 maven 视图窗口 可以看到 protobuf的插件:
说明:
使用 protobuf:compile 完成 message 的 代码生成,使用 protobuf:compile-custom完成 service的代码生成
依赖 、插件 添加完之后,可以 写 proto文件了:
2. proto 文件, 再 main 文件夹下 新建 proto文件夹,并新建 .proto文件
示例中建的是 cal_grpc_service.proto
内容如下:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.wxj.grpctest.auto";
message RequestWxj {
string name = 1;
}
message ResponseWxj {
string message = 1;
}
service WxjHelloService {
rpc sayHello (RequestWxj) returns (ResponseWxj) {
}
}
3. 再 maven 视图的 protobuf插件,执行 protobuf:compile、protobuf:compile-custom, 会再 target文件夹下 生成相应的 Java代码
grpc-java 文件夹里是 service服务
java文件夹里是 message 实体类
4. 把生成的 Java文件 copy到 工程里,然后把 target 文件夹删除,maven的 protobuf插件注释掉,防止重复生成Java文件。
5. 再生成的 service 类中,有一个 抽象的内部类 需要 我们自己实现
public class HelloService extends WxjHelloServiceGrpc.WxjHelloServiceImplBase {
@Override
public void sayHello(RequestWxj request, StreamObserver responseObserver) {
// 第一个 参数 就是 客户端 请求时传入的
System.out.println("接收到请求:" + request.getName()); ;
// 设置 响应数据
ResponseWxj res = ResponseWxj.newBuilder().setMessage("收到请求了,放心吧!").build();
responseObserver.onNext(res);
responseObserver.onCompleted();
System.out.println("业务处理结束。");
}
}
6. 启动服务
@Service
public class ServiceStart {
@PostConstruct
public void init() throws Exception{
Server server = ServerBuilder.forPort(8090).addService(new HelloService()).build();
server.start();
System.out.println("grpc server start");
}
}
7 客户端代码
首先,客户端代码,也需要使用到 .proto 文件中定义的 message 和 service, 把 生成的Java代码 copy到 客户端项目中即可。
然后,再编写 客户端代码:
public class GrpcClient {
public static void main(String[] args) {
// 建立grpc连接
ManagedChannel channel = ManagedChannelBuilder
.forAddress("localhost", 8090)
.usePlaintext()
.build();
// 创建 客户端代理
WxjHelloServiceGrpc.WxjHelloServiceBlockingStub stub = WxjHelloServiceGrpc.newBlockingStub(channel);
// 创建 请求对象
RequestWxj req = RequestWxj.newBuilder().setName("0101").build();
// 发起 grpc 调用
ResponseWxj res = stub.sayHello(req);
System.out.println("client 收到了回复:" + res.getMessage());
// 关闭连接
channel.shutdownNow();
}
}
这样代码都写完了,可以启动服务测试:
服务端:
客户端:
以上就是 简单的 grpc示例代码。