使用go获取链上数据之主动拉取-搭建环境(一)
- 1、配置文件
- 1.1、新建配置文件
- 1.2、新建setting.go文件
- 1.3、新建config.go文件
- 2、全局变量配置
- 2.1、新建global.go
- 2.2、初始化配置
- 2.3、验证配置
在我们实际开发项目中,很多时候都需要从链上获取区块数据,将数据加工处理后存入到数据库中,本章开始,我们来学习一下如何从链上获取数据(主动拉取)并存储到数据库中
1、配置文件
首先我们新建go项目,然后在项目根目录新建目录:config、internal、global、pkg,完成后的项目看起来应该是这样的:
config目录主要存储配置文件、配置文件操作相关类
internal目录主要存储内部类,如model、dao、service等等
global目录主要存储全局类
pkg目录主要存储第三方类
1.1、新建配置文件
在config目录下新建文件 config.yml,填写如下信息:
Database:
DbType: mysql #数据库类型
DbName: go-chain-data #数据库名称
Host: #数据库链接,如 127.0.0.1:3306
Username: #用户名
Pwd: #数据库密码
Charset: utf8 #数据库编码
ParseTime: True
BlockChain:
RpcUrl: https://goerli.infura.io/v3/ # 区块链rpc地址 infura.io 可以获取
Database配置的是数据库链接信息,我们示例里使用的是mysql数据库
BlockChain配置的是区块链的rpc地址,如果没有可以访问infura.io申请
1.2、新建setting.go文件
首先在config目录下创建setting目录,然后在setting目录下新建setting.go文件,代码如下:
package setting
type DbConfig struct {
DbType string
DbName string
Host string
Username string
Pwd string
Charset string
ParseTime bool
}
type BlockChainConfig struct {
RpcUrl string
}
这里的结构与我们yml配置文件是一致的,后面我们会将yml配置读取到这些对象里
1.3、新建config.go文件
首先,在项目终端下执行如下命令安装viper包:
go get github.com/spf13/viper
然后,在config目下新建 config.go文件,代码如下:
package config
import (
"github.com/spf13/viper"
)
type Config struct {
vp *viper.Viper
}
func NewConfig() (*Config, error) {
vp := viper.New()
vp.SetConfigName("config")
vp.AddConfigPath("config")
vp.SetConfigType("yaml")
err := vp.ReadInConfig()
if err != nil {
return nil, err
}
return &Config{vp}, nil
}
func (config *Config) ReadSection(k string, v interface{}) error {
err := config.vp.UnmarshalKey(k, v)
if err != nil {
return err
}
return nil
}
NewConfig方法里我们创建了viper的实例对象,并读取了yml文件的配置信息
ReadSection方法可以通过给定的 k值 读取配置文件对应的 配置信息 并存到 v 变量里
2、全局变量配置
2.1、新建global.go
在global目录下新建global.go,代码如下:
package global
import (
"go-chain-data/config/setting"
)
var (
DbConfig *setting.DbConfig
BlockChainConfig *setting.BlockChainConfig
)
这里定义的变量,我们接下来会在各个类中进行调用
2.2、初始化配置
首先,在global.go文件里新建setupConfig()方法:
func setupConfig() {
conf, err := config.NewConfig()
if err != nil {
log.Panic("config2.NewConfig error : ", err)
}
err = conf.ReadSection("Database", &DbConfig)
if err != nil {
log.Panic("ReadSection - Database error : ", err)
}
err = conf.ReadSection("BlockChain", &BlockChainConfig)
if err != nil {
log.Panic("ReadSection - BlockChain error : ", err)
}
}
通过调用conf.ReadSection()方法,我们将yml里的配置读取到全局变量里,这样在其他的地方我们就可以通过global.DbConfig.X的方式进行调用
然后,在global.go文件里新建init()方法:
func init() {
setupConfig()
}
在init()方法里,我们调用setupConfig()方法,这个init()是go内置方法,默认会在调用类加载之前自动执行
2.3、验证配置
首先,在项目根目录新建main.go文件,记得把package改成main
然后,在main.go里新建main()方法,完整代码如下:
package main
import (
"go-chain-data/global"
"log"
)
func main() {
log.Println(global.BlockChainConfig.RpcUrl)
}
接下来我们运行main()方法,输出如下:
说明我们的配置已经能正确的写入到了全局变量,并可以在项目里进行读取
通过本章课程学习,我们搭建了项目的基础环境,并成功的完成了配置文件的读取操作,在下节课里我们将要进一步完善项目,让我们的项目可以访问数据库,没有学会的同学可以照着教程反复练习几遍,那么下节课见吧!
请关注公众号:外柏叁布道者(web3_preacher),回复 “go获取链上数据” 领取完整代码