构建于GAE/Seattle之上的高性能web代理程序

红薯 发布于 2010/05/24 08:05
阅读 2K+
收藏 3

关于

· hyk-proxy是一个web proxy框架,提供了基于Google AppEngine平台和Seattle平台的实现

· 在AppEngine部分,hyk-proxy展示了通过RPC来实现高性能web proxy的途径。基于目前AppEngine部分实现机制,将来还可以实现暴露更多GAE特有功能,实现为一个远程的GAE lib,而不仅仅作为简单web proxy(目前已经实现用户权限管理/统计/基于用户流量控制等功能)。

· 在Seattle部分,目前仅实现简单web proxy功能

· hyk-proxy目前支持HTPP to GAE/XMPP to GAE/TCP to Seattle三种方式完成web proxy功能

 

hyk-proxy原理

· hyk-proxy分为两部分,一部分运行于GAE/Seattle之上,属于remote server;另一部分运行于本地,属于local server,实质为一个简单中转的http server。

· 当浏览器设置的代理服务器地址为local server地址时,local server将浏览器的请求编码发送给remote server执行proxy功能

1 若remote server为GAE平台,则local server将http请求通过一个通用RPC框架远程调用到remote server上,获取远程调用结果。远程接口为:

public interface FetchService
{
HttpResponseExchange fetch(HttpRequestExchange req);
}

1 若remote server为Seattle平台, 则local server将http请求加密后直接转发给remote server

· local server在获取调用结果简单处理后,转给浏览器完成一次代理访问。

· 一次web访问经过此代理的完整过程如下:

Browser<–>Local Server<–>Remote Server<–>Real Web Server

其中Local Server与Remote Server之间属于通信层部分,不局限于HTTP连接;若GAE Remote Server由于防火墙原因无法直接通过HTTP连接,可采用XMPP模式穿越

· 由于AppEngine部分RPC框架通信层部分可以替换,因此local server与GAE remote server之间的通信方式可以视实际情况替换。由于GAE本身的限制,目前理论上只有三种方式可以选择:

1 HTTP,local server作为HTTP client访问remote server

1 XMPP,local server作为一个XMPP user与remote server进行通信

1 EMAIL,local server 与remote server发送/接受email通信(由于EMail限制较大,不适于用于RPC通信协议,目前不会实现)

· 而Seattle部分则在理论上支持TCP/UDP通信,目前实现TCP连接

如何使用

· 安装运行依赖

1 JRE/JDK 1.6+

1 Google App Engine SDK(Java) (最新版本)

· 创建自己的GAE应用 http://appengine.google.com/ (必须)

· 创建自己的Seattle账户以及Vessels Seattle(可选,仅对Programmer 推荐使用)

· 安装Remote Server

1 解压hyk-proxy-server-[version].zip

1 部署应用到Google服务器 (必须)

GUI方式

appcfgwrapper安装程序已经集成到hyk-proxy-server-[version].zip中,执行 install.bat/install.sh即可,具体请参考此项目说明http://code.google.com/p/appcfgwrapper/

命令行方式

进入解压的目录, 修改war/WEB-INF/appengine-web.xml, 将<application>值改为自己创建的appid

执行appcfg.cmd/appcfg.sh update war上传, 注意在解压后进入的目录执行(appcfg在’<Google App Engine SDK>/bin’下 )

1 部署应用到Seattle平台(可选,仅对Programmer推荐使用)

Seattle部分程序在解压的目录中seattle中,部署运行请参考(Seattle)

· 运行Local Server

1 解压hyk-proxy-client-[version].zip

1 GUI方式

执行bin/startgui.bat(startgui.sh)启动

1 命令行方式

进入解压的目录, 修改etc/hyk-proxy-client.conf.xml,添加自己创建的appid

执行bin/start.bat(start.sh)启动local server,bin/stop.bat(stop.sh)停止

1 浏览器设置代理地址为 127.0.0.1:48100

· 配置

大部分配置均在hyk-proxy-client.conf.xml中(GUI启动则在Config对话框中配置),简要说明如下:

1 <hyk-proxy-server appid="" /> 为已部署的ApplicationID, 即<appid>.appspot.com中<appid>, eg:

<hyk-proxy-server appid="hyk-proxy-demo" />

1 <hyk-proxy-server appid="" />可配置多个,此情况下, 代理过程中采用轮询策略选择, eg:

<hyk-proxy-server appid="hyk-proxy-demo" />
<hyk-proxy-server appid="myappid" />

