资讯专栏INFORMATION COLUMN

Derek解读Bytom源码-Api Server接口服务

GitCafe / 2529人阅读

摘要:首先读取请求内容,解析请求,接着匹配相应的路由项,随后调用路由项的回调函数来处理。每一个路由项由请求方法和回调函数组成将监听地址作为参数,最终执行开始服务于外部请求创建对象首先,实例化对象。我们可以看到一条项由和对应的回调函数组成。

作者:Derek

简介

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

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

本章介绍bytom代码Api-Server接口服务

作者使用MacOS操作系统,其他平台也大同小异

Golang Version: 1.8

Api-Server接口服务

Api Server是比原链中非常重要的一个功能,在比原链的架构中专门服务于bytomcli和dashboard,他的功能是接收并处理用户和矿池相关的请求。默认启动9888端口。总之主要功能如下:

接收并处理用户或矿池发送的请求

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

管理本地比原钱包

管理本地p2p节点信息

管理本地矿工挖矿操作等

在Api Server服务过程中,在监听地址listener上接收bytomcli或dashboard的请求访问。对每一个请求,Api Server均会创建一个新的goroutine来处理请求。首先Api Server读取请求内容,解析请求,接着匹配相应的路由项,随后调用路由项的Handler回调函数来处理。最后Handler处理完请求之后给bytomcli响应该请求。

Api-Server源码分析

在bytomd启动过程中,bytomd使用golang标准库http.NewServeMux()创建一个router路由器,提供请求的路由分发功能。创建Api Server主要有三部分组成:

初始化http.NewServeMux()得到mux

为mux.Handle添加多个有效的router路由项。每一个路由项由HTTP请求方法(GET、POST、PUT、DELET)、URL和Handler回调函数组成

将监听地址作为参数,最终执行Serve(listener)开始服务于外部请求

创建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
}

首先,实例化api对象。Api-server管理的事情很多,所以参数也相对较多。
listenAddr本地端口,如果系统没有设置LISTEN变量则使用config.ApiAddress配置地址,默认为9888

NewAPI函数我们看到有三个操作:

实例化api对象

api.buildHandler添加router路由项

api.initServer实例化http.Server,配置auth验证等

router路由项
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路由项过多。这里只介绍关于账号相关的handler。其他的handler大同小异。

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

我们可以看到一条router项由url和对应的handle回调函数组成。当我们请求的url匹配到/create-account时,Api-Server会执行a.createAccount函数,并将用户的传参也带过去。

启动Api-Server服务

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标准库net.listen方法,监听本地的地址端口。由于http服务是一个持久运行的服务,我们启动一个go程专门运行http服务。当运行a.server.Serve没有任何报错时,我们可以看到服务器上启动的9888端口。此时Api-Server已经处于等待接收用户的请求。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24215.html

相关文章

  • Derek解读Bytom源码-持久化存储LevelDB

    摘要:函数总共操作有两步从缓存中查询值,如果查到则返回如果为从缓存中查询到则回调回调函数。回调函数会将从磁盘上获得到块信息存储到缓存中并返回该块的信息。回调函数实际上调取的是下的,它会从磁盘中获取信息并返回。 作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc......

    Eminjannn 评论0 收藏0
  • Derek解读Bytom源码-启动与停止

    摘要:只有当触发了或才能终止进程退出。退出时执行如下操作会将挖矿功能停止,网络停止等操作。 作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介绍bytom代码启动、节点初始化、及停止的过程 作者使用MacOS操作系统,其他平台也大同小异Golang V...

    Godtoy 评论0 收藏0
  • Derek解读Bytom源码分析-持久化存储LevelDB

    摘要:函数总共操作有两步从缓存中查询值,如果查到则返回如果为从缓存中查询到则回调回调函数。回调函数会将从磁盘上获得到块信息存储到缓存中并返回该块的信息。回调函数实际上调取的是下的,它会从磁盘中获取信息并返回。 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介绍Dere...

    GitChat 评论0 收藏0
  • Derek解读Bytom源码-P2P网络 upnp端口映射

    摘要:作者简介地址地址本章介绍代码网络中端口映射作者使用操作系统,其他平台也大同小异介绍通用即插即用。端口映射将一个外部端口映射到一个内网。 作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介绍bytom代码P2P网络中upnp端口映射 作者使用Mac...

    ranwu 评论0 收藏0
  • Derek解读Bytom源码-P2P网络 地址簿

    摘要:作者简介地址地址本章介绍代码网络中地址簿作者使用操作系统,其他平台也大同小异介绍用于存储网络中保留最近的对端节点地址在下,默认的地址簿路径存储在地址簿格式地址类型在中存储的地址有两种标识新地址,不可靠地址未成功连接过。 作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomB...

    Kahn 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<