Clojure 的 Web 框架 Ring

MIT
跨平台
2019-05-21
局长

Ring 是一个 Clojure 的 Web 框架,它与 Python 的 WSGI 和 Ruby 的 Rake 非常类似。通过把 HTTP 的细节抽象为简单且模块化的 API,Ring 允许 Web 应用程序由模块化组件构成,这些组件可以在各种应用程序、Web 服务器和 Web 框架之间共享,用来构建类型广泛的应用。

Ring 充分体现了函数式编程的思想 —— 通过一系列函数的组合形成了一个易于理解、扩展的 HTTP 处理链。

Ring 规范里面有如下5个核心概念:

  1. handlers,应用逻辑处理的主要单元,由一个普通的 Clojure 函数实现
  2. middleware,为 handler 增加额外功能
  3. adapter,将 HTTP 请求转为 Clojure 里的 map,将 Clojure 里的 map 转为 HTTP 相应
  4. request map,HTTP 请求的 map 表示
  5. response map,HTTP 相应的 map 表示

这5个组件的关系可用下图表示(By Ring 作者):

 +---------------+
 |  Middleware   |
 |  +---------+  |             +---------+      +--------+
 |  |         |<-- request ----|         |      |        |
 |  | Handler |  |             | Adapter |<---->| Client |
 |  |         |--- response -->|         |      |        |
 |  +---------+  |             +---------+      +--------+
 +---------------+

Hello World

(ns learn-ring.core
  (:require [ring.adapter.jetty :refer [run-jetty]]))

(defn handler [req]
  {:headers {}
   :status 200
   :body "Hello World"})

(defn middleware [handler]
  "Audit a log per request"
  (fn [req]
    (println (:uri req))
    (handler req)))

(def app
  (-> handler
      middleware))

(defn -main [& _]
  (run-jetty app {:port 3000}))

运行上面的程序,就可以启动一个 Web 应用,然后在浏览器访问就可以返回Hello World,同时在控制台里面会打印出请求的 uri。

的码云指数为
超过 的项目
加载中

评论(14)

末世救援
末世救援

引用来自“邪小白”的评论

这是挖坟嘛?难以理解啊。这么多年过去了。

引用来自“下里巴人_770728”的评论

其实如果掌握了clojure语言, 你会发现: Ring的这种函数式的方式, 确实更容易理解, 实质上也更简单. 不过, 确实 list系 的时代感觉已经过去了.
lisp
邪小白
邪小白

引用来自“邪小白”的评论

这是挖坟嘛?难以理解啊。这么多年过去了。

引用来自“下里巴人_770728”的评论

其实如果掌握了clojure语言, 你会发现: Ring的这种函数式的方式, 确实更容易理解, 实质上也更简单. 不过, 确实 list系 的时代感觉已经过去了.
其实我自己还是蛮支持的,虽然可能在工作当作用的不多,但是自己还是会认真看一点clojure的库。不过,花时间在这些,有的没有的上面,确实不划算。真心不如花时间在spring cloud,Sofa cloud等。看源码也是看那些比较值得。$_$
__JM_Joy__
__JM_Joy__

引用来自“__JM_Joy__”的评论

之前迷上了一阵子的clojure,这个语言是lisp方言,强类型、动态类型的语言。语法非常灵活统一,也有很多强大的概念比如数据不变性、软事务内存等等。而且如果IDE良好支持的话,写起来还是蛮舒服的,C风格的编程语言一般是以行作为操作单元的,而lisp方言是以括号作为操作单元的,习惯之后会比行操作更为高效。可惜过于灵活的语言往往不适合团队开发,特别是当团队成员质量良莠不齐的时候,很难受,比PHP还要灵活,毕竟大型项目的质量就是个概率问题,过于灵活的话糊屎和出BUG率就大大提高了。虽然说有type-clojure可以限制类型,但是和原本clojure的生态格格不入,所以后面放弃了,后面转而去重点关注Rust。现在很喜欢Rust的在语法层面和编译期杜绝大部分错误的理念,比如编译通过之后就不会有空指针异常、内存不安全、并发不安全等情况,事实上是解放了生产力。

引用来自“shifeng1983”的评论

生命周期 算不算是设计失误打的补丁

引用来自“__JM_Joy__”的评论

不太懂你的意思,你说的是Rust的生命周期?这是Rust保证内存安全的一个重要特性,怎么可能是补丁???

