1.添加ProroBuf和grpc依赖
<!-- proto 与 Json 互转会用到-->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.21.7</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-api</artifactId>
<version>1.51.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.51.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.51.0</version>
<scope>compile</scope>
</dependency>
2.定义protobuf文件signaling_message.proto
syntax = "proto3";
package com.xxxx.common.proto;
option java_package = "com.xxxx.common.proto";
option java_outer_classname="ProtoBufUtil";
service SignalingService{
// 简单模式
rpc sendSms(SignalingMessage) returns (SignalingResponse);
}
message SignalingResponse{
int32 code = 1;
string message = 2;
bytes data = 3;
//消息ID
int64 messageid = 4;
}
message SignalingMessage {
//消息ID
int64 messageid = 1;
//消息类型
int32 cmd = 2;
//发送者
string from = 3;
//接收者
string to = 4;
//时间戳
int64 timestamp = 5;
//消息体
bytes body = 6;
}
生成protobuf类和 grpc类
下载并配置好protoc环境变量,下载protoc-gen-grpc-java,解压好,给protoc-gen-grpc-java.exe授予执行权限。
执行以下命令生成
protoc --plugin=protoc-gen-grpc-java=/Users/xxxxx/protoc-22.2/bin/protoc-gen-grpc-java.exe --grpc-java_out=./ signaling_message.proto
protoc --java_out=./ signaling_message.proto
3. 定义rpc server类
@GrpcService
@Slf4j
public class GrpcServerService extends SignalingServiceGrpc.SignalingServiceImplBase{
@Override
public void sendSms(com.xxxx.common.proto.ProtoBufUtil.SignalingMessage request,
io.grpc.stub.StreamObserver<com.xxxx.common.proto.ProtoBufUtil.SignalingResponse> responseObserver){
log.info("request = {}",request);
responseObserver.onNext(ProtoBufUtil.SignalingResponse.newBuilder().setCode(200).setMessage("success").build());
responseObserver.onCompleted();
}
}
4.发送RPC消息
@GrpcClient("local-grpc-server")
private SignalingServiceGrpc.SignalingServiceBlockingStub signalingStub;
ProtoBufUtil.SignalingMessage signalingMessage = ProtoBufUtil.SignalingMessage.newBuilder()
.setFrom(from)
.setTo(to)
.setBody(ByteString.copyFrom(body, Charset.forName("UTF-8")))
.build();
this.signalingStub.sendSms(signalingMessage);