erlang+thrift配合开发
I think, thrift is a tcp/ip based Client-Server architecture multi-languages supported RPC framework.
要使用thrift+erlang开发,要经过下面几个步骤。
1.对thrift了解。
thrift的功能的确是强劲,不过thrift缺少文档的确是它的硬伤,尤其是具体的语言的API文档更是缺少,网上基本上是java api的文档。下面是我收集的一些文档,对thrift的定义和使用都有具体的介绍,可以说是thrift的入门必备资料。
有pdf文档可以下载,15页,短小精悍,我就是看了这个文档对thrift有所了解。
thrift的白皮书,介绍了thrift的历史和使命。
使用java开发可以看看。
介绍thrift的一些特性
包括安装、使用等一系列内容。
看完这一系列文档,对thrift的定义、使用、以及特性都会有比较深入的了解,可以减少使用中遇到的问题。
2.thrift开发一般步骤
Erlang中使用Thrift 里面讲到了使用erlang+thrift的一般步骤:
第一步:编写相应的*.thrift 文件
第二步:thrift --gen erl *.thrift,将生成的gen-erl复制到src中
第三步:按照例子代码写一个模块,将*.thrift中的函数全都实现了,并在里面指定服务的端口号和启动thrift的框架
第四步:将上一步写的模块添加到整个程序启动过程的最末处,启动thrift开始对外提供服务。
3.thrift与erlang实战
首先对thrift的erlang代码有所了解,下面这个博文就是阅读代码的心得
读了这个博文后,我们就开始thrift+erlang的开发了。
thrift+erlang的用例就有thrift源码里面的tutorial,看懂了这个示例,基本上就可以使用thrift开发erlang服务器程序。
在这里,我使用的是另外一个示例,是在网上另外一个例子:
初试thrift (自备梯子)
thrift粘合erlang (自备梯子)
定义hello.thrift文件:
service Hello{
string say(1:string name)
}
生成erl文件:
thrift --gen erl hello.thrift
gen-erl目录里面就有我们需要的erlang代码。
#ls gen-erl/
hello_constants.hrl hello_thrift.erl hello_thrift.hrl hello_types.erl hello_types.hrl
打开hello_thrift.erl,里面就是:
%%
%% Autogenerated by Thrift Compiler (0.9.1)
%%
%% DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
%% -module(hello_thrift).
-behaviour(thrift_service). -include("hello_thrift.hrl"). -export([struct_info/1, function_info/2]). struct_info('i am a dummy struct') -> undefined.
%%% interface
% say(This, Name)
function_info('say', params_type) ->
{struct, [{1, string}]}
;
function_info('say', reply_type) ->
string;
function_info('say', exceptions) ->
{struct, []}
;
function_info(_Func, _Info) -> no_function.
可以看到上面定义的say方法,在hello_thrift.erl里面有say方法的参数类型、返回类型,异常等信息。
在hello.thrift里面没有定义任何类型,所以在 hello_types.erl没有任何实质内容。
从上面的例子来看,产生erlang文件的思路是根据type以及service来命名。
在gen-erl目录里面,新建一个hello_server2.erl文件,
-module(hello_server2).
-include("hello_thrift.hrl").
-export([start/0, handle_function/2, say/1, stop/1]). debug(Info)->
io:format("Debug info:~s~n",[Info]). say(Name)->
io:format("~n Line:~p~n", [?LINE]),
Sentence = "Hello," ++ Name,
debug(Sentence),
BinSentence = list_to_binary(Sentence),
BinSentence. start()->
start(9090). start(Port)->
Handler = ?MODULE,
thrift_socket_server:start([{handler, Handler},
{service, hello_thrift},
{port, Port},
{name, hello_server}]). stop(Server)->
thrift_socket_server:stop(Server). handle_function(Function, Args) when is_atom(Function), is_tuple(Args) ->
case Function of
say ->
{reply, say(tuple_to_list(Args))};
% add function here
_ ->
error
end.
如果参照这个hello_server2.erl和thrift-0.9.1/tutorial/erl/server.erl,可以发现他们的结构差不多。
一般代码的思路是,使用thrift_socket_server:start/1函数来启动服务,导出handle_function/2函数来处理RPC访问。
所以可以看出,一般的思路就是在thrift文件,里面添加需要导出的函数定义,然后在handle_function/2函数处添加额外的代码。thrift框架真的是节省了程序员的开发时间。
使用erlang来做thrift的客户端开发,也比较容易,直接上代码:
-module(hello_client).
-include("hello_thrift.hrl").
-export([test/0]). p(X)->
io:format("in the p() ~w~n", [X]),
ok. test()->
Port = 9090,
{ok, Client0} = thrift_client_util:new("localhost",
Port,
hello_thrift, []),
io:format("~n Client0 : ~p~n", [Client0]),
{Client1, Res} = thrift_client:call(Client0, say, ["world"]),
io:format(" the Res is ~p~n", [Res]),
io:format("~n Client1 : ~p~n", [Client1]),
p(Res),
io:format("the Client0 == Client1: ~p~n", [Client0 == Client1]),
thrift_client:close(Client1),
ok.
效果演示图:

