GRPC的JAVA使用介绍

1.创建maven项目并且添加依赖
将下面的依赖添加到pom文件中,GRPC一共依赖四个jar包。

io.grpc grpc-netty-shaded 1.24.0 io.grpc grpc-protobuf 1.24.0 io.grpc grpc-stub 1.24.0 com.google.protobuf protobuf-java 3.8.0 #以及build org.xolstice.maven.plugins protobuf-maven-plugin 0.6.1 com.google.protobuf:protoc:3.10.0:exe:${os.detected.classifier}grpc-javaio.grpc:protoc-gen-grpc-java:1.24.0:exe:${os.detected.classifier} compile compile-custom kr.motd.maven os-maven-plugin 1.6.2

2. 创建proto文件,并且生成对应的java文件GRPC的JAVA使用介绍
文章图片

创建对应的proto目录,并且生成user.proto文件
syntax = "proto3"; option java_package = "com.jiangpeipei.net.grpc"; service user { rpc login (LoginRequest) returns (APIResponse); rpc logout (Empty) returns (APIResponse); }message LoginRequest { string username = 1; string password = 2; }message APIResponse { string message = 1; int32 code = 2; } message Empty { }

【GRPC的JAVA使用介绍】代码完成后执行,mvn clean compile 执行成功后会在
target/generaten-sources/protobuf/grpc-java 和 target/generaten-sources/protobuf/java 目录下生成对应的java文件

3. 创建一个GRPC的服务
/** * 接受请求 -> 处理 ->返回响应 */ public class User extends userGrpc.userImplBase {@Override public void login(LoginRequest request, StreamObserver responseObserver) { //获取请求中的参数 String username = request.getUsername(); String password = request.getPassword(); APIResponse.Builder builder = APIResponse.newBuilder(); //简单地逻辑处理 if (username.equals(password)) { builder.setCode(200); builder.setMessage("SUCCESS"); } else { builder.setCode(500); builder.setMessage("LOGIN FAIL"); } //响应信息 responseObserver.onNext(builder.build()); //完成后关闭通讯 responseObserver.onCompleted(); }@Override public void logout(Empty request, StreamObserver responseObserver) {}}

4. 启动GRPC服务
public class GRPCServer {public static void main(String[] args) throws IOException, InterruptedException {Server server = ServerBuilder.forPort(9090).addService(new User()).build(); server.start(); server.awaitTermination(); } }

5. 创建一个client 与GRPC通讯
public class GRPCClient {public static void main(String[] args) { ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 9090).usePlaintext().build(); // stubs - generate from proto //阻塞 userGrpc.userBlockingStub stub = userGrpc.newBlockingStub(channel); User.LoginRequest loginRequest = User.LoginRequest.newBuilder().setPassword("jpp").setUsername("jpp").build(); //异步 //userGrpc.newFutureStub(); //异步 //userGrpc.newStub(); User.APIResponse apiResponse = stub.login(loginRequest); System.out.println(apiResponse.getMessage()); } }

6. 测试
a. 启动server端 b. 启动client端,打印SUCCESS 表示测试成功

7. 注意事项
如果有引用guava,版本升级到23.0版本以上

    推荐阅读