成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Derek解讀Bytom源碼-Api Server接口服務(wù)

GitCafe / 2539人閱讀

摘要:首先讀取請求內(nèi)容,解析請求,接著匹配相應(yīng)的路由項(xiàng),隨后調(diào)用路由項(xiàng)的回調(diào)函數(shù)來處理。每一個(gè)路由項(xiàng)由請求方法和回調(diào)函數(shù)組成將監(jiān)聽地址作為參數(shù),最終執(zhí)行開始服務(wù)于外部請求創(chuàng)建對象首先,實(shí)例化對象。我們可以看到一條項(xiàng)由和對應(yīng)的回調(diào)函數(shù)組成。

作者:Derek

簡介

Github地址:https://github.com/Bytom/bytom

Gitee地址:https://gitee.com/BytomBlockc...

本章介紹bytom代碼Api-Server接口服務(wù)

作者使用MacOS操作系統(tǒng),其他平臺(tái)也大同小異

Golang Version: 1.8

Api-Server接口服務(wù)

Api Server是比原鏈中非常重要的一個(gè)功能,在比原鏈的架構(gòu)中專門服務(wù)于bytomcli和dashboard,他的功能是接收并處理用戶和礦池相關(guān)的請求。默認(rèn)啟動(dòng)9888端口??傊饕δ苋缦拢?/p>

接收并處理用戶或礦池發(fā)送的請求

管理交易:打包、簽名、提交等操作

管理本地比原錢包

管理本地p2p節(jié)點(diǎn)信息

管理本地礦工挖礦操作等

在Api Server服務(wù)過程中,在監(jiān)聽地址listener上接收bytomcli或dashboard的請求訪問。對每一個(gè)請求,Api Server均會(huì)創(chuàng)建一個(gè)新的goroutine來處理請求。首先Api Server讀取請求內(nèi)容,解析請求,接著匹配相應(yīng)的路由項(xiàng),隨后調(diào)用路由項(xiàng)的Handler回調(diào)函數(shù)來處理。最后Handler處理完請求之后給bytomcli響應(yīng)該請求。

Api-Server源碼分析

在bytomd啟動(dòng)過程中,bytomd使用golang標(biāo)準(zhǔn)庫http.NewServeMux()創(chuàng)建一個(gè)router路由器,提供請求的路由分發(fā)功能。創(chuàng)建Api Server主要有三部分組成:

初始化http.NewServeMux()得到mux

為mux.Handle添加多個(gè)有效的router路由項(xiàng)。每一個(gè)路由項(xiàng)由HTTP請求方法(GET、POST、PUT、DELET)、URL和Handler回調(diào)函數(shù)組成

將監(jiān)聽地址作為參數(shù),最終執(zhí)行Serve(listener)開始服務(wù)于外部請求

創(chuàng)建Api對象

node/node.go

func (n *Node) initAndstartApiServer() {
    n.api = api.NewAPI(n.syncManager, n.wallet, n.txfeed, n.cpuMiner, n.miningPool, n.chain, n.config, n.accessTokens)

    listenAddr := env.String("LISTEN", n.config.ApiAddress)
    env.Parse()
    n.api.StartServer(*listenAddr)
}

api/api.go

func NewAPI(sync *netsync.SyncManager, wallet *wallet.Wallet, txfeeds *txfeed.Tracker, cpuMiner *cpuminer.CPUMiner, miningPool *miningpool.MiningPool, chain *protocol.Chain, config *cfg.Config, token *accesstoken.CredentialStore) *API {
    api := &API{
        sync:          sync,
        wallet:        wallet,
        chain:         chain,
        accessTokens:  token,
        txFeedTracker: txfeeds,
        cpuMiner:      cpuMiner,
        miningPool:    miningPool,
    }
    api.buildHandler()
    api.initServer(config)

    return api
}

首先,實(shí)例化api對象。Api-server管理的事情很多,所以參數(shù)也相對較多。
listenAddr本地端口,如果系統(tǒng)沒有設(shè)置LISTEN變量則使用config.ApiAddress配置地址,默認(rèn)為9888

NewAPI函數(shù)我們看到有三個(gè)操作:

實(shí)例化api對象

api.buildHandler添加router路由項(xiàng)

api.initServer實(shí)例化http.Server,配置auth驗(yàn)證等

router路由項(xiàng)
func (a *API) buildHandler() {
    walletEnable := false
    m := http.NewServeMux()
    if a.wallet != nil {
        walletEnable = true

        m.Handle("/create-account", jsonHandler(a.createAccount))
        m.Handle("/list-accounts", jsonHandler(a.listAccounts))
        m.Handle("/delete-account", jsonHandler(a.deleteAccount))
    // ...
    }
}

