vlambda博客
学习文章列表

《gRPC 应用与原理概述》之核心对象及作用

服务端

Server

服务启动类,通过 启动服务,主要方法有:

1.server.start();启动服务

2.server.shutdown();关闭服务,进程退出


ServerBuilder

用来构造 Server 对象,主要方法有:

1.forPort()初始化服务端口,ServerBuilder.forPort(8081);

2.addService增加服务实现类,该类实现了 pb 定义的 base 类,是真正处理客户端请求的类,ServerBuilder.addService(myServiceBaseImpl);

3.builder,初始化服务,完整代码如下:

ServerBuilder.forPort(8081).addService(myServiceBaseImpl).builder();


客户端

gRPC Channel

一个 Channel 可以有 0 或多个真实连接

一个 channel 上可以传递多个请求,不会因为某个请求不返回而阻塞其他请求的发送,客户端发送后就会等待服务端的调用 onNext 方法回传数据

channel 中的指令是有序的,比如onNext多次,是按照 onNext 顺序执行。比如先 onNext,再 onCompleted,那么服务端也是先接受到 onNext指令,再接受到 onCompleted指令


ManagedChannelBuilder

用来构造 channel 对象:

ManagedChannelBuilder.forAddress(host,port).usePlaintext().build();


AbstractStub

代理对象,用来调用服务端方法,里面会真正使用 channel 对象的属性

支持阻塞,双向流式,客户端流式和服务端流式



StreamObserver

数据传输和接受的类,是服务端和客户端通信的流,类似于 jdk 的 InputStream 和 OutPutStream。主要方法有:

1.onNext,用于发送和接受数据

在流式传输中

如果客户端 onNext 会远程调用服务端的 onNext 方法,将数据传递过去

如果服务端 onNext 会远程调用客户端的 onNext 方法,将数据返回。指客户端流式和双向流式,如果是阻塞调用或者服务端端流式,该方法会将数据返回到客户端

2.onCompleted

如果客户端调用了 onCompleted,再调用 onNext 会报如下错误:

Exception in thread "main" java.lang.IllegalStateException: 

Stream is already completed, no further calls are allowed at com.google.common.base.Preconditions.checkState(Preconditions.java:511)


如果是阻塞模式调用,需要服务端主动调用 onCompleted,否则客户端会一直阻塞,直到收到 onCompleted 指令

3.onError

如果服务端关闭状态,发起请求。客户端的 onError 会被调用,可以看到异常信息为:

io.grpc.StatusRuntimeException: UNAVAILABLE: io exception Caused by: java.net.ConnectException: Connection refused

如果服务端调用onError 会调用到客户端的 onError

如果客户端调用onError 会被服务端调用(可能是拦截),然后再调用客户端的onError()


看起来比较枯燥,主要是对前面文章的整理,当然还有很多疑问没有解答。比如连接的生命周期到底是什么?onCompleted是否会关闭连接?等等