最近不知道咋了,有些高产啊,目前网上似乎没人翻译这个,争取周末前把三篇翻完

原文:Create a riak_core application in Elixir (Part 1)

在Elixir中创建riak_core应用(I)

12月3号(2016年),我在NoSlidesConf做了一次关于riak_core的演讲,
为了用Elixir展示riak_core一些特性,我写了这个简单的应用。

在那以后,我决定写一篇关于在Elixir中使用riak_core的教程,在Elixir中调用Erlang的库确实非常简单,
比如这个app就是个很好的例子,网上有很多用Erlang(使用riak_core)的例子,
但遗憾的是,依然有很多“炼金术士”们并不熟悉Erlang的语法:-(

本文中,我将描述如何创建一个空的Elixir应用,它只能作为多个节点在同一台机器上启动而没有其他功能,
要等到下一篇文章,您才能看到实用的功能:-).

如何开始

Riak_core是由basho开发,从riakKV/riakTS中剥离出来的一个独立的库。
basho的这个Repo对于Elixir应用来说并不容易使用,但是你可以检出代码作为“main source”。
当然作为一名“炼金师”,你肯定非常熟悉https://hex.pm/(如果不是,那你该努力了:-))
在hex.pm里搜索riak_core,你会发现riak_core_ng
这是从原库中fork出来的,
Heinz N. Gies维护的版本。

开始之前,先介绍一下我的Erlang和Elixir的版本。本系列教程中,我会一直使用Elixir 1.3.4和Erlang 18.3。
在测试时,我没能用Erlang 19成功运行riak_core。如果你查看basho的Repo
riak_core_ng的Repo,你会发现其中包含了移植到Erlang 19的工作,不过至今还未完成。
我建议使用[kerl][kerl]或者[asdf][asdf]来管理Erlang的版本。如果你想用observer(你肯定想的:-))。
我建议在编译Erlang OTP的时候开启wx。如果你使用OSX,请看这里
Linux用户请看这里)。
其他系统用户请尝试google。

那么我们开始吧,附上--sup参数,创建一个新的mix应用

1
$ mix new no_slides --sup

用这种方法,我们创建了一个空的app,首先要做的是把riak_core加入依赖项中。在mix。exs文件中加入如下内容:

1
2
3
4
5
6
7
8
9
10
def application do
[applications: [:riak_core, :logger],
mod: {NoSlides, []}]
end
# ...
defp deps do
[
{:riak_core, "~> 2.2.8", hex: :riak_core_ng}
]
end

记得要把:riak_core放在放在第一位,否则可能会发生一些奇怪的事情:-D.

然后,就像平时一样,获取依赖

1
$ mix deps.get

现在可以用下面的命令运行你的第一个riak_core app了:

1
$ iex -S mix run

你看到了好多的error,首先你应该用参数--name <node_name>运行node,我的是这样:

1
$ iex --name [email protected] -S mix run

这是使用全名启动程序的方式,
之后,你会得到另一个错误,需要为你的代码配置schema和一些其他的设置。schema存在在deps/riak_core/priv目录中,
使用下面的命令,将其拷贝到你的priv目录下

1
$ cp -r deps/riak_core/priv .

最后,要告诉riak_core如何管理节点的必需的信息,我建议在config/config.exs文件中加入如下内容:

1
2
3
4
5
6
7
config :riak_core,
ring_state_dir: 'ring_data_dir',
handoff_port: 8099,
handoff_ip: '127.0.0.1',
schema_dirs: ['priv']
config :sasl,
errlog_type: :error

配置项riak_core是riak_core作为单节点启动的必要配置(多节点时我们会做一些小修改),
我们告诉riak_core在哪里保存上的数据(集群配置)。
管理handoff的IP/端口,以及在哪里找到schema。
最后的配置也同样重要,我们告诉sasl应用只打印错误日志。

至此,你终于可以启动一个单节点的riak_core应用了:

1
$ iex --name [email protected] -S mix run

万岁!!!

多节点环境

我们当然希望用riak_core创建一个分布式的应用,所以我们的应用应当运行在不同的节点上。在开发时,在一台机器上面运行多个节点会更加简单易行。
为了做到这一点,有必要让每个节点用不同的配置来运行,我们可以用mix的environments达到这一目的。
我们为每个环境(environment)添加不同的配置文件,通过这些不同的环境来区分各个节点。
在本例中,我把环境命名为gpad_1gpad_2gpad_3。我建议在config目录中添加三个文件gpad_1.exsgpad_2.exsgpad_3.exs
修改config.exs,在文件末尾添加以下内容

1
import_config “#{Mix.env}.exs”

在每个新文件中,你需要设置riak_core的配置,使其不会与在同一台机器上运行的其他节点冲突,因此我们有:

gpad_1.exs

1
2
3
4
5
6
7
use Mix.Config
config :riak_core,
web_port: 8198,
handoff_port: 8199,
ring_state_dir: 'ring_data_dir_1',
platform_data_dir: 'data_1'

gpad_2.exs

1
2
3
4
5
6
7
use Mix.Config
config :riak_core,
web_port: 8298,
handoff_port: 8299,
ring_state_dir: 'ring_data_dir_2',
platform_data_dir: 'data_2'

gpad_3.exs

1
2
3
4
5
6
7
use Mix.Config
config :riak_core,
web_port: 8398,
handoff_port: 8399,
ring_state_dir: 'ring_data_dir_3',
platform_data_dir: 'data_3'

这样,我们就有了三个不同的环境,你可以在三个不同的终端下启动它们,在开始之前,请记得要使用Erlang 18,
因为我们需要在不同的环境下编译这个应用,因此要在不同的终端下运行下面的每行命令:

1
2
3
4
5
6
7
8
# this is node 1
MIX_ENV=gpad_1 iex --name [email protected] -S mix run
# this is node 2
MIX_ENV=gpad_2 iex --name [email protected] -S mix run
# this is node 3
MIX_ENV=gpad_3 iex --name [email protected] -S mix run

如果你希望像之前一样,仍然使用命令iex --name [email protected] -S mix run来运行一个单节点,
你需要添加一个名为dev。exs的文件,它只有一行:

1
use Mix.Config

现在,你应该能够在同一台机器上运行三个不同的节点了。

做的不错!!!

下一篇中,我们会尝试添加一个简单的ping功能并将三个节点连接在一起。

在结束前,我需要感谢:

敬请期待,下次再见!!!