博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Derek解读Bytom源码-Api Server接口服务
阅读量:6863 次
发布时间:2019-06-26

本文共 2776 字,大约阅读时间需要 9 分钟。

作者:Derek

简介

Github地址:

Gitee地址:

本章介绍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函数我们看到有三个操作:

  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))	// ...	}}复制代码

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已经处于等待接收用户的请求。

转载地址:http://jdeyl.baihongyu.com/

你可能感兴趣的文章
JS控制文本框输入的内容
查看>>
Tomcat7后台通过get接收数据处理乱码
查看>>
CI路径中如何去掉index.php
查看>>
精简ICO图标可减小EXE程序文件大小
查看>>
lstm caffe几个变量的含义
查看>>
博客园是不是应该取消反对按钮或者改进反对按钮
查看>>
重写equals()方法时,需要同时重写hashCode()方法
查看>>
Excel打印质量引起的异常及解决方案
查看>>
2.GET与POST的区别
查看>>
tyvj1172自然数拆分
查看>>
Makefile <网络转载>
查看>>
IO流的应用————小型资源管理器
查看>>
C++输入输出流格式控制(转)
查看>>
【C++】C++中的string类的用法总结
查看>>
new pc
查看>>
zabbix之 zabbix server 跟 agent 更换ip地址
查看>>
WebAPI 实现前后端分离的示例
查看>>
自控力极差的人如何自救?
查看>>
java中高级面试题整理及参考答案
查看>>
冯·若依曼体系结构
查看>>