# g4proxy

使用手机4G流量提供高质量的代理服务


考虑抓取服务，需要使用稳定的代理ip。一般我们会使用代理服务供应商的代理。分：
1. 免费代理，如西刺 [西刺](https://www.xicidaili.com/nn/) 特点：全网扫描得来，并不稳定。因为不是自己维护的节点，而是通过类似漏洞的方式拿到其他人提供的免费的无鉴权的接口。服务不稳定，DNS解析失败等
2. 收费共享代理，如代理云：[代理云](http://www.dailiyun.com/) 第三方提供的代理服务。较为稳定，也有独享类型。不过价格教贵，且无法自己控制拨号
3. 购买ADSL，半自建方式。在其他供应商那里购买ADSL线路进行拨号放大ip，这个能够自己独立控制拨号，ip空间一般能够做到百万级别的映射。但是投入较高，且一旦ip被污染，损失非常巨大。这种方案适合公司内部统一的代理服务建设。


以上所有方案，ip均来自服务或者小区宽带。服务器ip特征很明显，大部分用户不会使用服务器ip入网。小区宽带一般在家里使用WiFi的时候使用。但是小区宽带的ip，多有网段特性。一般一个小区的ip资源，会固定在某个网段下。这会导致我们的ip会有特征暴露问题。

目前，考虑使用手机4G提供代理服务。相对于宽带来说，4G流量放大空间更广。且可以部署在较为繁华的地方。及其容易隐藏在真实用户流量下。

## 面临的问题

最大的一个问题，手机的移动特性很大。没有固定ip，无法直接通过代理服务器的方式，提供代理服务集群。我考虑使用长连接的方式解决这个问题。


## 基本方案

1. 提供一个统一的代理服务器，部署在公网（netty http/https proxy）
2. 提供一个手机程序，作为agent部署在装有4G卡的手机里面
3. 手机agent通过长连接的方式，和server建立channel。并保证 idle channel>=1 (也即，至少拥有一个空闲的channel，如果有很多的代理请求，那么可能有其他请求使用了channel，当channel资源不够的时候，agent异步的主动链接服务器建立channel通道)
4. 所有在服务器的channel，安装clinet id分组。构建资源池。在进行代理转发的时候，提供资源管理模型
5. 当用户的代理请求调用过来的时候，在channel资源池中，根据需要选择一个channel，转发请求（考虑通过固定header绑定到固定的手机下面，可以使用一致性hash算法）
6. 考虑多台代理服务器的实现
