访问在Elixir中使用Thrift定义的结构体

我想要尝试使用Thrift,甚至Elixir也可以。

我之前在Elixir上想要使用thrift来进行数据交互,但我发现Erlang是有支持的,不过目前似乎不能在Elixir上使用。
在等待Elixir支持的同时,我打算尝试使用Pinterest开发的库。

    https://github.com/pinterest/riffed

2. Riffed的特点是什么?

看起来具有以下特点。

    1. 提供从thrift代码自动生成erlang代码的Mix任务[mix compile.thrift]。

 

    1. 提供使用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”的文件夹,并将源代码放置其中。

Screenshot from 2016-03-29 12-46-37.png

尝试使用从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和其他人可以合作似乎很有趣呢^^

今天就到这里吧。

广告
将在 10 秒后关闭
bannerAds