grpc

gRPC是Google开源的一种高性能远程调用框架,它能高效地连接服务,支持负载均衡、跟踪、健康检查和身份验证,也能用于各移动端和浏览器对后端服务端连接。
它使用Protocol Buffers作为二进制序列化,使用HTTP/2进行数据传输。

grpc-demo-run

通过官网的demo,理解grpc的Server和Client
https://grpc.io/docs/languages/java/quickstart/
建议使用使用提供的gradlew命令,遇到问题请参考demo-run问题

code解析

1. sayHello

GreeterGrpc.GreeterImplBase中

1
2
3
4
5
6
@Override
public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}

2. 服务端

1
2
3
4
5
int port = 50051;
server = ServerBuilder.forPort(port)
.addService(new GreeterImpl())
.build()
.start();

3. 客户端

  1. 通过地址创建channel
    1
    2
    3
    ManagedChannel channel = ManagedChannelBuilder.forTarget("localhost:50051")
    // 使用明文避免需要证书
    .usePlaintext().build();
  2. 通过channel创建stub
    1
    HelloGrpc.HelloBlockingStub blockingStub = HelloGrpc.newBlockingStub(channel);
  3. 创建request并设置参数
    1
    2
    3
    HelloRequest request = HelloRequest.newBuilder().setName(name).build();
    4) 通过stub发送request
    HelloReply response response = blockingStub.sayHello(request);

遇到的问题

  1. 开始参考quick start跑demo的时候,maven提示找不到jar包,然后我果断切换到一个2021年的分支。但还是报找不到jar报, 在maven仓库中搜索了下确实找不到grpc-stub 1.33.2-SNAPSHOT,果断替换成1.33.1
  2. maven编译成功后,IDEA中始终会显示包没引用正确的报错标记。但其实这只是IDEA的显示问题,不影响run,前提是无法通过界面运行Client和Server的Main方法了。

    在IDEA显示问题上追究很浪费时间,别忘记要学习的内容
    这里需要一下mvn的知识:
    run server

    1
    mvn  -Dexec.mainClass=io.grpc.examples.helloworld.> > > HelloWorldServer exec:java

    run client

    1
    mvn -Dexec.mainClass=io.grpc.examples.helloworld.> HelloWorldClient exec:java
    1. 本来还很奇怪grpc官网连jdk7都可以支持,怎么mvn编译demo的>方式也不提供下。用过之后,只想说 [真香!] –> 安装使用gradle
    2. 注意生成的代码在targetbuild目录
      其他demo参考
      https://www.cnblogs.com/zhongyuanzhao000/p/13783165.html