使用 proto + maven 的 proto 插件
1. pom.xml
添加依赖:
<properties>
<java.version>1.8</java.version>
<grpc.version>1.24.0</grpc.version>
</properties>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>${grpc.version}</version>
</dependency>
<!-- protobuf -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.8.0</version>
</dependency>
添加 protobuf-maven 插件:
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.8.0:exe:windows-x86_64</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.14.0:exe:windows-x86_64</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
再 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<ResponseWxj> 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示例代码。