LiveBook 是 elixir 团队新推出的一款利用,能够应用它很不便地在浏览器中编写文章,并且在其中运行 elixir 代码。
我很好奇是否应用 LiveBook 间接更改以后服务器的路由配置,使得咱们能够实现实时部署服务。比方咱们在 LiveBook 里写好一个页面,而后间接配置到某个 url 门路上,他人就能够拜访到。这样感觉十分酷,省去了繁琐的配置打包和公布的流程,而且从实践上是齐全能够实现的。
说干就干,首先我在 fly.io 上部署了一个收费的 livebook 实例,你也能够在本地部署,很不便的。
启动之后在左侧的配置按钮里抉择 Runtime settings
,选则 Embedded
。即在 livebook 自身的 erlang node 里执行代码。livebook 为了保障安全性和隔离性,默认是会另启动一个 node 来执行代码的,也就是 Elixir standalone
选项,但这样咱们是无奈批改路由配置的。
批改好之后,我新建了一个文档,就能够开始写代码了。Livebook 应用的是 Phoenix 框架,其底层的 HTTP 服务器是 Cowboy,再底层是 ranch。所以咱们先通过 :ranch.info()
来获取以后服务器的一些信息。从返回值里咱们晓得了以后的 ranch server 的 ref 是 LivebookWeb.Endpoint.HTTP
,所有的路由(或者叫散发 Dispatch)配置都是在这外面保留。下一步咱们就能够对 dispatch 配置进行批改。
每个 http 申请都会被散发到不同的 handler(这个怎么翻译来着,抓手?),所以咱们首先须要写一个用于测试的 handler。
defmodule TestHandler do
@behaviour :cowboy_handler
def init(req, state) do
req = :cowboy_req.reply(200, %{"content-type" => "text/plain"}, "Hello World!", req)
{:ok, req, state}
end
end
它的性能非常简单,无论收到什么都返回你好世界。接下来将它配置到咱们的 dispatch 外面,留神要保留之前的 dispatch 内容,否则咱们的 livebook 就拜访不了了哈哈。
dispatch = :cowboy_router.compile([{:_, [], [{'/test', [], TestHandler, %{}},
{:_, [], Phoenix.Endpoint.Cowboy2Handler, {LivebookWeb.Endpoint, []}}
]}])
最初应用 cowboy 提供的实时更新性能,将新的配置部署到咱们的 ranch server 外面:
:cowboy.set_env(LivebookWeb.Endpoint.HTTP, :dispatch, dispatch)
试着拜访一下咱们配置的门路。胜利了!