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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

RPC服务启动过程

發(fā)布時(shí)間:2024/3/26 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RPC服务启动过程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

啟動(dòng)rpc服務(wù)的過(guò)程:

第一步:node/node.go里的Start()方法里n.startRpc()方法實(shí)現(xiàn)開(kāi)啟各種endpoint的rpc服務(wù)。包括inProc和http的endpoint。

? 其中APIS方法實(shí)現(xiàn)了把所有rpc方法封裝成API對(duì)象數(shù)組。比如PublicTransactionPoolAPI對(duì)象里的GetBlockTransactionCountByNumber方法,最后通過(guò)server.go里的

RegisterName方法會(huì)映射成形如:callbacks[“getBlockTransactionCountByNumber”]= GetBlockTransactionCountByNumber.

// startRPC is a helper method to start all the various RPC endpoint during node// startup. It's not meant to be called at any time afterwards as it makes certain// assumptions about the state of the node.func (n *Node) startRPC() error {apiBackend := &APIBackend{n,nil,}gpoParams := api.DefaultGasOracleConfigapiBackend.SetGasOracle(api.NewOracle(apiBackend, gpoParams))apis := api.GetAPIs(apiBackend)err := n.startInProc(apis)if err != nil {return err}// if you want to use personal_newAccount、personal_unlockAccount ...,// you should add personal inferface into modules when process startHTTP.modules := []string{"eth", "personal"}cors := []string{""}vhosts := []string{"localhost"}endpoint := ""netaddr, err := dht.ToNetAddr(n.config.Api.RpcAddr)if err != nil {log.WithFields(log.Fields{"rpcAddr": n.config.Api.RpcAddr,"error": ? err,}).Error("failed to convert multiaddr to net addr")endpoint = "127.0.0.1:8545"} else {endpoint = netaddr.String()}err = n.startHTTP(endpoint, apis, modules, cors, vhosts, rpc.DefaultHTTPTimeouts)if err != nil {return err}return nil}

?

第二步:node/node.go里的n.stratHttp()方法里的rpc.StartHTTPEndpoint方法實(shí)現(xiàn)開(kāi)啟http服務(wù)。

listener, handler, err := rpc.StartHTTPEndpoint(endpoint, apis, modules, cors, vhosts, timeouts)

?

第三步;rpc/endpoints.go里的rpc.StartHTTPEndpoint方法里的Serve方法實(shí)現(xiàn)開(kāi)啟真正的http服務(wù)器。

// Register all the APIs exposed by the serviceshandler := NewServer()for _, api := range apis {if whitelist[api.Namespace] || (len(whitelist) == 0 && api.Public) {if err := handler.RegisterName(api.Namespace, api.Service); err != nil {return nil, nil, err}log.Debugf("HTTP registered, namespace: %v", api.Namespace)}}go NewHTTPServer(cors, vhosts, timeouts, handler).Serve(listener)

?這里的rpc/server.go里的handler.RegisterName方法,能實(shí)現(xiàn)把a(bǔ)pi.Service里包含的所有方法注冊(cè)到service對(duì)象去,包擴(kuò)callbacks等成員對(duì)象。

?

第四步:rpc/http.go的NeewHTTPServer方法將會(huì)新建一個(gè)Http.Server對(duì)象,

????// Wrap the CORS-handler within a host-handlerhandler := newCorsHandler(srv, cors)handler = newVHostHandler(vhosts, handler)return &http.Server{Handler:? ? ? handler,ReadTimeout:? timeouts.ReadTimeout,WriteTimeout: timeouts.WriteTimeout,IdleTimeout:? timeouts.IdleTimeout,}

Http的Server對(duì)象最核心的成員是handle接口

type Handler interface {

????ServeHTTP(ResponseWriter, *Request)

}

總結(jié)

以上是生活随笔為你收集整理的RPC服务启动过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。