Tendermint源码阅读(七)

关注点:tendermint RPC

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


Tendermint源码阅读(七)_第1张图片
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源码阅读(七))