Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | http://vearne.cc

1.前言

写了一个非常简单的p2p文件分发系统
主要目的是验证p2p下载的主要思想,所以并不是完全按照BT的公开协议来实现的,已经经过了初步的测试,但并没有在生产环境,进行大规模的使用,因此请谨慎的使用。

传送门
vearne/p2p-sharer

2.组件

2.1 制作种子文件

./p2p-sharer gen --tracker 192.168.10.200:35330 --filePath /tmp/Motrix-1.4.1.dmg --seedPath ./

tracker tracker 地址
filePath 待分发的文件路径
seedPath 生成的种子文件的存放路径

种子文件示例

{
    "fileName": "Motrix-1.4.1.dmg",
    "trackerAddr": "192.168.10.200:35330",
    "length": 66112269,
    "pieces": [{
        "index": 0,
        "length": 1048576,
        "checksum": "92465aae88444d799891ad730877f0f8593f77be"
    }, {
        "index": 1,
        "length": 1048576,
        "checksum": "7dae558c74d72d67d65533cdcecbf5f6ff5bcce1"
    },
               ...
    ]
}

2.2 tracker

接口文档
1. 保存(供其他node查询)文件分片在整个集群的分布情况
2. 维护node的上下线情况(通过心跳)

2.3 node

接口文档
1. 接收并执行下载任务
2. 与其它node共享文件分片

3. 使用

git clone git@github.com:vearne/p2p-sharer.git

3.1 build

3.1.1 mac
env GOOS=darwin GOARCH=amd64 go build ./
3.1.2 linux
env GOOS=linux GOARCH=amd64 go build ./

3.2 配置文件

请将配置文件放置在

./config/

/etc/p2p-sharer/

3.3 启动

3.3.1 启动tracker
./p2p-sharer tracker

对应配置文件 config.tracker.yaml

3.3.2 启动node
./p2p-sharer node

对应配置文件 config.node.yaml

4. 完整的测试流程

假定tracker地址为
192.168.10.200:35330
node地址为

192.168.10.201:35331
192.168.10.202:35331
192.168.10.203:35331

在任何一个p2p文件分发过程中,首先需要有一个源,它拥有完整的文件(待分发的文件)

1) 针对要分发的文件制作种子文件

./p2p-sharer gen --tracker 192.168.10.200:35330 --filePath /tmp/Motrix-1.4.1.dmg --seedPath ./

会得到种子文件
Motrix-1.4.1.dmg.seed
2) 将
Motrix-1.4.1.dmg.seed (种子文件)
Motrix-1.4.1.dmg (待分发的文件)
放置到192.168.10.201的下载目录(默认为/tmp)
在/tmp 中创建一个空文件

touch /tmp/Motrix-1.4.1.dmg.ok

这个文件的目的是为了标识Motrix-1.4.1.dmg是完整的

3) 重启192.168.10.201上的node服务
这时候node启动时,会扫描自己的下载文件路径,当发现
Motrix-1.4.1.dmg、Motrix-1.4.1.dmg.seed、Motrix-1.4.1.dmg.ok

它认为完整的拥有Motrix-1.4.1.dmg
会主动将该文件的分片信息发送给tracker
此时可以调用
查看tracker拥有的全局文件分片信息

http://192.168.10.200:35330/v1/probe

查看node拥有的文件分片信息

http://192.168.10.201:35331/v1/probe

4) 提交文件下载任务

curl -XPOST -d'{
    "seedFile": "http://192.168.10.199/download/Motrix-1.4.1.dmg.seed"
}' http://192.168.10.202:35331/v1/task
curl -XPOST -d'{
    "seedFile": "http://192.168.10.199:28080/download/Motrix-1.4.1.dmg.seed"
}' http://192.168.10.203:35331/v1/task

注意:seedFile是种子文件的URL地址,请自行准备

node在下载文件的过程中,每完成1个分片都会向tracker汇报1次。
并且在上报的内容中,还包含有下载进度信息。观察tracker日志即可看到。

5. 也许你还能做得更好?

  • 控制并发下载的线程数量(下载worker请求外部节点的并发线程数量)
  • 控制并发下载的线程数量(对其它节点提供服务)
  • 将下载目录和下载完成目录分开
  • 允许通过指令触发对下载目录的扫描
  • tracker的高可用改造
  • 内网穿透
  • nodeList接口 节点优先返回与请求节点本区域的节点

如果我的文章对你有帮助,你可以给我打赏以促使我拿出更多的时间和精力来分享我的经验和思考总结。

微信支付码

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据