router路由項(xiàng)過多。這里只介紹關(guān)于賬號(hào)相關(guān)的handler。其他的handler大同小異。

m.Handle("/create-account", jsonHandler(a.createAccount))

我們可以看到一條router項(xiàng)由url和對應(yīng)的handle回調(diào)函數(shù)組成。當(dāng)我們請求的url匹配到/create-account時(shí),Api-Server會(huì)執(zhí)行a.createAccount函數(shù),并將用戶的傳參也帶過去。

啟動(dòng)Api-Server服務(wù)

api/api.go

func (a *API) StartServer(address string) {
    log.WithField("api address:", address).Info("Rpc listen")
    listener, err := net.Listen("tcp", address)
    if err != nil {
        cmn.Exit(cmn.Fmt("Failed to register tcp port: %v", err))
    }

    go func() {
        if err := a.server.Serve(listener); err != nil {
            log.WithField("error", errors.Wrap(err, "Serve")).Error("Rpc server")
        }
    }()
}

通過golang標(biāo)準(zhǔn)庫net.listen方法,監(jiān)聽本地的地址端口。由于http服務(wù)是一個(gè)持久運(yùn)行的服務(wù),我們啟動(dòng)一個(gè)go程專門運(yùn)行http服務(wù)。當(dāng)運(yùn)行a.server.Serve沒有任何報(bào)錯(cuò)時(shí),我們可以看到服務(wù)器上啟動(dòng)的9888端口。此時(shí)Api-Server已經(jīng)處于等待接收用戶的請求。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24215.html

相關(guān)文章

  • Derek解讀Bytom源碼-持久化存儲(chǔ)LevelDB

    摘要:函數(shù)總共操作有兩步從緩存中查詢值,如果查到則返回如果為從緩存中查詢到則回調(diào)回調(diào)函數(shù)?;卣{(diào)函數(shù)會(huì)將從磁盤上獲得到塊信息存儲(chǔ)到緩存中并返回該塊的信息。回調(diào)函數(shù)實(shí)際上調(diào)取的是下的,它會(huì)從磁盤中獲取信息并返回。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc......

    Eminjannn 評(píng)論0 收藏0
  • Derek解讀Bytom源碼-啟動(dòng)與停止

    摘要:只有當(dāng)觸發(fā)了或才能終止進(jìn)程退出。退出時(shí)執(zhí)行如下操作會(huì)將挖礦功能停止,網(wǎng)絡(luò)停止等操作。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介紹bytom代碼啟動(dòng)、節(jié)點(diǎn)初始化、及停止的過程 作者使用MacOS操作系統(tǒng),其他平臺(tái)也大同小異Golang V...

    Godtoy 評(píng)論0 收藏0
  • Derek解讀Bytom源碼分析-持久化存儲(chǔ)LevelDB

    摘要:函數(shù)總共操作有兩步從緩存中查詢值,如果查到則返回如果為從緩存中查詢到則回調(diào)回調(diào)函數(shù)?;卣{(diào)函數(shù)會(huì)將從磁盤上獲得到塊信息存儲(chǔ)到緩存中并返回該塊的信息?;卣{(diào)函數(shù)實(shí)際上調(diào)取的是下的,它會(huì)從磁盤中獲取信息并返回。 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介紹Dere...

    GitChat 評(píng)論0 收藏0
  • Derek解讀Bytom源碼-P2P網(wǎng)絡(luò) upnp端口映射

    摘要:作者簡介地址地址本章介紹代碼網(wǎng)絡(luò)中端口映射作者使用操作系統(tǒng),其他平臺(tái)也大同小異介紹通用即插即用。端口映射將一個(gè)外部端口映射到一個(gè)內(nèi)網(wǎng)。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介紹bytom代碼P2P網(wǎng)絡(luò)中upnp端口映射 作者使用Mac...

    ranwu 評(píng)論0 收藏0
  • Derek解讀Bytom源碼-P2P網(wǎng)絡(luò) 地址簿

    摘要:作者簡介地址地址本章介紹代碼網(wǎng)絡(luò)中地址簿作者使用操作系統(tǒng),其他平臺(tái)也大同小異介紹用于存儲(chǔ)網(wǎng)絡(luò)中保留最近的對端節(jié)點(diǎn)地址在下,默認(rèn)的地址簿路徑存儲(chǔ)在地址簿格式地址類型在中存儲(chǔ)的地址有兩種標(biāo)識(shí)新地址,不可靠地址未成功連接過。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomB...

    Kahn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<