庆祝dotnet6,fastgithub送给你

Posted 老九

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了庆祝dotnet6,fastgithub送给你相关的知识,希望对你有一定的参考价值。

前言

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

复杂的网络问题

github连接不上

 

代码pull/push失败

 

找问题的网站也卡

 

想看个代码结果是欣赏loading的艺术

FastGithub

提供域名的纯净IP解析;

提供IP测速并选择最快的IP;

提供域名的tls连接自定义配置;

google的CDN资源替换,解决大量国外网站无法加载js和css的问题;

这是一个本机工具,无任何中转的远程服务器,但也能让你的网络产生很大的改善:

 

简单易用

不用任何设置,只需要双击运行即可,与代理工具、vpn等不冲突(因为不是同一种类型),也不修改你的系统网络配置。

免费+开源

代码100%开源,且不收费就可以使用软件的100%功能,但如果你打赏,开源人从心理感激你,大家都是开发者,你懂。

 

应用下载

从fastgit镜像下载

从QQ群文件下载

 

 

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

源代码

源代码:fastGithub
如果你觉得FastGithub帮助到了你,请点个赞。

以上是关于庆祝dotnet6,fastgithub送给你的主要内容,如果未能解决你的问题,请参考以下文章

开源FastGithub

GitHub加速神器FastGithub的使用

[github] github访问加速工具**FastGithub**

FastGithub让Github畅通无阻

让Github畅通无阻,FastGithub1.0.0发布

Dotnet 6.0,你值得拥有