项目搬到云的一次小结
背景
放假刚回到家几天,学校服务器就挂了。
这服务器没得说,三天两头挂一次。已经老了,跑不动了吧。
为了减轻维护的负担,我决定把流量汇管家(xiayule.net)服务搬到云了,流量汇管家github项目地址。
说到流量汇管家,这可以说是我的第一个有人用的小项目,虽然用的人不多,考虑到自己还在用。舍不得它挂掉,但又疲于维护。心里想着孩子,不要怪我,我再努力一次。
选择云服务
现在国内的云很多,加一个筛选条件——免费,那就剩的不多了,我知道的有两个,第一个是新浪云(sae),第二个是魔泊网(mopaas)。
新浪云是用豆来计费的,可以免费申请成为中级开发者,成为中级开发者后,每月会发送10000豆,绝对够用了。
魔泊网是按照服务数量来计费的,一个web站算一个服务。
具体的资费参见官网。
纠结了一下,选择使用新浪云,因为新浪云可以免费绑定域名,而魔泊网必须付费用户才能绑定。
要点
接下来就是搬迁服务。这意味着几点要考虑了:
第一,修改jdk版本,新浪云提供的环境是java6的。
第二,我的服务使用了mysql+redis,新浪不提供redis的服务(嫌弃新浪提供的kvdb太水了) ,必须将redis替换为mysql。
第三,替换其他新浪不支持的服务。比如,我使用的是log4j2,而新浪仅仅支持log4j1.x。
开始动工
第一点
很好办,下载了jdk6, 修改项目的jdk版本就可以了。
第二点
复杂些,因此花费的时间也比较长。
我利用重构的方式逐步替换掉redis的服务。
第一步实现的是cookie的mysql存储。
具体的改动可以参加这里.
思路就是 创建 CookieServiceMysqlImpl 类,实现 CookieService 接口(三层设计的优势体现出来啦), 然后配置spring替换掉 CookieServiceImpl(redis版本)的依赖注入就可以了。
第二步实现的是实现了朋友摇奖和自动领取功能的mysql数据库存储。
这个没有一个固定的接口,需要在他们调用的类 SubscribService类处修改调用。好在不算复杂,
具体改动参见这里。
第三步实现的是有效期的mysql化。
redis提供了键的自动过期,而mysql没有提供记录的自动过期。需要自己实现。而我的方案也很简单,就是加入一个过期字段 endTime, 每次操作查看endTime是否过期就可以了。
具体改动参见这里。
剩下的就是mysql比较零碎的改动了
第三点是打算慢慢改动的,没急着写,毕竟这个不是太紧迫。
改动好了,可以准备着部署了。
部署
想要在sae部署也是要费一番功夫的。
可以分为三步:
第一步创建服务。
登录http://sae.sina.com.cn/创建web服务,然后创建mysql数据库服务,把mysql数据库的配置写入项目。
这里可能会遇到数据库乱码问题,如果是xml配置文件,需要这样写jdbc url:
jdbc:mysql://w.rdc.sae.sina.com.cn:3307/app_getll?useUnicode=true&characterEncoding=utf8
如果是代码配置,需要这样写url:
jdbc:mysql://w.rdc.sae.sina.com.cn:3307/app_getll?useUnicode=true&characterEncoding=utf8
区别就在于在xml中字符串要使用html实体, 参见这里。
第二步生成项目。
前面说过了,新浪云是用豆计费的。数据库的使用、流量的流入流出、http的请求等等都是需要用来计算豆的,这就要求新浪在服务的底层实现豆的统计。因此新浪把各种服务分离出来(当然有的服务分离出来也是安全考虑),组成了一套服务体系。比如 KVDB,FetchURL等。
这些服务提供的jar包都是sae提供的,如果我们的与其冲突,我们就要妥协,删掉我们的。
删除哪些包呢?
删除所有sae提供的包。详情参见这里.
删除之后,就可以将项目上传了。
第三步上传项目
这离成功还有一段距离,因为你会发现各种问题,可以查看日志慢慢修改。
本来我把所有错误改完,成功跑起来服务,松了一口气。没想到发生了更致命的事。那就是乱码问题。在sae上使用httpclient发生了乱码,不用说,我当然设置了编码,而且本地完全没问题。这种无厘头的错误,翻遍sae论坛也找不到解决办法。因此决定使用sae 提供的 FetchUrl 服务,FetchUrl 是新浪对 httpclient 的一层封装。这次聪明了些,先测试了一下,发现即使不设置编码,也不会乱码。放心用了下,发现cookie出现问题。精神已经快要崩溃了。自己使用 UrlConnection 来写,这总可以了吧。遗憾的是,虽然没有乱码,cookie依旧有问题。
转折
搬迁工作已经持续一个星期了,没有精力再弄了。决定使用魔泊网了,
魔泊网还是很给力的,配置完数据库mysql,不用任何删包,上传项目,就能成功运行(感受到了上帝的温暖)。
解决域名问题
接下来解决域名问题,魔泊网的域名很长: getll.sturgeon.mopaas.com (反正我是记不住,逼我掏钱?)
妥协一下,sae是可以绑定域名的,因此我在sae写了一个小程序,每次访问 xiayule.net 或 www.xiayule.net,都会重定向到 getll.sturgeon.mopaas.com。这还算一个不错的办法。
看到新浪说未备案的域名会走国外路线,因此有被墙的风险,绑定好之后确实时不时的不能访问(现在想来,应该是我太着急了,或者说不相信sae了,导致这个问题的原因应该是修改的dns还未完全生效)。于是借了zhengnanlee同学的vps,搭了个nginx服务,负责重定向,来取代sae。
至此,搬迁工作算是告一段落了,松口气,喝口茶,写写小结,休息休息。