美文网首页区块链
Tendermint源码阅读(七)

Tendermint源码阅读(七)

作者: 印随2018 | 来源:发表于2018-09-25 18:37 被阅读126次
    关注点:tendermint RPC
    

    下图是tendermint应用的一个例子,这是从tendermint的github仓库中修改来的,我觉着这个图可以很明了的说明tendermint数据流。


    tendermint

    在上图中,tendermint在连接ABCI服务端的时候,扮演的是一个客户端;当JSON-RPC连接tendermint的时候扮演的是一个服务端的角色。今天我们重点关注红点部分。

    Tendermint 支持下面三种RPC协议:

    • URI over HTTP
    • JSONRPC over HTTP
    • JSONRPC over websockets

    同时,tendermint也提供了GRPC监听接口,下面是相关代码

    func (n *Node) startRPC() ([]net.Listener, error) {
        n.ConfigureRPC()
        listenAddrs := splitAndTrimEmpty(n.config.RPC.ListenAddress, ",", " ")
        coreCodec := amino.NewCodec()
        ctypes.RegisterAmino(coreCodec)
    
        if n.config.RPC.Unsafe {
            rpccore.AddUnsafeRoutes()
        }
    
        // we may expose the rpc over both a unix and tcp socket
        listeners := make([]net.Listener, len(listenAddrs))
        for i, listenAddr := range listenAddrs {
            mux := http.NewServeMux()
            rpcLogger := n.Logger.With("module", "rpc-server")
            wm := rpcserver.NewWebsocketManager(rpccore.Routes, coreCodec, rpcserver.EventSubscriber(n.eventBus))
            wm.SetLogger(rpcLogger.With("protocol", "websocket"))
            mux.HandleFunc("/websocket", wm.WebsocketHandler)
            rpcserver.RegisterRPCFuncs(mux, rpccore.Routes, coreCodec, rpcLogger)
            listener, err := rpcserver.StartHTTPServer(
                listenAddr,
                mux,
                rpcLogger,
                rpcserver.Config{MaxOpenConnections: n.config.RPC.MaxOpenConnections},
            )
            if err != nil {
                return nil, err
            }
            listeners[i] = listener
        }
    
        // we expose a simplified api over grpc for convenience to app devs
        grpcListenAddr := n.config.RPC.GRPCListenAddress
        if grpcListenAddr != "" {
            listener, err := grpccore.StartGRPCServer(
                grpcListenAddr,
                grpccore.Config{
                    MaxOpenConnections: n.config.RPC.GRPCMaxOpenConnections,
                },
            )
            if err != nil {
                return nil, err
            }
            listeners = append(listeners, listener)
        }
    
        return listeners, nil
    }
    

    从代码注释可以看出,目前gRPC接口只是用来方便开发者,并不带算实际生产中使用。

    相关文章

      网友评论

        本文标题:Tendermint源码阅读(七)

        本文链接:https://www.haomeiwen.com/subject/dimloftx.html