Skip to content

EMQ源码分析(一):在Windows上用IDEA搭建Erlang编译平台

前言

虽然目前遇到的所有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

官网打开可能会很慢,但下载还算能够接受,可以去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

7f2ed426fe71a978449bdc138db4ea63.png

3、配置IDEA的Erlang插件

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

2a75503253033aa70b0b60df631f0bff.png

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

041dafbfcd0b4fb4194d7d8c55c5ce6b.png

3)重启IDEA

138925d9220a19e36c9e3c47e4307bd5.png

4、配置Rebar3

rebar3用来编译Erlang程序。

1)下载rebar3 打开IDEA,文件 → 设置 → 其他设置 → Erlang扩展工具 → 点击Download the latest rebar3:

0782a99498f762c2512bb5bbb38c58be.png

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

d070ea67a58c6af9f39e24c18e1b5f83.png

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

3d9c4e79dbb78f02422491f8e29004cb.png

5、Erlang Hello World

1)文件 → 新建项目 → Erlang:

64e321176cae7418ad75a0d34fe461f5.png

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

e9de6b32af0c17f67d5bb270e499e906.png

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

aa76af45c81fe4deeaa98f1bba545b3d.png

9f85cf5897f650333147b7e758882407.png

4)将默认生成的代码改为Helloworld

默认生成代码:

erlang
%% API
-export([]).

Helloworld:

erlang
-export([start/0]).

start() ->
  io:fwrite("Hello, world!\n").

5)配置编译

右上角选择编译结构

99e2c817c25f632b4110df5dc4410a42.png

增加一个Erlang Application

70ee8df41521f60af4a73be1327636d4.png

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

a336d2eec2613527ba6168db9fddb0c0.png

6)启动程序

e461f65ccbdba1c36c8d2a5308d88c25.png

6、配置文档

默认文档是去网上在线查的,这里改成本地查。

选择文件 → 项目结构 → SDKs → Erlang 21 → 增加本地的doc文件目录:

e7b378cb51254ec0cb2d53336c443f76.png

可以顺便把网上查的删掉。

ctrl+Q就可以查系统函数了:

70876ac8d4b26d88d52bbed3c022ab21.png

7、用rebar.config来编译,用app.src来运行

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

d6ab28673dc7e076a00b009112965233.png

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

ffca4a7d2c9a3cc9616047b191c99ff4.png

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, []}
]}.

4610e861c191f51835383f7c4067b71d.png

3)配置erlang rebar编译

命令写compile,跳过依赖编译。

615b0dd5848a8d7d24ada30ce975bc9d.png

4)执行rebar编译:

b0db49fa42784676ea6b2f78b0f720ed.png

如果直接执行,会报错,原因是之前设置的rebar3路径被清空了,重新配置一次,这次不用Download了,直接选择。

设置→其他设置→Erlang扩展工具→Path:

4a6e72164d5284e0f19d4e502797b886.png

再编译就能通过了:

8fccc03dd18e0b30d4ed156ba9360082.png

5)执行编译后的程序

找到编译后hello.app、hello.beam的路径:

c9a2966151ac524c927c868461a7b84c.png

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

a33483c7d078037a4f9fc4a55c748400.png

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

b6556d627649b1c90b05c493a0193140.png

二、导入EMQ项目

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

1b80c1c5a87fb2d4c2114a3d5cf38d91.png

可以用Ctrl+点击来跳转函数来源代码,和IntelliJ全家桶逻辑一致。

注意去标记对应的目录:

c60cbfcfbef82fa8994cad4d30ee6892.png

转载请注明出处https://bananaoven.com/articles/255.html | 香蕉微波炉
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。