开源FastGithub
0 前言
github网站访问慢或访问不了,相信很多人都会遇到过,解决方式大概有两种:一种是使用代理访问;另一种是使用ipaddress.com等域名解析网站查询域名的ip,然后在host文件增加ip与域名的映射。
1 代理访问
代理访问是在一台能上github的服务器开通代理服务,然后你所在机器在访问github时,流量由代理服务器转发,稳定的代理服务,一般都是收费用。
2 域名解析网站
例如使用ipaddress.com查询域名的ip,但你的网络可能还是无法正常的访问这个ip,或者无法连接此ip的443端口。所以如果你在网上搜索"github慢",得到别人贴出的"最新github ip"数据,粘贴到你的host文件,你可能还是无法访问github。
3 FastGithub
github定制版的dns服务,解析访问github最快的ip
3.1 加速原理
使用github公开的ip范围,扫描所有可用的ip;
间隔指定时间(5min)检测与记录扫描到的ip的访问耗时;
拦截dns,访问github时,返回最快的ip;
3.2 获取github的ip
访问https://api.github.com/meta,我们就可以拿到github公开其使用的ip,为了能够在所有环境获取到这个meta数据,我们需要把这个meta转存到gitee或本机,因为这份数据更新不频繁。FastGithub依赖这份数据,目前从gitee获取到缓存副本。
3.3 443端口扫描
github使用了https,所以对应的tcp端口是443,尝试连接到github各ip下的443端口,如果在指定时间内(默认1s)能连接成功,证明这个ip是有用的,反之就要丢弃这个ip了。在.net下,我们可以使用Socket来进行tcp连接:
[Service(ServiceLifetime.Singleton)]
sealed class PortScanMiddleware : IMiddleware<GithubContext>
{private const int PORT = 443;private readonly IOptionsMonitor<GithubOptions> options;private readonly ILogger<PortScanMiddleware> logger;public PortScanMiddleware(IOptionsMonitor<GithubOptions> options,ILogger<PortScanMiddleware> logger){this.options = options;this.logger = logger;}public async Task InvokeAsync(GithubContext context, Func<Task> next){try{using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);using var cancellationTokenSource = new CancellationTokenSource(this.options.CurrentValue.PortScanTimeout);await socket.ConnectAsync(context.Address, PORT, cancellationTokenSource.Token);await next();}catch (Exception){this.logger.LogTrace($"{context.Domain} {context.Address}的{PORT}端口未开放");}}
}
3.4 Https检测
443端口开放,不意味这个ip就能正常的使用github,有可能在建立ssl时会失败,或者在https请求时,服务返回的内容并不是github官网的内容,所以我们需要进一步的侦测是否有http响应,响应内容是不是github的内容。据我观察,正常的github响应Server头,都有GitHub.com值。
[Service(ServiceLifetime.Singleton)]
sealed class HttpsScanMiddleware : IMiddleware<GithubContext>
{private readonly IOptionsMonitor<GithubOptions> options;private readonly ILogger<HttpsScanMiddleware> logger;public HttpsScanMiddleware(IOptionsMonitor<GithubOptions> options,ILogger<HttpsScanMiddleware> logger){this.options = options;this.logger = logger;}public async Task InvokeAsync(GithubContext context, Func<Task> next){try{var request = new HttpRequestMessage{Method = HttpMethod.Get,RequestUri = new Uri($"https://{context.Address}"),};request.Headers.Host = context.Domain;using var httpClient = new HttpClient(new HttpClientHandler{Proxy = null,UseProxy = false,});var startTime = DateTime.Now;using var cancellationTokenSource = new CancellationTokenSource(this.options.CurrentValue.HttpsScanTimeout);var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationTokenSource.Token);var server = response.EnsureSuccessStatusCode().Headers.Server;if (server.Any(s => string.Equals("GitHub.com", s.Product?.Name, StringComparison.OrdinalIgnoreCase))){context.HttpElapsed = DateTime.Now.Subtract(startTime);await next();}}catch (TaskCanceledException){this.logger.LogTrace($"{context.Domain} {context.Address}连接超时");}catch (Exception ex){this.logger.LogTrace($"{context.Domain} {context.Address} {ex.Message}");}}
}
3.5 Dns服务
我们可以建设一个本机或局域网的dns服务,访问github时,就返回检测到的最快的一条ip,访问其它域名时,转发给8.8.8.8这样稳定的上游dns服务来解析。这样既不影响其它域名的解析速度与稳定性,同时又能正常的使用github所有服务。
4 源代码和软件
4.1 源代码
github:https://github.com/xljiulang/fastgithub
4.2 软件下载
gitee:https://gitee.com/jiulang/fast-github/releases/
开源FastGithub相关推荐
- 统计 Github 2021 贡献过的开源项目
统计一下 2021 贡献过的开源项目 Intro 新的一年的开始了,有很多总结和回顾还没有做,今天就盘点一下贡献过的开源项目吧~ 起初想着手动地通过 Github Dashboard 来统计 但是感觉 ...
- FastGithub让Github畅通无阻
前言 我近半年来被github的抽风虐得没脾气了,虽然我有代理的方式来上网,但代理速度并不理想,而且有时代理服务一起跟着抽风.这时候,我会搜索"github访问不了"相关题材,其中 ...
- GitHub访问慢-FastGithub下载及使用
很多需要用到的脚本及软件会先发布在GitHub上,所以经常需要访问GitHub,但是每次都会卡在跳转到GitHub的步骤,就是还没开始就可以结束了. 之前尝试过手动修改host文件来解决网站的访问问题 ...
- 常用开源协议介绍以及开源软件规范列表
1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...
- 开源自动化机器学习框架
20211101 在 Airbnb 使用机器学习预测房源的价格 https://blog.csdn.net/weixin_33735077/article/details/87976278?spm=1 ...
- 北京大学开源分词工具pkuseg 初试与使用感受
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/meiqi0538/article/de ...
- 最强 NLP 预训练模型库 PyTorch-Transformers 正式开源:支持 6 个预训练框架,27 个预训练模型...
先上开源地址: https://github.com/huggingface/pytorch-transformers#quick-tour 官网: https://huggingface.co/py ...
- 开源软硬一体OpenCV AI Kit(OAK)
开源软硬一体OpenCV AI Kit(OAK) OpenCV 涵盖图像处理和计算机视觉方面的很多通用算法,是非常有力的研究工具之一,且稳居开发者最喜爱的 AI 工具/框架榜首. 1.会不会被USA禁 ...
- GitHub上YOLOv5开源代码的训练数据定义
GitHub上YOLOv5开源代码的训练数据定义 代码地址:https://github.com/ultralytics/YOLOv5 训练数据定义地址:https://github.com/ultr ...
最新文章
- leetcode位运算的题
- NOIP 2018 普及组 解题报告
- 线程wait和notify方法的demo详解
- Unity3d Network 局域网多人对战之游戏大厅
- 800元以内创建的双路CPU主机
- macOS 安装postman 中文语言包
- DDOS攻击器常见的三种方式
- 淘宝数据可视化大屏案例(Hadoop实验)
- 3.卡券、直充订单详情(post 表单提交)
- 计算机调整亮度是哪个好,电脑屏幕亮度怎么调 电脑屏幕亮度怎么调对眼睛最好...
- 点云 3D 目标检测 - PointPillars(CVPR 2019)
- 用4K屏幕的笔记本跑虚拟机vmware如何放大字体?
- Java获取本月第一天是本周第几天
- 微信小程序操作教程(个人用户注册)
- 计算机考研专业课课件,【考研计算机专业课】武汉大学计算机网络PPT课件 习题课.ppt...
- 结合Vue实现344分割手机号码
- tomcat管理界面登录无法进入
- 对标华为Mate 9 保时捷版,金立M2017凭什么?
- MySql学习(七)排序和分页(order by limit),及存在的坑
- 如何成为一名产品经理?
热门文章
- 开始→运行→命令 总结大全
- python oa系统_用python把C#操作OA的例子重写了一下
- c++直角坐标系与极坐标系的转换_一篇阅读量高达2百6十多万的关于坐标系和投影的相关知识探讨...
- Java发送邮件(带附件)
- Integer源码解析
- (译)如何使用cocos2d制作基于tile地图的游戏教程:第一部分
- jQuery入门[2]-选择器[转]
- CRM学习笔记(一)
- Concurrent connection limit
- dvd刻录软件_如何在Windows 7中刻录照片和视频DVD(无需额外的软件)