字段类型
double——>java:double
float——>java: float
int32——>java :int [使用可变长度编码。编码负数的效率低 - 如果你的字段可能有负值,请改用 sint32]
int64——>java: long [使用可变长度编码。编码负数的效率低 - 如果你的字段可能有负值,请改用 sint64]
uint32——> java:int [使用可变长度编码]
uint64——> java :int/long [使用可变长度编码]
sint32——> java:int [使用可变长度编码。有符号的 int 值。这些比常规 int32 对负数能更有效地编码]
sint64——> java:long [使用可变长度编码。有符号的 int 值。这些比常规 int64 对负数能更有效地编码]
fixed32——>java:int [总是四个字节。如果值通常大于 228,则比 uint32 更有效。]
fixed64——>java:long [总是八个字节。如果值通常大于 256,则比 uint64 更有效]
sfixed32 ——>java : int [总是四个字节]
sfixed64——>java:long [总是八个字节 ]
bool ——>java :boolean
string ——>java:String [字符串必须始终包含 UTF-8 编码或 7 位 ASCII 文本]
bytes——>java:ByteString [可以包含任意字节序列 ]
1.列表 - list
reapeat string str = 1;
2. map
map<string,string> userMap = 1;
3. 实体类型 --message
message User{
string name = 1;
string age = 2;
}
4. 泛型(泛型最终会对应的实体类型也要先在.proto中定义好 ) Any
/* 需要提前导入Any文件*/
import "google/protobuf/any.proto";
message User{
string name = 1;
string age = 2;
google.protobuf.Any data = 3;
}
<dependency>
<groupId>com.google.protobufgroupId>
<artifactId>protobuf-javaartifactId>
<version>3.4.0version>
dependency>
<dependency>
<groupId>io.grpcgroupId>
<artifactId>grpc-allartifactId>
<version>1.12.0version>
dependency>
<plugin>
<groupId>org.xolstice.maven.pluginsgroupId>
<artifactId>protobuf-maven-pluginartifactId>
<version>0.5.0version>
<configuration>
<protocArtifact>
com.google.protobuf:protoc:3.4.0:exe:${os.detected.classifier}
protocArtifact>
<pluginId>grpc-javapluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}pluginArtifact>
<protoSourceRoot>${project.basedir}/src/main/resources/static/protoprotoSourceRoot>
configuration>
<executions>
<execution>
<goals>
<goal>compilegoal>
<goal>compile-customgoal>
goals>
execution>
executions>
plugin>
syntax = "proto3";
import "google/protobuf/any.proto";
option java_multiple_files = true;
//生成的java
option java_package = "com.reagent.service";
option java_outer_classname = "MessageModel";
//生产带有抽象方法的java类
service SendMessage{
rpc sendMessageWithResult(Msg) returns (RequestResult){}
rpc sendMessage(Msg) returns (RequestResult){}
}
message Msg {
string topic = 1;
string tag = 2;
string msgbody = 3;
}
message RequestResult {
string resultCode = 1;
string resultMsg = 2;
google.protobuf.Any data = 3;
enum ResultCode{
RESULT_CODE_SUCCESS = 0;
RESULT_CODE_FAIL = 1;
}
}
message Data{
string msg = 1;
}
1. 实体java类
2. XXXGRpc
1. 实现类
通过继承XXXGRpc文件 的XXXImplBase抽象方法重写方法的实现类
@Override
public void sendMessageWithResult(Msg request, StreamObserver<RequestResult> responseObserver){
com.reagent.common.util.RequestResult result = producer
.sendMsgWithResult(
request.getTopic(),
request.getTag(),
request.getMsgbody());
// Data data = Data.newBuilder().setMsg("pretend to return result.getData()").build();
//封装返回的数据
RequestResult requestResult = RequestResult.newBuilder()
//.setData(Any.pack(data))
.setResultMsg(result.getResultMsg())
.setResultCode(result.getResultCode()+"")
.build();
responseObserver.onNext(requestResult);
responseObserver.onCompleted();
}
2.服务端
启动服务端,配置端口…
private Server server;
private void start() throws IOException {
server = ServerBuilder.forPort(port).addService(service).build();
server.start();
logger.info("Server has started, listening on " + port);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
GRpcServer.this.stop();
}
});
}
private void blockUntilShutdown() throws InterruptedException {
if (server != null) {
server.awaitTermination();
}
}
1. 客户端
配置服务端地址和端口
编写请求方法(接口) 通过builder封装实体,再通过XXXGRpc文件中的XXXBlockingStub来发送请求
// @Value("defaultHost")
// private String host = ;
// @Value("defaultPort")
// private int port;
private SendMessageGrpc.SendMessageBlockingStub sendMessageBlockingStub;
public GRpcClient(){
this(DEFAULT_HOST,DEFAULT_PORT);
}
public GRpcClient(String host, int port) {
this(ManagedChannelBuilder.forAddress(host,port).usePlaintext(true).build());
}
public GRpcClient(ManagedChannel managedChannel) {
this.managedChannel = managedChannel;
this.sendMessageBlockingStub = SendMessageGrpc.newBlockingStub(managedChannel);
}
public RequestResult sendMsgWithResult(String topic, String tag, String messageBody){
Msg msg = Msg.newBuilder()
.setTopic(topic)
.setTag(tag)
.setMsgbody(messageBody)
.build();
RequestResult result = sendMessageBlockingStub
.sendMessageWithResult(msg);
logger.warn("result: { resultCode: "
+result.getResultCode()
+", resultMsg: "+result.getResultMsg()
+", resultData: "+result.getData()+"}");
return result;
}
ingStub
.sendMessageWithResult(msg);
logger.warn("result: { resultCode: "
+result.getResultCode()
+", resultMsg: "+result.getResultMsg()
+", resultData: "+result.getData()+"}");
return result;
}