前言
虽然目前遇到的所有Broker设计问题都似乎得到了解决,但还是希望能够借鉴更多优秀的代码设计思路。Java开源的Broker代码都有局限性,而免费开源的完整的速度快的MQTT Broker也就只有EMQ了,没有办法只能花时间研究Erlang和EMQ源码了。首先需要搭建Erlang的IDE,之前用IDEA来作为Lua的IDE,没想到IDEA还能作为Erlang的IDE,实在是太好用了。
一、用IDEA搭建Erlang集成开发环境
1、去Erlang官网下载对应的Erlang程序
官网地址:http://www.erlang.org/downloads
下载链接:如果知道版本就会很简单,只需要替换对应版本的部分,例如下载21.3:
- 源码:http://erlang.org/download/otp_src_21.3.tar.gz
- win32:http://erlang.org/download/otp_win32_21.3.exe
- win64:http://erlang.org/download/otp_win64_21.3.exe
官网打开可能会很慢,但下载还算能够接受,可以去CSDN找一些资源下载会快一些。
- EMQ 2.3.11 的编译版本是 Erlang OTP 20.0,想要学习MQTT3.1/3.1.1的可以看2.x版本代码
- EMQ X 3.1-beta.1 Released 的编译版本是Erlang OTP 21.2,想要学习MQTT5.0的可以看3.x的代码
我下载的20.0.1。
2、安装Erlang
1)正常安装EXE
2)配置Path环境变量,例如:E:\erl10.0.1\bin
3)测试是否安装成功:cmd → erl:

3、配置IDEA的Erlang插件
1)打开IDEA,文件 → 设置 → 插件,搜索Erlang,界面提示本地们找到,是否搜索库:

2)搜索仓库,在线安装Erlang插件

3)重启IDEA

4、配置Rebar3
rebar3用来编译Erlang程序。
1)下载rebar3 打开IDEA,文件 → 设置 → 其他设置 → Erlang扩展工具 → 点击Download the latest rebar3:

选择合适的文件夹,下载后,会自动填充路径:

2)设置rebar3为编译器 设置 → 构建、执行和部署 → 编译器 → Erlang编译器 → 勾选Compile project with rebar、Add debug info:

5、Erlang Hello World
1)文件 → 新建项目 → Erlang:

2)配置SDK为Erlang安装根目录,会自动识别Erlang:

3)建立一个名为hello的Erlang的文件


4)将默认生成的代码改为Helloworld
默认生成代码:
erlang
%% API
-export([]).Helloworld:
erlang
-export([start/0]).
start() ->
io:fwrite("Hello, world!\n").5)配置编译
右上角选择编译结构

增加一个Erlang Application

选择工程、选择要使用哪个模块的哪个函数来启动

6)启动程序

6、配置文档
默认文档是去网上在线查的,这里改成本地查。
选择文件 → 项目结构 → SDKs → Erlang 21 → 增加本地的doc文件目录:

可以顺便把网上查的删掉。
ctrl+Q就可以查系统函数了:

7、用rebar.config来编译,用app.src来运行
EMQ的所有项目都不是直接运行,而是编写rebar.config的,这样可以用rebar.lock去控制插件版本,就和前端的package.json、package-lock.json类似:

xxx.app.src则是入口,例如emqx-2.3.11首先会启动这些代码:

1)建立rebar.config
erlang
{escript_incl_extra,[{"priv/templates/*","."}]}.
{erl_opts,
[
debug_info,
{src_dirs,
[
"src"
]}
]
}.
{pre_hooks,[]}.
{cover_enabled, true}.
{sub_dirs,[
"src"
]}.2)建立hello.app.src(OTP application resource file)
注意这里直接写带“.”的名字会报错,需要先写hello,再重命名为hello.app.src。
如果写的是hello.erl,mod则写hello:
erlang
{application, hello, [
{description, ""},
{vsn, "1"},
{registered, []},
{applications, [
kernel,
stdlib
]},
{mod, {hello, []}},
{env, []}
]}.
3)配置erlang rebar编译
命令写compile,跳过依赖编译。

4)执行rebar编译:

如果直接执行,会报错,原因是之前设置的rebar3路径被清空了,重新配置一次,这次不用Download了,直接选择。
设置→其他设置→Erlang扩展工具→Path:

再编译就能通过了:

5)执行编译后的程序
找到编译后hello.app、hello.beam的路径:

重新配置一个erlang application,将working directory配置成相应路径:

执行hello2,会产生和之前一样的结果:

二、导入EMQ项目
我下载的最后一个EMQ2.3.11版本代码,直接导入是不会高亮的,我们先用IDEA建立一个空的Erlang工程,然后将EMQ代码复制到该工程下,重新打开工程,就会语法高亮了:

可以用Ctrl+点击来跳转函数来源代码,和IntelliJ全家桶逻辑一致。
注意去标记对应的目录:




粤公网安备44030602007943号