引用来自“shifeng1983”的评论

rust的杀手锏就是不用手动管理内存,生命周期却是手动管理内存
生命周期就是个类型范型的标记,要求你手动malloc和free了?
s
shifeng1983

引用来自“__JM_Joy__”的评论

之前迷上了一阵子的clojure,这个语言是lisp方言,强类型、动态类型的语言。语法非常灵活统一,也有很多强大的概念比如数据不变性、软事务内存等等。而且如果IDE良好支持的话,写起来还是蛮舒服的,C风格的编程语言一般是以行作为操作单元的,而lisp方言是以括号作为操作单元的,习惯之后会比行操作更为高效。可惜过于灵活的语言往往不适合团队开发,特别是当团队成员质量良莠不齐的时候,很难受,比PHP还要灵活,毕竟大型项目的质量就是个概率问题,过于灵活的话糊屎和出BUG率就大大提高了。虽然说有type-clojure可以限制类型,但是和原本clojure的生态格格不入,所以后面放弃了,后面转而去重点关注Rust。现在很喜欢Rust的在语法层面和编译期杜绝大部分错误的理念,比如编译通过之后就不会有空指针异常、内存不安全、并发不安全等情况,事实上是解放了生产力。

引用来自“shifeng1983”的评论

生命周期 算不算是设计失误打的补丁

引用来自“__JM_Joy__”的评论

不太懂你的意思,你说的是Rust的生命周期?这是Rust保证内存安全的一个重要特性,怎么可能是补丁???
rust的杀手锏就是不用手动管理内存,生命周期却是手动管理内存
我没有抓狂
我没有抓狂

引用来自“__JM_Joy__”的评论

之前迷上了一阵子的clojure,这个语言是lisp方言,强类型、动态类型的语言。语法非常灵活统一,也有很多强大的概念比如数据不变性、软事务内存等等。而且如果IDE良好支持的话,写起来还是蛮舒服的,C风格的编程语言一般是以行作为操作单元的,而lisp方言是以括号作为操作单元的,习惯之后会比行操作更为高效。可惜过于灵活的语言往往不适合团队开发,特别是当团队成员质量良莠不齐的时候,很难受,比PHP还要灵活,毕竟大型项目的质量就是个概率问题,过于灵活的话糊屎和出BUG率就大大提高了。虽然说有type-clojure可以限制类型,但是和原本clojure的生态格格不入,所以后面放弃了,后面转而去重点关注Rust。现在很喜欢Rust的在语法层面和编译期杜绝大部分错误的理念,比如编译通过之后就不会有空指针异常、内存不安全、并发不安全等情况,事实上是解放了生产力。
可是函数式里面不检查也不会出现内存不安全,并发不安全鸭
__JM_Joy__
__JM_Joy__

引用来自“__JM_Joy__”的评论

之前迷上了一阵子的clojure,这个语言是lisp方言,强类型、动态类型的语言。语法非常灵活统一,也有很多强大的概念比如数据不变性、软事务内存等等。而且如果IDE良好支持的话,写起来还是蛮舒服的,C风格的编程语言一般是以行作为操作单元的,而lisp方言是以括号作为操作单元的,习惯之后会比行操作更为高效。可惜过于灵活的语言往往不适合团队开发,特别是当团队成员质量良莠不齐的时候,很难受,比PHP还要灵活,毕竟大型项目的质量就是个概率问题,过于灵活的话糊屎和出BUG率就大大提高了。虽然说有type-clojure可以限制类型,但是和原本clojure的生态格格不入,所以后面放弃了,后面转而去重点关注Rust。现在很喜欢Rust的在语法层面和编译期杜绝大部分错误的理念,比如编译通过之后就不会有空指针异常、内存不安全、并发不安全等情况,事实上是解放了生产力。

引用来自“shifeng1983”的评论

生命周期 算不算是设计失误打的补丁
不太懂你的意思,你说的是Rust的生命周期?这是Rust保证内存安全的一个重要特性,怎么可能是补丁???
s
shifeng1983

引用来自“__JM_Joy__”的评论

