《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是否会关闭连接?等等