gRPC源码剖析-Server启动流程

创建一个gRPC Server代码很简单就这么两行,我们可以运行起来单步调试来学习一下gRPC Server启动流程。

Server server = ServerBuilder.forPort(50051)

               .addService(new OrderServiceImpl())

               .build()

               .start();

server.awaitTermination();

一、 .forPort 

绑定端口

gRPC源码剖析-Server启动流程_第1张图片

调用NettyServerBuilder构建InetSocketAddress对象,ServerProvider采用JDK SPI机制去加载Netty通讯模块。

SPI 全称Service Provider Interface是一种服务发现机制,它通过在ClassPath路径下提供的META-INF/services目录里查找文件,然后自动加载文件所定义的类,SPI的应用还是比较广泛的,比如加载JDBC驱动,另外业务层架构也有使用SPI机制的,比如淘宝早期交易中心系统,各业务方提供自己的交易扩展类,这样不会影响主交易流程。

二、.addService 

 绑定服务

gRPC源码剖析-Server启动流程_第2张图片

通过调用InternalHandlerRegistry的addService将OrderServiceImpl对象入加入内部一个HashMap里,key为类名全名,value是服务定义。

addMethod为方法绑定处理器(proto编译生成的OrderServiceGrpc对应的方法),这里会根据proto定义的方法类型调用对应的通信模式,asyncUnaryCall(一元RPC模式)、

asyncServerStreamingCall(服务器端流RPC模式)、asyncClientStreamingCall(客户端流RPC模式)、双向流模式。

三、.build 

构建Server实例

gRPC源码剖析-Server启动流程_第3张图片

通过buildTransportServer()构建NettyServer服务器,然后传入ServerImpl构建gRPC服务器。

注:低版本好像是会为每一个监听地址构建一个NettyServr,但grpc-netty1.7.1版本源代码只构建了一个NettyServer。待确认?

四、.start()  

启动gRPC NettyServer 开始HTTP2监听。 

gRPC源码剖析-Server启动流程_第4张图片

五、.awaitTermination()

synchronized (lock) {      while (!terminated) {        lock.wait();      }}

轮询关闭状态,如果没有关闭则使锁等待保持Server线程运行。

你可能感兴趣的:(Java技术,服务器,数据库,运维)