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所有服务。

源代码

源代码:fastGithub

如果你觉得FastGithub帮助到了你,请点个赞。

开源FastGithub的更多相关文章

  1. 基于YARP实现的FastGithub

    前言 最近开源的两个项目,先是FastGithub,旨在解决访问github抽风的问题.然后开发HttpMouse项目,基于yarp的http公网反向代理到内网的服务端与客户端库,在开发HttpMou ...

  2. 庆FastGithub加入.NET Core Community

    .NET Core Community .NET Core Community是一个基于并围绕着 .NET 技术栈展开组织和活动的非官方.非盈利性的民间开源社区,提供了很多优秀的 .NET 开源项目. ...

  3. 庆祝dotnet6,fastgithub送给你

    前言 dotnet6正式发布了,fastgithub是使用dotnet开发的一款github加速器,作为开发者,无人不知github,作为github用户,fastgithub也许是你不可或缺的本机工 ...

  4. 开源LIMS系统miso LIMS(适用于NGS基因测序)

    开源地址 https://github.com/miso-lims/miso-lims github加速可使用:https://kfqbvpat.fast-github.tk/-----https:/ ...

  5. 开源WindivertDotnet

    0 前言 Hi,好久没有写博客,因为近段时间没有新的开源项目给大家.现在终于又写了一篇,是关于网络方向的内容,希望对部分读者有帮助. 1 WinDivert介绍 WinDivert是windows下为 ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  8. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  9. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

随机推荐

  1. 19.Vuex详细使用说明-一篇文章涵盖所有知识点

    vuex官网: https://vuex.vuejs.org/zh/ 一. 前言 不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要. 什么是共享状态? 比如 ...

  2. 一个或多个筛选器或者Listeners启动失败 的问题探索以及解决方案

    2020年10月9日更新 经过本人对SSM框架理解的加深和对IDEA工具使用的熟悉,现提出一种新的解决办法,以前的解决办法可能存在问题 1. 问题描述: 使用IDEA作为开发工具,使用Maven作为项 ...

  3. Docker 部署net5程序

    1.前言 本文讲述使用docker容器部署.net5项目.实现跨平台. 部署环境:docker 容器.liunx系统.这里采用VmWare虚拟机.并采用MobaXterm工具实现终端连接linux系统 ...

  4. 改善c++程序的150个建议(读后总结)-------0-9

    0. 不要让main 函数返回 void 入口函数main()返回类型应该为 int, 即程序结束时return 0 表示程序正常返回,函数结束时 return -1 值表示程序异常返回, 如果不显式 ...

  5. 面试题:ArrayList、LinkedList、Vector三者的异同?

    面试题:ArrayList.LinkedList.Vector三者的异同? 同:三个类都是实现了List接口(Collection的子接口之一),存储数据的特点相同:存储有序的.可重复的数据不同: * ...

  6. C#是怎么跑起来的

    解释流程前,需要了解一些基本的概念. 基本概念解释: CPU :中央处理器,计算机的大脑,内部由数百万至数亿个晶体管组成,是解释和运行最终转换成机器语言(二进制代码)的地方.机器语言是通过CPU内存的 ...

  7. 吃透KVM创建虚机和KVM命令

    1.创建虚拟机 1.1创建虚拟机磁盘 #使用qemu命令来创建磁盘 qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.2.qcow2 2 ...

  8. 变体 variety 计算机学科中的改变类型;输入法的 类型

    变体_百度百科 中文为改变原来的体式.或者计算机学科中的改变类型. 变体 variety 输入法的 类型

  9. k8s健康检查(9)

    一.默认的健康检查 强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readines ...

  10. linux服务之FTP服务篇

    一.FTP协议 FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP (File Transfer ...