go代理(golang配置代理)
一、[golang] fasthttp 使用http代理
golang net/http标准库的client是可以配置各种代理的,http/https/sock5等,不过fasthttp仅支持配置sock5代理,通过定义fasthttp dialfunc实现:
项目中碰到的问题是,ops只提供了用squid搭建的http代理,所以是想重新定义一个http代理的dialfunc,找了fasthttp github仓库的issue,作者提供了一个dialFunc
经测试,访问https的站点是OK的,访问http的站点不行,代理连接不上。先说一下http/https代理的区别,再说原因。
使用代理访问https网站时,会先发CONNECT请求,让代理与目标站点建立一个http tunnel,之后在这个tunnel基础上进行传输,对应到上面的dialFunc过程就是:
可以看到http站点是不需要发CONNECT请求的,而是直接将目标站点的url作为path填写在http请求头中。
为何上面的dialfunc访问http站点不行呢,查了squid代理的文档,发现squid默认会禁止非https站点通过CONNECT方法建立通道,自己搭了个squid代理去掉配置项,发现上面的dialfunc是可以访问http、https站点的,就是说http,https都先建立通过,再请求。
看了fasthttp的源码,没办法在请求前修改request header中的path为目标站点url,所以如果需要通过fasthttp使用http代理,那么可以使用上面的dialfunc,同时代理需要允许非443端口的站点可以建立通道。如果做不到这一点,那么还是建议使用标准库net/http的client,会更方便一点。
二、golang私有仓库依赖配置
golang私有仓库依赖配置
版本要求:go 1.14+
go mod配置:
go env-w GOPRIVATE="gitlab.xxx.com" //配置私有仓库域名:重要
go env-w GONOPROXY="gitlab.xxx.com" //此配置下的域名默认不走代理
go env-w GONOSUMDB="gitlab.xxx.com" //此配置下的域名默认不进行gosumdb校验
go env-w GOINSECURE="gitlab.xxx.com" //此配置下的域名默认采用http协议。有些公司的私有仓库采用http协议,而go mod默认采用 https,请根据实际情况进行配置:重要
账户及密码:
因私有仓库一般都需要进行登录,所以可以通过隐藏文件进行用户名及密码配置。
文件路径:~/.netrc //默认Linux系统,
文件内容:
machine域名 //gitlab.xxx.com
login账号
password密码
三、APNS推送Golang SDK使用Proxy代理
苹果的消息推送是通过请求域名:实现的,该域名解析结果为美国,这引发了两个问题:
1、接口请求时间长,性能低,而且容易请求超时报错
2、高峰期推送请求错误率升高
总体思路:增加一个美国代理服务器,通过代理服务器请求苹果消息推送服务
1、原来流程
2、现在流程
3、具体方案实施选择
选择一:proxy服务器,部署一个正向代理服务,提供push消息的正向代理,消息通过代理服务器送达苹果服务端
选择二:proxy服务器,独立实现、部署一个标准的apns服务,负责 ios消息推送。将需要走美国节点的请求转发到该proxy节点
具体情况、具体分析,应思考的点:
问题一、苹果官方提供的SDK中,不支持设置代理服务器。官方SDK不适合更改,对以后系统更新不利
问题二、只有苹果的push服务需要代理,其他例如华为、小米、vivo不应走海外代理
问题三、代理安全性
问题四、代理方案下,有重试逻辑。如何准确定义和判断失败,可能会引起消息重复推送
问题五、实现简单、有效,正向代理方式:只需实现一个实例化对象方法,其他利用原始sdk即可。独立apns服务方式:需要实现一个apns服务,国内、国外均需服务部署,需要增加独立的开发和运营成本,另外还得改造调用服务,实现请求调度,优点服务独立、单一,具备一个单独微服务条件
github.com/sideshow/apns2
方法一:修改SDK文件
第一步:设置环境变量
第二步:修改apns2.NewClient方法
方法二:从新定义一个NewClient方法