之前迷上了一阵子的clojure,这个语言是lisp方言,强类型、动态类型的语言。语法非常灵活统一,也有很多强大的概念比如数据不变性、软事务内存等等。而且如果IDE良好支持的话,写起来还是蛮舒服的,C风格的编程语言一般是以行作为操作单元的,而lisp方言是以括号作为操作单元的,习惯之后会比行操作更为高效。可惜过于灵活的语言往往不适合团队开发,特别是当团队成员质量良莠不齐的时候,很难受,比PHP还要灵活,毕竟大型项目的质量就是个概率问题,过于灵活的话糊屎和出BUG率就大大提高了。虽然说有type-clojure可以限制类型,但是和原本clojure的生态格格不入,所以后面放弃了,后面转而去重点关注Rust。现在很喜欢Rust的在语法层面和编译期杜绝大部分错误的理念,比如编译通过之后就不会有空指针异常、内存不安全、并发不安全等情况,事实上是解放了生产力。
生命周期 算不算是设计失误打的补丁
__JM_Joy__
__JM_Joy__
之前迷上了一阵子的clojure,这个语言是lisp方言,强类型、动态类型的语言。语法非常灵活统一,也有很多强大的概念比如数据不变性、软事务内存等等。而且如果IDE良好支持的话,写起来还是蛮舒服的,C风格的编程语言一般是以行作为操作单元的,而lisp方言是以括号作为操作单元的,习惯之后会比行操作更为高效。可惜过于灵活的语言往往不适合团队开发,特别是当团队成员质量良莠不齐的时候,很难受,比PHP还要灵活,毕竟大型项目的质量就是个概率问题,过于灵活的话糊屎和出BUG率就大大提高了。虽然说有type-clojure可以限制类型,但是和原本clojure的生态格格不入,所以后面放弃了,后面转而去重点关注Rust。现在很喜欢Rust的在语法层面和编译期杜绝大部分错误的理念,比如编译通过之后就不会有空指针异常、内存不安全、并发不安全等情况,事实上是解放了生产力。
maxiaoxia
maxiaoxia

引用来自“邪小白”的评论

这是挖坟嘛?难以理解啊。这么多年过去了。

引用来自“下里巴人_770728”的评论

其实如果掌握了clojure语言, 你会发现: Ring的这种函数式的方式, 确实更容易理解, 实质上也更简单. 不过, 确实 list系 的时代感觉已经过去了.
lisp
下里巴人_770728
下里巴人_770728

引用来自“邪小白”的评论

这是挖坟嘛?难以理解啊。这么多年过去了。
其实如果掌握了clojure语言, 你会发现: Ring的这种函数式的方式, 确实更容易理解, 实质上也更简单. 不过, 确实 list系 的时代感觉已经过去了.

暂无资讯

暂无问答

SwiftStack-Swift容量管理-平滑添加/删除存储

SwiftStack在OpenStack Swift基础上开发的一种产品,当然公司的名称也同样为SwiftStack。 博客:http://swiftstack.com/blog/ SwiftStack里面有篇文章比较好的是Swift Capacity Management 即...

2014/01/24 16:00
1K
0
golang中container/ring包用法

ring包实现了环形链表的操作。 type Ring //Ring类型代表环形链表的一个元素,同时也代表链表本身。环形链表没有头尾;指向环形链表任一元素的指针都可以作为整个环形链表看待。Ring零值是具...

2016/05/20 13:54
106
2
PF_RING 编译问题解决

针对PF_RING的编译中出现的问题,提出解决方法和一些浅薄的解释!

2014/05/12 15:23
159
0
swift如何重新设置备份(replicas)的数目

创建ring的命令是: cd /etc/swift swift-ring-builder account.builder create 18 3 1 swift-ring-builder container.builder create 18 3 1 swift-ring-builder object.builder create 18 ...

2013/09/25 15:42
131
0
Ring

A ring is a continuous, high-speed acquisition to multiple buffers in memory.

2014/11/26 12:35
9
0
OpenStack Swift Ring讲解

同样是翻译官方文档,ring作为swift核心的模块,对于了解swift很有帮助。 注:英语水平有限,翻译的不好,有待改进。 The Rings rings 决定数据在集群中应该存储的位置。有单独的环来管理账户...

2012/07/31 11:14
2.1K
0
Clojure: Ring 中间件原理剖析

Ring 提供了 web 开发所需的基础构件,比如处理请求参数,cookie, session 等等。通过向 http-kit 或 jetty 注册 handler 的方式来提供服务。handler 函数接收一个 request 参数,此参数由调...

2016/03/18 01:22
655
1

没有更多内容

加载失败,请刷新页面

返回顶部
顶部