为什么需要用 Clojure 来开发你的下一个微服务
Posted OSC开源社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么需要用 Clojure 来开发你的下一个微服务相关的知识,希望对你有一定的参考价值。
开发团队之所以选择将某些功能块作为微服务来实现是有很多原因的。我认为最重要的原因有:
代码重用:多个团队可以利用你所构建的内容。例如,检索(search)、文件存储(file storage)或pub/sub。
使用微服务可以独立于应用程序对功能进行扩展
可以自由地进行技术选择
本文重点讨论以上三点。
自由地进行技术选择
这是属于微服务架构的一个非常重要的属性。微服务意味着每个服务都很小。至于有多小通常取决于公司或团队,但我听说有些微服务的代码不超过100行,还有些微服务有几千行代码(如果是Java代码,我仍然认为它很小)
既然微服务意味着每个服务都很小,所以鼓励开发人员可以使用他们认为的最好技术。如果事实证明那是很糟糕的选择,也没关系-我们就当学习了,并且会考虑将这些新知识用于未来的项目。既然微服务的代码多半只有几百行,所以有时开发团队甚至有可能决定用另一种更合适的语言重写微服务。
这都很好。但是既然可以完全自由地进行技术选择,那么为什么不选择Clojure呢?
现代语言Lisp
"Lisp是用秘密的外星人技术开发的语言。" —
Clojure是运行在Java虚拟机上的现代Lisp语言。基于JVM有很多优点:
经过数十年的人力投入,JVM的运行速度很快。
在一个广泛的问题域中有非常多的功能强大的库。你只需集中精力去解决问题而无需一切从头开始。
JVM被广泛应用于一些小型和大型企业;应用JVM意味着开发的产品会被更多用户采用。
所以说,JVM很好,并且我们也在使用着Java。那为什么还要转换语言呢?
是这样, Java具有它自己的一些折衷方式。但它缺少其它平台认为理所当然应该具有的功能 -比如lambdas,尽管Java 8已经对此进行了修正。Java的类型系统限制过多,并且其类型推断也不够理想。Java也没有,使其代码过度繁琐。
另外Java一般的开发反馈周期太长。为了运行、测试程序,在一天内可能需要多次重启JVM - 哪怕你只是修改一行代码 (HotSwap热部署补丁对此有所缓解)。由于所需的结构数量也仅仅是开始,因此实验变得很难。最后,交互式开发环境的缺乏也让人受不了。
Lisp是什么样子的?
"Lisp不是一门语言,它是一种构建素材。" — Alan Kay
作为Lisp ,它非常灵活,采用一种固执的数据驱动编程方法,通过宏功能提供了最大的延展性。必须指出的是Lisp宏和其它的宏非常不同,比如说,C宏。C宏是通过宏定义和C预处理器的处理以一种简单的方式在将源代码中找到的名字替换掉。
然而Clojure宏采用的方式是操作Clojure代码本身 - 是的,你可以转换 (抽象语法树)! - 包括有能力控制事情得以完全评估的时间和条件。
实验之美
“学习Lisp几周后,我发现用其它任何一种语言编程都有难以忍受的约束。” — Paul Graham, Road to Lisp
如果我们还必须经历这种传统的开发周期的话,那么我们所有的能力将被耗尽: 改变源码->重新编译/重新开始运行时(runtime)-> 运行代码以查看结果/进行测试-> 清除, 重复。
我之所以要成为一名软件开发人员,主要的原因之一就是创造的快感。 编写代码并且能立刻看到自己劳动成果是一种很奇妙的体验! 我认为我们应当尽我们所能减少看到刚刚创建的东西的结果所花费的时间。Clojure - 确实很大程度上就像Lisp - 配置了一个高级的 (Read-Eval-Print-Loop) 环境,并且和许多编辑器亲密集成,例如Emacs、 Vim、IntelliJ和Eclipse。
但是对于每天都要进行开发,这意味着什么呢?
我正常的Clojure工作流主要是在Emacs中启动一个REPL会话-不过这也同样适用于IntelliJ、Vim和Eclipse-并且无论我做什么任务,期间,我都会让它自己运行着。让某个REPL会话运行几天甚至几周也很正常。我可以在编辑器中修改代码,并且使用某个简单的快捷键就能在运行着的REPL中立刻对结果进行重新评估,因此这就完全消除了JVM启动时间方面的缺点。
这使得使用Clojure进行开发更多地属于实验驱动。探索的成本最低,因此最终通过REPL提高了程序质量。这也适用于测试,对于运行它们同样也是成本低效果佳。
函数式编程和并发
"选择不可变性(immutability),看看它的效果。" — Rich Hickey, Clojure creator
Clojure和其它的Lisp“方言”不同之处在于它的独特的函数式编程方法。正如很多其它的语言一样,Clojure 也支持高阶函数。这意思是说函数是第一等公民,函数可以用作参数也可以作为其它函数的返回值。
但是在默认情况下Clojure中的数据是不可修改的。如果你创建了一个map、一个list、一个vector等等,根据定义都是不可修改的,一旦创建就无法改变。
这有许多好处:
不可修改的数据结构在默认情况下是线程安全的,这使得开发并发软件变得更简单;
你可以很容易地查看历史记录;
没必要担心其它的代码路径会修改你的数据。这根本不可能发生;
另外Clojure附带了很多并发实用工具,例如和, core.async是(可以认为是通道)的库实现。
Clojurescript
Clojure是一个功能强大的开发环境,但是当我们开发web程序时,最有可能仍然实用javascript,而JavaScrit作为一门语言存在很大的局限性。Clojurescript是用于浏览器中的Clojure编译器,它将Clojure的全部功能带到了前端web开发环境中。(但可以肯定的是,你也可以在Node.js中运行它)
许多公司已经在产品中采用了Clojurescript,包括我们的。我们获得的最主要的一个好处是能够轻松地在服务器和浏览器之间共享我们的核心算法。我认为 Clojurescript可能是当前可以使用的最成熟的JavaScript替代品。
结论
这是一篇令我手抖的文章,说实话,到目前为止很难用语言把所有的优点都列出来。因此我强烈建议你观看由 Bruce Hauman所录制的 视频——它是对本文所描述内容做了一个非常好的流程梳理的一个例子。
如果你有兴趣学习更多的关于 Clojure内容,我强烈建议你加入。我们是很友善的一个群组,并且欢迎不同水平的人参加。
如果你不在悉尼,你也可以在Clojure官网上从 里找到你当地的用户组。
了解详情请点击阅读原文
开源中国|ID:oschina2013
每天为你送上精选资讯早点
还有每天的 OSChina 乱弹哦
以上是关于为什么需要用 Clojure 来开发你的下一个微服务的主要内容,如果未能解决你的问题,请参考以下文章
2018 年你需要知道的 Vue.js 组件库,完善你的应用开发!