日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gRPC源码分析2-Server的建立

發布時間:2024/4/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gRPC源码分析2-Server的建立 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

gRPC中,Server、Client共享的Class不是很多,所以我們可以單獨的分別講解Server和Client的源碼。

?

通過第一篇,我們知道對于gRPC來說,建立Server是非常簡單的,還記得怎么寫的?還是以example里 HelloWorldServer 例子來看

server = ServerBuilder.forPort(port)
.addService(new GreeterImpl())
.build()
.start();

?

你沒有看錯,就是這么幾行搞定。

?

如果需要看懂gRPC的源碼,首先有幾點需要明白

  • Builder模式生成Entity

  • Provider(SPI)模式解耦,動態選擇服務提供方

  • abstract class用于擴展

?

0. 流程圖

1. Builder

ServerBuilder是一個抽象類,不同的服務提供方(Provider),將繼承實現它。如何找到這些繼承者呢?ServerProvider就是用來找到不同的provider的。

?

2. Provider

?

如上圖,ServerProvider也是一個抽象類,實現者都有哪些呢?我們通過SPI模式找到他們。

?

通過搜索文件知道gRPC中 io.grpc.ServerProvider 的實現方只有:Netty

?

io.grpc.netty.NettyServerProvider,
這個類就是ServerProvider的實現者,它的builderForPort返回ServerBuilder

3. NettyServer

最后,我們來看下當鏈接建立時是如何創建handle的。

public void initChannel(Channel ch) throws Exception {eventLoopReferenceCounter.retain();ch.closeFuture().addListener(new ChannelFutureListener() {@Overridepublic void operationComplete(ChannelFuture future) {eventLoopReferenceCounter.release();}});NettyServerTransport transport = new NettyServerTransport(ch, protocolNegotiator,maxStreamsPerConnection, flowControlWindow, maxMessageSize, maxHeaderListSize);ServerTransportListener transportListener;// This is to order callbacks on the listener, not to guard access to channel.synchronized (NettyServer.this) {if (channel != null && !channel.isOpen()) {// Server already shutdown. ch.close();return;}transportListener = listener.transportCreated(transport);}transport.start(transportListener); }

看code可知,當一個鏈接建立時,會生成一個NettyServerTransport,所有的數據處理都將在這里實現。

?

4. NettyServerTransport

public void start(ServerTransportListener listener) {Preconditions.checkState(this.listener == null, "Handler already registered");this.listener = listener;// Create the Netty handler for the pipeline.final NettyServerHandler grpcHandler = createHandler(listener);HandlerSettings.setAutoWindow(grpcHandler);// Notify when the channel closes.channel.closeFuture().addListener(new ChannelFutureListener() {@Overridepublic void operationComplete(ChannelFuture future) throws Exception {notifyTerminated(grpcHandler.connectionError());}});ChannelHandler negotiationHandler = protocolNegotiator.newHandler(grpcHandler);channel.pipeline().addLast(negotiationHandler); }

我們看到當調用start方法是,最重要的就是createHandle,在這個方法里將看到如何綁定HTTP/2的處理器的。

?

5. NettyServerHandle

static NettyServerHandler newHandler(ServerTransportListener transportListener,int maxStreams,int flowControlWindow,int maxHeaderListSize,int maxMessageSize) {Preconditions.checkArgument(maxHeaderListSize > 0, "maxHeaderListSize must be positive");// 就是一個logHttp2FrameLogger frameLogger = new Http2FrameLogger(LogLevel.DEBUG, NettyServerHandler.class);Http2HeadersDecoder headersDecoder = new GrpcHttp2ServerHeadersDecoder(maxHeaderListSize);// readerHttp2FrameReader frameReader = new Http2InboundFrameLogger(new DefaultHttp2FrameReader(headersDecoder), frameLogger);// writerHttp2FrameWriter frameWriter =new Http2OutboundFrameLogger(new DefaultHttp2FrameWriter(), frameLogger);return newHandler(frameReader, frameWriter, transportListener, maxStreams, flowControlWindow,maxMessageSize); }@VisibleForTesting static NettyServerHandler newHandler(Http2FrameReader frameReader, Http2FrameWriter frameWriter,ServerTransportListener transportListener,int maxStreams,int flowControlWindow,int maxMessageSize) {Preconditions.checkArgument(maxStreams > 0, "maxStreams must be positive");Preconditions.checkArgument(flowControlWindow > 0, "flowControlWindow must be positive");Preconditions.checkArgument(maxMessageSize > 0, "maxMessageSize must be positive"); // 一個channel一個connectionHttp2Connection connection = new DefaultHttp2Connection(true);// Create the local flow controller configured to auto-refill the connection window. connection.local().flowController(new DefaultHttp2LocalFlowController(connection, DEFAULT_WINDOW_UPDATE_RATIO, true));Http2ConnectionEncoder encoder = new DefaultHttp2ConnectionEncoder(connection, frameWriter);Http2ConnectionDecoder decoder = new DefaultHttp2ConnectionDecoder(connection, encoder,frameReader);Http2Settings settings = new Http2Settings();settings.initialWindowSize(flowControlWindow);settings.maxConcurrentStreams(maxStreams);return new NettyServerHandler(transportListener, decoder, encoder, settings, maxMessageSize); }

?

轉載于:https://www.cnblogs.com/parse-code/p/6197992.html

總結

以上是生活随笔為你收集整理的gRPC源码分析2-Server的建立的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。