概述
本文将会介绍两部分内容:
1、window 7 上搭建grpc环境;
2、构建关于grpc的java小demo.
下载grpc java依赖包
为了能生成针对java的grpc客户端和服务端代码(官方叫stub),需要下载一些java包和grpc编译器以及一些gradle 插件
java依赖包
compile ‘io.grpc:grpc-netty:1.4.0’
compile ‘io.grpc:grpc-protobuf:1.4.0’
compile ‘io.grpc:grpc-stub:1.4.0’
gradle构建脚本
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.1'
}
}
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.2.0"
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.4.0'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
}
}
使用gradle命令
gradle clean build
由于要下载很多依赖包,时间会比较长.
备注
最好使用gradle 3来构建,gradle 2太旧了
编写proto文件
src/main/proto/grpc/firstdemo/Student.proto
syntax = "proto3";
package firstdemo;
option optimize_for=SPEED;
option java_package="firstdemo";
option java_outer_classname="StudentProto";
option java_multiple_files=true;
service StudentService {
rpc getRealname(RequestInfo) returns (ResponseInfo) {}
}
message RequestInfo {
string username = 1;
}
message ResponseInfo {
string realname = 1;
}
注意这里需要使用proto3
syntax = “proto3”;
生成gprc java stub类
先执行
gradle clean build
再执行
gradle generateProto
执行成功后,会生成如下目录
grpc
java
将两个目录下的java文件拷贝到
src/main/proto/grpc/firstdemo/generated
拷贝完后src/main/proto/grpc/firstdemo/generated目录下会有如下文件
RequestInfo.java
ResponseInfo.java
ResponseInfoOrBuilder.java
StudentProto.java
StudentServiceGrpc.java
备注
集成grpc后,不能再使用之前的proto2的protoc编译命令了,这个命令只是会生成用于传递的消息对象,并不会生成客户端好服务端的stub类
编写业务实现类
package grpc.firstdemo.server;
import grpc.firstdemo.generated.RequestInfo;
import grpc.firstdemo.generated.ResponseInfo;
import grpc.firstdemo.generated.StudentServiceGrpc.StudentServiceImplBase;
import io.grpc.stub.StreamObserver;
public class StudentBizService extends StudentServiceImplBase{
@Override
public void getRealname(RequestInfo request, StreamObserver<ResponseInfo> responseObserver) {
System.out.println("接收到客户端的信息:"+request.getUsername());
ResponseInfo responseInfo = ResponseInfo.newBuilder().setRealname("Sam").build();
responseObserver.onNext(responseInfo);
responseObserver.onCompleted();
}
}
需要继承StudentServiceImplBase类,覆盖getRealname方法.
服务端代码
package grpc.firstdemo.server;
import java.io.IOException;
import io.grpc.Server;
import io.grpc.ServerBuilder;
public class GrpcServer {
private Server server;
private void start() throws IOException {
this.server = ServerBuilder.forPort(8899)
.addService(new StudentBizService())
.build().start();
System.out.println("server started");
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
GrpcServer.this.stop();
}
}));
}
private void stop() {
if (this.server != null) {
this.server.shutdown();
}
}
private void awaitTermination() throws InterruptedException {
if (this.server != null) {
this.server.awaitTermination();
}
}
public static void main(String[] args) throws IOException, InterruptedException {
GrpcServer grpcServer = new GrpcServer();
grpcServer.start();
//让grpc server启动后,处于等待状态,监听客户端请求
grpcServer.awaitTermination();
}
}
客户端代码
package grpc.firstdemo.client;
import grpc.firstdemo.generated.RequestInfo;
import grpc.firstdemo.generated.ResponseInfo;
import grpc.firstdemo.generated.StudentServiceGrpc;
import grpc.firstdemo.generated.StudentServiceGrpc.StudentServiceBlockingStub;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
public class GrpcClient {
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8899)
.usePlaintext(true)
.build();
StudentServiceBlockingStub blockStub = StudentServiceGrpc.newBlockingStub(channel);
ResponseInfo responseInfo = blockStub.getRealname(RequestInfo.newBuilder().setUsername("sam").build());
System.out.println(responseInfo.getRealname());
}
}
运行代码
分别运行GrpcServer类和GrpcClient类的main方法,启动服务端和客户端,正常情况下会打印如下日志:
接收到客户端的信息:sam
csdn code 路径
这个项目的源代码放置在csdn code上,欢迎访问。
netty_study