创建一个gRPC Server代码很简单就这么两行,我们可以运行起来单步调试来学习一下gRPC Server启动流程。
Server server = ServerBuilder.forPort(50051)
.addService(new OrderServiceImpl())
.build()
.start();
server.awaitTermination();
一、 .forPort
绑定端口
调用NettyServerBuilder构建InetSocketAddress对象,ServerProvider采用JDK SPI机制去加载Netty通讯模块。
SPI 全称Service Provider Interface是一种服务发现机制,它通过在ClassPath路径下提供的META-INF/services目录里查找文件,然后自动加载文件所定义的类,SPI的应用还是比较广泛的,比如加载JDBC驱动,另外业务层架构也有使用SPI机制的,比如淘宝早期交易中心系统,各业务方提供自己的交易扩展类,这样不会影响主交易流程。
二、.addService
绑定服务
通过调用InternalHandlerRegistry的addService将OrderServiceImpl对象入加入内部一个HashMap里,key为类名全名,value是服务定义。
addMethod为方法绑定处理器(proto编译生成的OrderServiceGrpc对应的方法),这里会根据proto定义的方法类型调用对应的通信模式,asyncUnaryCall(一元RPC模式)、
asyncServerStreamingCall(服务器端流RPC模式)、asyncClientStreamingCall(客户端流RPC模式)、双向流模式。
三、.build
构建Server实例
通过buildTransportServer()构建NettyServer服务器,然后传入ServerImpl构建gRPC服务器。
注:低版本好像是会为每一个监听地址构建一个NettyServr,但grpc-netty1.7.1版本源代码只构建了一个NettyServer。待确认?
四、.start()
启动gRPC NettyServer 开始HTTP2监听。
文章来源:https://www.toymoban.com/news/detail-727345.html
五、.awaitTermination()
synchronized (lock) {
while (!terminated) {
lock.wait();
}
}
轮询关闭状态,如果没有关闭则使锁等待保持Server线程运行。文章来源地址https://www.toymoban.com/news/detail-727345.html
到了这里,关于gRPC源码剖析-Server启动流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!