Erlang/Elixir 模仿 Rails 的 Erlang Web 框架 --- Chicago Boss

saiga · 2013年12月28日 · 最后由 hao 回复于 2015年05月04日 · 6565 次阅读

跟风一下..

Chicago Boss

一个模仿 Rails 的 Erlang Web 框架。

官网上的介绍:

  • 100% 异步 IO
  • 默认支持 WebSocket 和 长连接
  • 支持 Elixir
  • 支持缓存 (only memcache)
  • NoSQL && SQL
  • 内置 email 服务

PS: 基于 Erlang 带来的优点,坛里搜搜就有,这里就不一一说了。

内建模块

Chicago Boss 主要由以下七个部分组成:

  1. BossDb: 对数据库操作,模仿 AR
  2. Models: 定义数据模型
  3. ModelNew: 模型事件监听
  4. WebController: 控制器
  5. BossMq: 内建的消息队列
  6. session
  7. template

模型 在 CB 里定义模型是非常简单的,创建 src/model/article.erl

%% src/model/article.erl
-module(article, [Id, Title]).
-compile(export_all).

运行 ./init-dev.sh,Chicago Boss 会启动服务,并送你一个 console,免费的

在命令行里键入:

Article = article:new('id', "This is a title").
{ok, SavedArticle} = Article:save().

SavedArticle:title().

ok.到此结束

PS: Chicago Boss 会对 src/model/*.erl 进行特殊处理,所以不是操作数据库的模型不能放到里面。

服务器別关了,下面轮到控制器...

控制器 创建 src/controller/example_hello_controller.erl:

-module(example_hello_controller, [Req]).
-compile([export_all]).

index('GET', []) ->
    {output, "Hello, world."}.

打开 http://0.0.0.08003/hello/index

我要输出 html!

output 改成 ok,创建 /src/view/hello/index.html

ok.到此结束

Template {ignore, "不说也罢"}.

是拙劣的模仿者吗?

模仿 Rails 注定干不过 Rails,CB 明白了这一点。所以他也在尽全力放大 Erlang 的优点。

long-poll

首先请让我吼一句: “实现得 TM 太完美了”

实际上,CB 并没有刻意对 long-poll 做额外的工作,而是 BossMq 带来的彩蛋。

BossMq 主要有两个方法 push/pull 。一个异步一个同步,也就是说 pull 会堵塞进程。性质跟 long-pull 非常类似,所以写起来非常简单

%% controller action
receive_chat('GET', []) ->
  {ok, Timestamp, Messages} = boss_mq:pull("my-channel", now)
  {output, Messages}.
%% Send Message
boss_mq:push("my-channel", <<"Secret Message">>)

客户端只要请求 /receive_chatboss_mq:pull 就会堵塞直到 boss_mq:push

BossNews

一个可插拔的模型事件监听模块,结合 model hook 和 mq 的产物。

场景:一个耗时的操作,比如在用户注册后发一封邮件。

通常做法是在 save hook 里面推到 MQ 来发送,但是在 CB 我们可以利用 BossNews 来完成这一需要。

来,骚年,打开你的 terminal

{ok, WatchId} = boss_news:watch("articles", fun(_, _) ->
  error_logger:info_msg("Did you see that??~n") end).

创建一个新的 Article,控制台打印 "Did ...."

BN 支持 create/update/delete 事件,支持单个记录的某个字段监听,也支持动态取消监听。

boss_news:cancel_watch(WatchId).

结语

Chicago Boss 是能吸引我动手写东西的 Erlang web framework,功能比不过大而全的 Rails, Erlang 是他最大的亮点,模板是他最大的硬伤,个人认为适合做小型站点、web app 或者 web server。 虽然用的人不多但是文档齐全,github 上目前还很活跃。而且官方说已经可以进入生产阶段。

模板怎么就硬伤了 ... BossDB 才是硬伤 ...

模板可以用 AngularJS 之类的 MV* 框架解决嘛

3 楼 已删除

#1 楼 @bhuztez 抱歉,我搞错了。是 helper,CB 写 form view 太痛苦了..

#1 楼 @bhuztez B 大能评两句吗?😄

Erlang 的语法是硬伤

#6 楼 @search 据说可以支持 Elixir,具体情况如何就等大神们来科普下了

#6 楼 @search Erlang 的语法是硬伤的话,几乎所有语言的语法都是硬伤了...

这玩意儿不值得推荐

#11 楼 @saiga erlang 有自己的哲学,单纯模仿是错误的,比如存储,已经有 mnesia 了

#12 楼 @fsword 说得相当好。

任何语言都想跑到其他语言那里去抢地盘。

#12 楼 @fsword #13 楼 @ruby_sky

什么哲学= =?mnesia 是支持的,QLC 应该不支持的了

#15 楼 @saiga 我的观点可能和 bhuztez 大概差不多,erlang 框架里面搞个 AR 是很怪异的事情,相对来说,我更倾向 cowboy

#16 楼 @fsword 是 Model 还是 BossDB? Model 的话 CB 只是做了一点点修改,本质上还是 曾经 已经废弃的 Parameterized module,只是 CB 又把他加回来了。BossDB 的话不置评,因为目前还处在 Helloworld 阶段。

Cowboy 做 server 非常不错,也支持 websocket。但是只适合嵌入别的 web 应用,做带页面的 web 就不要想了。 PS: CB 也基于 cowboy(可替换 mociweb)

#8 楼 @bhuztez 现在感觉 Erlang 的语法挺好的,一旦你习惯了它的设定。

#18 楼 @googya Erlang 语法当然好了。

Web pages, web app, CB 都不错。简单高效即优雅。这么多年唯一让我感动的框架。也就是为什么 Evan 可以走掉了。无可添加,无可拿去。也只有 Erlang 写的东西,才可以不维护,说白白,东西在,好不好,用不用,都在那里。我做了一个东西,不过太烂,个人水平问题,还在修改,好了跟大家分享。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号