erlang+thrift配合开发的更多相关文章
- C# Thrift 实战开发 从PLC到Thrift再到客户端集成开发
About Thrift: 本文并不是说明Thrift设计及原理的,直接拿Thrift来开发一个Demo程序,如果想要了解Thrift的细节,可以访问官方网站:https://thrift.apach ...
- erlang 游戏服务器开发
http://blog.csdn.net/slmeng2002/article/details/5532771 最近关注erlang游戏服务器开发 erlang大牛写的游戏服务器值得参考 介绍本文以 ...
- 关于一次配合开发工作而产生的服务器内核参数问题(Android 网络问题)
关于一次配合开发工作而产生的服务器内核参数问题(Android 网络问题) 问题转载(本人与作者遇到了同样的问题) 问题描述 问题描述:在这几年的Android开发中,遇到了一个困扰我好久的问题,有时 ...
- Webpack+React配合开发
前面两篇关于webpack的基础和进阶,请先务必阅读之前的文章. Webpack教程一 Webpack教程二 什么是React React是一个由Facebook开发的library,它的口号是“A ...
- 使用Erlang和Yaws开发REST式的服务
看过那张很出名的“Apache vs. Yaws”图么?是不是在考虑你也应该使用Yaws了?这些图给人的第一印象是,Yaws在可伸缩性上具有难以置信的巨大优势,它可以扩展到80000个并行的连接,而 ...
- 转载:如何利用Vim进行Erlang开发
转自:http://ovalpo.info/how_to_use_vim_for_erlang_dev/ 如何利用Vim进行Erlang开发 by Martin J. Logan on Septemb ...
- vsp配合Qt5开发,解决virtual void * __cdecl PopDialogManger::qt_metacast
Qt错误提示 virtual void * __cdecl PopDialogManger::qt_metacast(char const*)"(?qt_metacast@PopDialog ...
- 我们都是IT民工---------流浪人IDE开发札记
你生命中的有些东西终究会失去,比如我住了6年的陈寨,这个聚集了郑州十几万IT民工的地方,说拆就拆了.再比如我玩了3年的坦克英雄,这个带给我太多快乐的游戏,说停就停了. 编程对我而言是种爱好,我上学6年 ...
- 在RHEL上安装Thrift(支持C++)的若干问题 » 编码无悔 / Intent & Focused
在RHEL上安装Thrift(支持C++)的若干问题 » 编码无悔 / Intent & Focused [原创]在RHEL上安装Thrift(支持C++)的若干问题 2010年12月1 ...
随机推荐
- Order Helper
using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Crm.Sdk.Messag ...
- openwrt procd启动流程和脚本分析
Linux内核执行start_kernel函数时会调用kernel_init来启动init进程,流程如下图: graph LR A[start_kernel] -->B(rest_init) B ...
- 封装axios方法之一
一.先来说说为什么要封装axios异步请求. 我们前端开发中总是会遇到跨域的问题,我们会配置proxy来解决跨域的问题,无论是vue 还是react. 如何配置我这里就不说了. 然后...然后我们就会 ...
- 阿里云 Debian 9.2 安装 Java Web 环境
CentOS 源内包太旧,和本地开发环境不兼容的地方太多 系统配置 更新数据库与软件包 # apt-get update && apt-get -y upgrade 提示是否保留本地已 ...
- Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)
Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...
- HDU 5972 Regular Number
Regular Number http://acm.hdu.edu.cn/showproblem.php?pid=5972 题意: 给定一个字符串,求多少子串满足,子串的第i位,只能是给定的数(小于等 ...
- hdu1421搬寝室(动态规划)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- word record 01
词义默认包括发音 coil /kɔɪl/ 发音(kuo you) collage /kə'lɑʒ/ 发音(ke la shi) colleague /'kɑliɡ/ 发音 (ka li ge) com ...
- Unity编辑器 - 鼠标悬停在控件上时改变鼠标样式
Unity编辑器 - 鼠标悬停在控件上时改变鼠标样式 摘自Unity文档 EditorGUIUtility.AddCursorRect public static void AddCursorRect ...
- 加油吧 骚年QAQ
本随笔文章,由个人博客(鸟不拉屎)转移至博客园 写于:2017 年 11 月 08 日 原地址:https://niaobulashi.com/archives/fighting.html --- 想 ...