1 <hyk-proxy-server appid="" /> 中可以配置用户名/密码,具体用户名/密码概念请参考Authorization, eg:

<hyk-proxy-server appid="hyk-proxy-demo" user="root" passwd="12345"/>

1 如果不配置appid的话,client会到master node上获取数个共享的appid用于自身启动,注意:

共享的appid只能用于匿名用户使用(匿名用户的概念看这里Authorization

appid所有者可以针对匿名用户设置proxy黑名单,proxy流量控制,所以不配置自己的appid是无法保证应用稳定性

1 <XMPPAccount user="" passwd="" />为XMPP账户,是可选配置,在HTTP无法直连情况下可启用,目前可配置GTALK/jabber.org/OVI等几乎所有XMPP帐号 (若有不支持的XMPP account,请提交ISSUE), eg:

<XMPPAccount user="abc@gmail.com" passwd="123456" />

1 XMPP账户可配置多个,此情况下代理过程中采用轮询策略选择,eg:

<XMPPAccount user="abc@gmail.com" passwd="123456" />
<XMPPAccount user="xyz@ovi.com" passwd="123456" />

1 XMPP模式仅在connection mode模式为2(<connectionMode>2</connectionMode>)情况下生效

1 <maxFetcherNumber>3</maxFetcherNumber> 在下载文件/观看视频时生效,含义为并发的下载线程数,可以任意调整,建议在1~7之间调整

1 启用Seattle平台作为proxy服务器有两种方式:

和AppEngine平台混合使用(建议)

在etc/hyk-proxy-client.conf.xml加入下面一行:

<proxyEventServiceFactoryClass>
com.hyk.proxy.client.application.mix.event.MixProxyEventServiceFactory
</proxyEventServiceFactoryClass>

此外可以修改etc/app.mix.conf,配置何种HTTP请求由Seattle平台处理, 默认HTTPS请求, DELETE/OPTIONS请求会由Seattle平台.

独立使用(不推荐,Seattle平台的资源限制非常严格)

在etc/hyk-proxy-client.conf.xml加入下面一行:

<proxyEventServiceFactoryClass>
com.hyk.proxy.client.application.seattle.event.SeattleProxyEventServiceFactory
</proxyEventServiceFactoryClass>

1 配置Setattle平台目的地址

修改etc/app.seattle.conf,加入申请得到的ip地址,端口(注意ip是通过seash shell中执行browse得到的ip, 端口是你的seattle account profile中显示的port),eg:

#128.129.41.211:63160
150.254.212.138:63160
213.131.1.121:63160
198.175.122.108:63160

AppId共享计划

· 在hyk-proxy的GUI(V0.8.5之后)中提供有一个共享appid的功能,任何人可以据此共享自己的appid

· 当hyk-proxy的用户由于某些原因(如不知道怎么安装server侧)没有配置自己的appid时,默认情况下,hyk-proxy-client 会从服务器上随机获取几个共享appid,然后用匿名用户方式连接<shareappid>.appspot.com

· 共享自己appid的贡献者需要据此考虑设置匿名用户的访问策略,在admin工具中提供有blacklist/traffic/stat工具用于监测 /控制匿名用户的行为,具体参考Authorization

· 共享自己appid的贡献者建议在admin工具中执行下面命令设置默认匿名用户策略:

stat on — 开启流量统计

traffic -u anpnymouse -s * -r 25000000 — 对匿名用户访问所有站点限制25m流量

· 流量统计结果每天定时自动清零,所以若使用共享appid用户当天无法使用,可以过一天再次尝试

注意

· 启用XMPP模式时,由于xmpp server限制,太频繁发送消息会被server拒绝,可采用配置多个XMPP账户规避

· GUI中有一个Share appid功能, 你可以分享自己的appid到中心服务器,也可以取消分享;中心服务器则随机分派appid给没有安装自己的hyk-proxy-server的用户

· 分享自己的appid的用户需要注意配置anonymouse用户的访问策略,以免此appid被滥用, 配置用户策略请参考Authorization

· 应用Seattle平台相对于Google AppEngine平台的优势:由于Seattle平台提供了非常底层的socket操作,因此可以比较完美实现https支持,上传,以及其他局限于 Google AppEngine的限制无法实现的功能。

· EMail模式目前未实现

程序下载 http://code.google.com/p/hyk-proxy/

本文首发XiaoMo(转载请保留)http://4ngle.org/2010/05/391.html

加载中
返回顶部
顶部