Erlang不仅仅是一种语言,它还是应用程序的操作系统。Erlang开发人员很少编写独立的模块,他们编写库或应用程序,然后将它们捆绑到所谓的发布中。发布版包含Erlang VM以及运行该节点所需的所有应用程序,因此可以直接将其push到生产环境。
本章将带领您完成设置Cowboy、编写第一个应用程序和生成第一个发行版的所有步骤。在本章的最后,你应该知道将你的第一个Cowboy应用push到产品所需的一切。
我们将使用Erlang.mk来构建系统。如果您正在使用Windows,请阅读安装说明Installation instructions,以获得您的环境设置,然后再继续。
首先,让我们为应用程序创建目录。
$ mkdir hello_erlang
$ cd hello_erlang
那我们需要下载erlang.mk。使用下面的命令或手动下载它。
$ wget https://erlang.mk/erlang.mk
现在我们可以引导应用程序。因为我们将要生成一个版本,所以我们也将同时引导它。
$ make -f erlang.mk bootstrap bootstrap-rel
这将创建一个Makefile、一个基础的application,以及创建发布所必需的发布文件。我们已经可以构建并启动这个版本了。
$ make run
...
(hello_erlang@127.0.0.1)1>
输入命令i()。将显示正在运行的进程的相关信息,包括一个名为hello_erlang_sup的进程。这是我们申请的supervisor 。
这个版本目前什么都不做。在本章的其余部分,我们将添加Cowboy作为一个依赖项,并编写一个简单的“Hello world!”处理器。
我们将修改Makefile来告诉构建系统它需要获取和编译Cowboy:
PROJECT = hello_erlang
DEPS = cowboy
dep_cowboy_commit = 2.8.0
DEP_PLUGINS = cowboy
include erlang.mk
DEP_PLUGINS行告诉构建系统加载Cowboy提供的插件。其中包括我们即将使用的预定义模板。
如果你现在make run,Cowboy将会包含在版本中并自动启动。然而,这还不够,因为Cowboy默认不会做任何事情。我们还是得让Cowboy 监听连接。
首先,我们定义Cowboy 将使用的路由来将请求映射到处理程序模块,然后启动监听器。这最好在应用程序启动时完成。
打开 src/hello_erlang_app.erl文件,并在start/2函数中添加必要的代码,使其看起来像这样:
start(_Type, _Args) ->
Dispatch = cowboy_router:compile([
{'_', [{"/", hello_handler, []}]}
]),
{ok, _} = cowboy:start_clear(my_http_listener,
[{port, 8080}],
#{env => #{dispatch => Dispatch}}
),
hello_erlang_sup:start_link().
路由将在Routing章节中详细解释。在本教程中,我们将 "路径/" 映射到处理程序模块hello_handler。这个模块还不存在。
构建并启动发行版,然后在浏览器中打开http://localhost:8080。您将得到一个500的错误,因为模块找不到。打开任何其他URL,如http://localhost:8080/test,都会导致404错误。
Cowboy提供不同类型的处理程序,包括REST和Websocket处理程序。在本教程中,我们将使用普通的HTTP处理程序。
从模板生成一个处理程序:
$ make new t=cowboy.http n=hello_handler
然后,打开src/hello_handler.erl文件,并像这样修改init/2函数来发送回复。
init(Req0, State) ->
Req = cowboy_req:reply(200,
#{<<"content-type">> => <<"text/plain">>},
<<"Hello Erlang!">>,
Req0),
{ok, Req, State}.
上面的代码所做的是发送一个200 OK回复,内容类型头设置为text/plain,响应主体设置为Hello Erlang!
如果你运行发行版并在浏览器中打开http://localhost:8080,你应该会看到一个漂亮的Hello Erlang!