开源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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 创建ll,两台linux建立GRE隧道

1.拓扑图&#xff1a; 备注&#xff1a;因为应用原因&#xff0c;需要在linux2上添加一个公网地址&#xff0c;并且在中间路由设备不受控制的情况下&#xff0c;Linux1能访问到linux2上面的公网地址。2.基本接口配置&#xff1a;linux1:192.168.10.1/24linux2:192.168.20.2/24R…

Exchange Server2010系列之十一:部署CAS+HT角色高可用性

Exchange Server 2010使用基于角色的管理模型。多角色服务器的安装及配置&#xff0c;我们在前面的文章中已经做过介绍。本案例中根据高可用性要求&#xff0c;我们需要把服务器角色部署在分开的服务器上面&#xff0c;并且实现CAS、HT、MBX角色的高可用。在此&#xff0c;我的…

用BenchmarkDotNet看Property

属性——Property&#xff0c;由get,set访问器组成&#xff0c;这是C#使用度比较高的类成员。今天分几组对比测试&#xff0c;来看一下使用Property的性能。被测试对象&#xff1a;public class MyClass {private string _myProperty1 DateTime.Now.ToString();public string …

盘点2019年最有钱的爸爸们

全世界只有3.14 % 的人关注了数据与算法之美纽约时间3月5日&#xff0c;又到了一年一度的大佬炫富时间了&#xff0c;福布斯发布第33期2019年度全球亿万富豪榜&#xff0c;全世界最有钱的人都在这了。第33期福布斯全球亿万富豪榜TOP20 ↓据统计&#xff0c;本次评选一共有2153位…

android拖拽 字体变形,字体变形的几种方法与技巧

原标题&#xff1a;字体变形的几种方法与技巧替换法是在统一形态的文字元素加入另类不同的图形元素或文字元素。 其本质是根据文字的内容意思&#xff0c;用某一形象替代字体的某个部分或某一笔画&#xff0c;这些形象或写实或夸张。将文字的局部替换&#xff0c;是文字的内涵外…

ML.NET Cookbook:(18)如何在文本数据上训练模型?

一般来说&#xff0c;所有的ML.NET学习器都希望这些特征是一个浮点向量。因此&#xff0c;如果您的一些数据不是一个float&#xff0c;您需要将其转换为float。如果我们想学习文本数据&#xff0c;我们需要从文本中“提取特征”。NLP&#xff08;自然语言处理&#xff09;的整个…

每日一笑 | 终于知道为什么胖了之后气质会垮了

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

android led闪烁功能,如何在Android应用层中制作一个LED指示灯效果

如何在Android应用层中制作一个LED指示灯效果发布时间&#xff1a;2020-12-08 16:12:59来源&#xff1a;亿速云阅读&#xff1a;86作者&#xff1a;Leah本篇文章给大家分享的是有关如何在Android应用层中制作一个LED指示灯效果&#xff0c;小编觉得挺实用的&#xff0c;因此分享…

人工智能时代,学好数学很重要!

随着科技的快速发展&#xff0c;人工智能的重要性日渐显现。而数学知识蕴含着处理智能问题的基本思想与方法&#xff0c;是理解复杂算法的必备要素。在机器学习工作流程中&#xff0c;数学与代码高度交织在一起&#xff0c;代码通常可以根据数学直观地构建&#xff0c;甚至会共…

android编译的错误日志,Android Studio:编译器错误输出窗口在哪里?

当我在Android Studio中“运行”我的项目时&#xff0c;在“消息”窗口中&#xff0c;我得到&#xff1a;Gradle:FAILURE: Build failed with an exception.* What went wrong:Execution failed for task :play01:compileDebug.> Compilation failed; see the compiler erro…

为什么选择ASP.NET Core

什么是.NET有一次小飞去面试&#xff0c;面试官上来就问了一个宏观的问题&#xff1a;“你觉得什么是.NET”&#xff1f;小飞的脑子嗡嗡的&#xff0c;支吾了半天&#xff0c;才吐了一些碎片化的词语&#xff1a;“跨平台、开源、微软…”虽然作为一个.NET人&#xff0c;但是小…

c++中的new_handler

原文地址&#xff1a;http://blog.csdn.net/wzq981264/article/details/673630 在过去或者传统的模式中&#xff0c;当operator new不能满足一个内存分配请求的时候&#xff0c;它会返回一个空指针&#xff0c;但是现在如果operator new不能满足一个内存分配请求的时候&#xf…

抢不到“猫抓杯”怎么办?这些女神更喜欢

▲数据汪特别推荐点击上图进入玩酷屋不久前才送走了西方情人节&#xff0c;男同胞们的第二个“送礼节”----女神节。这个令所有女生翘首、期待、憧憬、摩拳擦掌的日子&#xff0c;令所有男士小心翼翼、挑礼物到崩溃的日子&#xff0c;就要到了。小木作为妇女之友&#xff0c;听…

程序出Bug,一定是环境的锅!

现象前几天&#xff0c;一个客户反映说&#xff0c;他看到的数据顺序是乱的&#xff0c;不是按照日期倒排。但是在测试环境、预生产环境&#xff0c;都无法重现问题&#xff0c;即使使用相同的程序版本。定位查看代码&#xff0c;出问题的功能使用了第三方ORM框架&#xff0c;无…

android webview js 失效,Android WebView注入JQuery、JS脚本及执行无效的问题解决

在项目中遇到JQuery注入后&#xff0c;执行无效的问题。我们知道必须在网页加载完成后&#xff0c;也就是在onPageFinished()方法被调用后才能执行被注入的JS。但是在有些手机上并不能成功执行&#xff0c;我的解决方案是设置一秒延迟后注入JS&#xff0c;成功了&#xff01;wh…

AIX逻辑卷管理(LVM)

VG PV PP LV LP关系图 转载于:https://www.cnblogs.com/limt/archive/2013/04/06/4199257.html

鸿蒙操作系统如何打通 Windows 操作系统?

华为&#xff1a;我们选择拥抱 Windows华为给出的解决方案是在微软 Windows 操作系统中部署 HarmonyOS 分布式插件。运行 Windows 操作系统的电脑和运行鸿蒙操作系统的华为手机将形成超级终端&#xff0c;文件资源管理器实现互通。在 Windows 文件资源管理器中&#xff0c;将显…

凯立德导航android历史版本,凯立德导航升级2020版

凯立德导航升级2020版是一款非常专业的手机机车导航软件&#xff0c;它可以为大家提供便捷的导航服务&#xff0c;用户只需要输入自己想去的地方&#xff0c;软件会智能推荐一条最便捷的路线&#xff0c;同时会告知用户目的地附近热门的吃喝玩乐场所&#xff0c;有需要的用户来…

用 Python 实现打飞机

全世界只有3.14 % 的人关注了数据与算法之美所用技术和软件python 2.7pygame 1.9.3pyCharm准备工作安装好 pygame 在第一次使用 pygame 的时候&#xff0c;pyCharm 会自动 install pygame。下载好使用的素材。技术实现初始化 pygame首先要初始化 pygame &#xff0c;之后设定一…

QT-Linux开发环境的搭建

转自&#xff1a;http://blog.csdn.net/wh_19910525/article/details/8118381 如果读者需要在Linux下进行开发&#xff0c;可以使用下面简单的步骤来搭建环境&#xff1a; &#xff08;下面以Ubuntu 12.04 为例进行说明&#xff09;1. 下载软件 到http://get.qt.nokia.com/qt/s…