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

简介: 作者:Derek 简介 https://github.com/Bytom/bytom 本章介绍bytom代码Api-Server接口服务 作者使用MacOS操作系统,其他平台也大同小异 Golang Version: 1.8 Api-Server接口服务 Api Server是比原链中非常重要的一个功能,在比原链的架构中专门服务于bytomcli和dashboard,他的功能是接收并处理用户和矿池相关的请求。

作者:Derek

简介

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

Gitee地址:https://gitee.com/BytomBlockchain/bytom

本章介绍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)
}
AI 代码解读

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
}
AI 代码解读

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

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

  1. 实例化api对象
  2. api.buildHandler添加router路由项
  3. 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))
    // ...
    }
}
AI 代码解读

router路由项过多。这里只介绍关于账号相关的handler。其他的handler大同小异。

m.Handle("/create-account", jsonHandler(a.createAccount))
AI 代码解读

我们可以看到一条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")
        }
    }()
}
AI 代码解读

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

目录
打赏
0
0
0
0
31
分享
相关文章
淘宝商品评论API接口,json数据示例参考
淘宝开放平台提供了多种API接口来获取商品评论数据,其中taobao.item.reviews.get是一个常用的接口,用于获取指定商品的评论信息。以下是关于该接口的详细介绍和使用方法:
1688API最新指南:商品详情接口接入与应用
本指南介绍1688商品详情接口的接入与应用,该接口可获取商品标题、价格、规格、库存等详细信息,适用于电商平台开发、数据分析等场景。接口通过商品唯一标识查询,支持HTTP GET/POST请求,返回JSON格式数据,助力开发者高效利用1688海量商品资源。
京东API接口最新指南:店铺所有商品接口的接入与使用
本文介绍京东店铺商品数据接口的应用与功能。通过该接口,商家可自动化获取店铺内所有商品的详细信息,包括基本信息、销售数据及库存状态等,为营销策略制定提供数据支持。此接口采用HTTP请求(GET/POST),需携带店铺ID和授权令牌等参数,返回JSON格式数据,便于解析处理。这对于电商运营、数据分析及竞品研究具有重要价值。
1688商品数据实战:API搜索接口开发与供应链分析应用
本文详细介绍了如何通过1688开放API实现商品数据的获取与应用,涵盖接入准备、签名流程、数据解析存储及商业化场景。开发者可完成智能选品、价格监控和供应商评级等功能,同时提供代码示例与问题解决方案,确保法律合规与数据安全。适合企业开发者快速构建供应链管理系统。
1688 买家订单,订单物流,订单回传接口系列(1688 寻源通 API)
1688寻源通API为开发者提供买家订单、订单物流及订单回传三大接口,助力企业实现订单管理、物流跟踪与信息反馈的自动化。买家订单接口可查询订单详情;订单物流接口支持实时跟踪物流状态;订单回传接口确保企业系统与平台数据同步。结合Python示例代码,企业可轻松集成这些功能,优化内部管理、提升客户体验并支持数据驱动决策。适用于电商订单管理、物流服务和数据分析等场景。
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
GitHub MCP Server是基于Model Context Protocol的服务器工具,提供与GitHub API的无缝集成,支持自动化处理问题、Pull Request和仓库管理等功能。
714 2
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
OpenRouter 推出百万 token 上下文 AI 模型!Quasar Alpha:提供完全免费的 API 服务,同时支持联网搜索和多模态交互
Quasar Alpha 是 OpenRouter 推出的预发布 AI 模型,具备百万级 token 上下文处理能力,在代码生成、指令遵循和低延迟响应方面表现卓越,同时支持联网搜索和多模态交互。
252 1
OpenRouter 推出百万 token 上下文 AI 模型!Quasar Alpha:提供完全免费的 API 服务,同时支持联网搜索和多模态交互
京东API最新指南:商品视频接口接入与应用
在电商领域,商品视频能有效提升销售业绩。京东商品视频接口助力开发者获取商品视频信息(播放链接、时长、格式、封面图等),通过 HTTP GET/POST 请求返回 JSON 数据,便于集成到各类应用中,优化展示效果与用户体验。本指南详解接口接入与使用方法。
构建智能 API 开发环境:在 Cursor 中连接 Apifox MCP Server
本文介绍了如何将Apifox MCP Server与Cursor结合,通过AI直接获取和理解API文档,大幅提升开发效率。首先需配置Apifox的Access Token和项目ID,并在Cursor中设置MCP连接。实际应用场景包括快速生成模型代码、同步更新接口文档与代码、生成CRUD操作、搜索API文档及自动生成测试用例。此外,还提供了管理多项目、安全性实践和优化AI响应质量的技巧。这种组合可显著减少从API规范到代码实现的时间,降低错误率并加速迭代过程,为开发者带来更高效的体验。
单页图床HTML源码+本地API接口图床系统源码
图床系统是一种用于存储和管理图片文件的在线服务。它允许用户上传图片文件,并生成相应的图片链接,从而方便用户在网页、社交媒体或其他平台上分享图片。
162 2
单页图床HTML源码+本地API接口图床系统源码

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问