访问在Elixir中使用Thrift定义的结构体
我想要尝试使用Thrift,甚至Elixir也可以。
我之前在Elixir上想要使用thrift来进行数据交互,但我发现Erlang是有支持的,不过目前似乎不能在Elixir上使用。
在等待Elixir支持的同时,我打算尝试使用Pinterest开发的库。
- https://github.com/pinterest/riffed
2. Riffed的特点是什么?
看起来具有以下特点。
-
- 提供从thrift代码自动生成erlang代码的Mix任务[mix compile.thrift]。
-
- 提供使用Riffed.Struct定义在thrift中生成的结构体,使得可以从Elixir中访问这些结构体的功能。
- 通过提供Riffed.Server和Riffed.Client,可以轻松构建基于生成代码的数据通信简易服务器的功能。
起初我以为只有1和2,没想到还有3。
尝试利用一下
虽然如此,我试着稍微接触了一下1和2,因为它们相对容易使用。
增加dependencies
按照教程上说的将子模块设置为 true。这样下载的源文件相当庞大。。
defp deps do
[
{:riffed, github: "pinterest/riffed", tag: "1.0.0", submodules: true}
]
end
准备3-2. thrift代码
在mix项目中创建一个名为thrift的目录,并将扩展名为thrift的源代码放置在其中。
struct MyChatMessage
{
1: i32 senderId,
2: i32 recieverId,
3: string message
}
service MyChatService
{
void sendMessage(1: MyChatMessage message);
void recieveMessage(1: MyChatMessage message)
}
自动生成Erlang代码
在第3-1步完成后,将在mix中添加任务。使用第3-2步定义的信息来执行自动生成的任务。
mix compile.thrift
运行此操作后,将自动创建一个名为”src”的文件夹,并将源代码放置其中。
尝试使用从elixir生成的代码。
以下是准备Elixir代码的方式。
defmodule MyChatMessage do
use Riffed.Struct, example_types: [:MyChatMessage]
end
因为只想看看是否可以方便地使用,所以我尝试了一下使用 iex -S mix 的方法。
$ iex -S mix
iex(1)> MyChatMessage.MyChatMessage.__struct__
%MyChatMessage.MyChatMessage{message: :undefined, recieverId: :undefined,
senderId: :undefined}
iex(2)> message = %MyChatMessage.MyChatMessage{message: "test", recieverId: 1, senderId: 2}
%MyChatMessage.MyChatMessage{message: "test", recieverId: 1, senderId: 2}
并且我们确认了可以访问结构体的功能^^
样品已放置如下。
- https://github.com/letusfly85/use_elixir_thrift
接下来,我想要看一下Riffed的服务器和客户端。
Cassandra和其他人可以合作似乎很有趣呢^^
今天就到这里吧。