grpc-java 初探
环境准备
- 下载protobuf
- 新建maven项目
使用protoc命令行生成类文件
安装protocbuf
安装步骤略
编译 protoc-gen-grpc-java插件
下载grpc-java后,执行一下命令
cd grpc-java/compile
# 编译插件
../gradlew java_pluginExecutable
# 测试插件
../gradlew test
若看到BUILD SUCCESSFUL字样,则编译成功
编辑proto文件
syntax = "proto3";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
# java_package 用来指定生成的java类所在的包,如果该proto文件被指定编译为其他语言时,java参数失效,默认包为package
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";
package helloworld;
# 定义服务
service Greeter {
# 定义grpc方法,并且制订消息的请求类型和反回类型
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
# 消息类型都是protocol buffer的消息格式
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
grpc可以有四种服务类型
1. 简单的rcp模式,client端使用stub发送请求到服务端,然后进入等待模式,直到响应发送回client端
rpc GetFeature(Point) returns (Feature) {}
2. 服务端流式rpc,client端发送请求到服务端,返回消息序列的流数据(gets a stream to read a sequence of messages back),client从返回的流数据读取消息,直至不再有数据,如果指定服务端返回流数据类型,需使用stream关键字
rpc ListFeatures(Rectangle) returns (stream Feature) {}
3. 客户端流式rpc,client使用指定的stream方式写消息序列并发送给服务端,一旦客户端写消息完成,会等待服务端全部读取并做出响应
rpc RecordRoute(stream Point) returns (RouteSummary) {}
4. 双向流式rpc,双向流式操作独立,客户端和服务端可以以任何序列随意读写,比如,服务端可以在等待client端发送所有消息之前写响应消息,或者服务端可以选择读一个消息写一个消息或者其他的读写组合。消息的顺序都是被保存的
rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
生成client端和server端代码
使用protocol编译器protoc和指定的grpc的一个java插件。
使用maven的protobuf插件生成相关代码
命令行:
protoc --java_out=./java/ ./proto/hello.proto
生成grpc通讯代码
protoc --plugin=protoc-gen-grpc-java=/Users/liuyu9/Documents/personal/golang/src/github.com/grpc-java/compiler/build/exe/java_plugin/protoc-gen-grpc-java --grpc-java_out=./java ./proto/hello.proto
文件列表如下:
# GreeterGrpc包含服务端和客户端要实现的一些基本类
-rw-r--r-- 1 root staff 7352 Oct 25 18:48 GreeterGrpc.java
# 包含了protocol buffer发送、序列化、反序列化我们请求和响应代码
-rw-r--r-- 1 root staff 16207 Oct 25 18:53 HelloReply.java
-rw-r--r-- 1 root staff 501 Oct 25 18:53 HelloReplyOrBuilder.java
-rw-r--r-- 1 root staff 16192 Oct 25 18:53 HelloRequest.java
-rw-r--r-- 1 root staff 493 Oct 25 18:53 HelloRequestOrBuilder.java
-rw-r--r-- 1 root staff 3011 Oct 25 18:53 HelloWorldProto.java
编写服务端文件
编写服务端文件的工作有两部分:
1. 重写proto文件定义的服务生成的服务基类,确定服务的工作内容
2. 运行grpc服务,监听客户端请求并做出响应
package com.weibo.dorteam.grpc;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import io.grpc.examples.helloworld.GreeterGrpc;
import io.grpc.examples.helloworld.