授权协议 MIT
操作系统 跨平台
软件类型 开源软件
所属分类 服务器软件HTTP服务器
开源组织
地区 不详
投 递 者 局长
适用人群 未知
收录时间 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。

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (14)

加载中

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

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

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

其实如果掌握了clojure语言, 你会发现: Ring的这种函数式的方式, 确实更容易理解, 实质上也更简单. 不过, 确实 list系 的时代感觉已经过去了.
lisp
2019/05/28 12:34
回复
举报

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

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

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

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

引用来自“__JM_Joy__”的评论

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

引用来自“shifeng1983”的评论

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

引用来自“__JM_Joy__”的评论

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

引用来自“shifeng1983”的评论

rust的杀手锏就是不用手动管理内存,生命周期却是手动管理内存
生命周期就是个类型范型的标记,要求你手动malloc和free了?
2019/05/27 11:31
回复
举报

引用来自“__JM_Joy__”的评论

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

引用来自“shifeng1983”的评论

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

引用来自“__JM_Joy__”的评论

不太懂你的意思,你说的是Rust的生命周期?这是Rust保证内存安全的一个重要特性,怎么可能是补丁???
rust的杀手锏就是不用手动管理内存,生命周期却是手动管理内存
2019/05/27 10:38
回复
举报

引用来自“__JM_Joy__”的评论

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

引用来自“__JM_Joy__”的评论

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

引用来自“shifeng1983”的评论

生命周期 算不算是设计失误打的补丁
不太懂你的意思,你说的是Rust的生命周期?这是Rust保证内存安全的一个重要特性,怎么可能是补丁???
2019/05/26 23:42
回复
举报

引用来自“__JM_Joy__”的评论

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

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

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

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

其实如果掌握了clojure语言, 你会发现: Ring的这种函数式的方式, 确实更容易理解, 实质上也更简单. 不过, 确实 list系 的时代感觉已经过去了.
lisp
2019/05/26 10:30
回复
举报

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

这是挖坟嘛?难以理解啊。这么多年过去了。
其实如果掌握了clojure语言, 你会发现: Ring的这种函数式的方式, 确实更容易理解, 实质上也更简单. 不过, 确实 list系 的时代感觉已经过去了.
2019/05/26 09:13
回复
举报
更多评论
暂无内容
发表于运维专区
2014/05/10 14:13

injector Christian Dior Ring ring could

A leaking injector Christian Dior Ring ring could be the cause of this problem, unfortunately this could also be attributed to a faulty oil pump or multitude of other issues, but a leaking o-ring would be a great place to check first. B) Simple Deterioration: If you are experiencing a rough idle or loss of power this could be due to deteriorating injector o-rings.Leader Beta Gamma, (business or...

0
0
2014/11/26 12:35

Ring

Table of Contents Description Common Applications What To Expect 1. Description A ring is a continuous, high-speed acquisition to multiple buffers in memory. Basic steps in performing a ring acquisition are as follows: Initialize the interface Select and allocate the number of buffers necessary to ensure that no frames will be lost under the worst case of processing and operating system delays ...

0
0
发表了博客
2015/07/05 17:15

ring buffer

1. 有关ring buffer的理解 1) ring buffer位首尾相接的buffer,即类似生活中的圆形跑道; 2) 空闲空间+数据空间=ring buffer大小 3) ring buffer的读写,类似生活中在圆形跑道上的追赶游戏,领跑者位write,追赶着为read 4) 如果read跑的太快,追上write,追赶者read要停下来,否则游戏结束。即保证没有数据空间时,不再从ring buffer中读取数据; 5) 如果write跑的太快,反过来套圈要超过read,此时领跑者write也要停下来。即保...

0
1
发表了博客
2018/01/26 12:34

[HDU2296]Ring

vjudge ###Description For the hope of a forever love, Steven is planning to send a ring to Jane with a romantic string engraved on. The string's length should not exceed N. The careful Steven knows Jane so deeply that he knows her favorite words, such as "love", "forever". Also, he knows the value of each word. The higher value a word has the more joy Jane will get when see it. The weight of a ...

0
0
发表了博客
2019/07/05 16:32

CPU的Ring等级

Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,RING0,RING1,RING2,RING3。 RING0层拥有最高的权限,RING3层拥有最低的权限。 Windows只使用其中的两个级别RING0和RING3。按照Intel原有的构想,应用程序工作在RING3层,只能访问RING3层的数据,操作系统工作在RING0层,可以访问所有层的数据,而其他驱动程序位于RING1、RING2层,每一层只能访问本层以及权限更低层的数据。如果普通应用程序企图执行RING0指令,则...

0
0
发表了博客
2020/01/18 14:33

【DPDK】【ring】从DPDK的ring来看x86无锁队列的实现

【前言】   队列是众多数据结构中最常见的一种之一。曾经有人和我说过这么一句话,叫做“程序等于数据结构+算法”。因此在设计模块、写代码时,队列常常作为一个很常见的结构出现在模块设计中。DPDK不仅是一个加速网络IO的框架,其内部还提供众多的功能组件,rte_ring就是DPDK内部提供的一种无锁队列,本篇文章将从使用的角度出发阐述DPDK的ring怎么用?在怎么用的角度上再来阐述ring无锁的实现,最后将探讨实现无锁队列的关键...

0
0
发表于软件架构专区
2016/04/10 00:08

PF_RING 上头

PF_RING

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
14 评论
21 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部