如今每个领域都有相对成熟解决方案,不需要重复性的开发。但是也带来了一些问题,单一语言开发已经变的越来越困难。
我们使用Ruby on Rails来做API的开发,但是很多业务并不适合Ruby on Rails 来做,例如说我们近期需要实现一个发送短信的功能。我们最开始再业务逻辑中直接调用短信服务商的服务,但是效果很不好,如果出现问题很难发现问题出在何处,所以将短信发送功能单独的提出来做一个内部的短信网关。
独立后的短信网关将给我们带来以下好处:
1.发送的速度会加快,由内部短信网关统一处理网络异常,提高发送成功率
2.同时也能快速的更换短信服务商或接入多个短信运营商
3.集中管理,便于发现问题
短信网关当然选择使用适合做通信并且编程简单的Erlang。这带来一个问题,我们应当如何对接Ruby on Rails的API和Erlang实现的短信网关。最初想使用webmachine做Restful API,但是很不幸webmachine只能帮绑定一个端口,不能做到内外服务分离。然后观察现在成熟方式,Thrift和Protocol Buffer,经过比较Thrift比较符合我们的情况(生成Erlang和Ruby的端代码,Protocol暂时只能靠第三方支持)。
在Erlang使用Thrift需要注意一些事情(测试后发现的,不一定对)
1.在rebar.config中添加https://github.com/lpgauth/thrift-erlang这个git 库,这个Thrift在Erlang中的框架代码,没这东西生成的代码根本就没用。
2.在Erlang中实现的服务函数,最好是对内部逻辑的封装,除非这个函数很简单。
3.在Erlang中的handler模块不要自身就是个进程,而只是一堆函数。如果需要进程的操作,请用函数封装。
好了说下步骤。
第一步:编写相应的*.thrift 文件
第二步:thrift --gen erl *.thrift,将生成的gen-erl复制到src中
第三步:按照例子代码写一个模块,将*.thrift中的函数全都实现了,并在里面指定服务的端口号和启动thrift的框架
第四步:将上一步写的模块添加到整个程序启动过程的最末处,启动thrift开始对外提供服务。
好了,祝大家玩的开心。