热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微服务_为什么需要用Clojure来开发你的下一个微服务

篇首语:本文由编程笔记#小编为大家整理,主要介绍了为什么需要用Clojure来开发你的下一个微服务相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了为什么需要用 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 乱弹哦




推荐阅读
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 在Spring与Ibatis集成的环境中,通过Spring AOP配置事务管理至服务层。当在一个服务方法中引入自定义多线程时,发现事务管理功能失效。若不使用多线程,事务管理则能正常工作。本文深入分析了这一现象背后的潜在风险,并探讨了可能的解决方案,以确保事务一致性和线程安全。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 深入RTOS实践,面对原子操作提问竟感困惑
    在实时操作系统(RTOS)的实践中,尽管已经积累了丰富的经验,但在面对原子操作的具体问题时,仍感到困惑。本文将深入探讨RTOS中的原子操作机制,分析其在多任务环境下的重要性和实现方式,并结合实际案例解析常见的问题及解决方案,帮助读者更好地理解和应用这一关键技术。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 本文详细介绍了如何在 Grafana 中独立于 Alertmanager 配置邮件和微信告警。具体步骤包括配置 SMTP 服务器以实现邮件告警,以及设置微信告警的集成方式。通过这些配置,用户可以更灵活地管理和接收来自 Grafana 的告警通知,确保及时响应系统异常。文章还提供了详细的配置示例和常见问题的解决方案,帮助用户顺利完成设置。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • 深入理解Spark框架:RDD核心概念与操作详解
    RDD是Spark框架的核心计算模型,全称为弹性分布式数据集(Resilient Distributed Dataset)。本文详细解析了RDD的基本概念、特性及其在Spark中的关键操作,包括创建、转换和行动操作等,帮助读者深入理解Spark的工作原理和优化策略。通过具体示例和代码片段,进一步阐述了如何高效利用RDD进行大数据处理。 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • 在Android开发中,通过调用系统内置的音频和视频播放功能,可以实现高效、便捷的多媒体处理。本文将详细介绍如何利用Android系统的媒体播放器组件,实现对音频和视频文件的播放控制,包括基本的播放、暂停、停止等操作,以及如何处理播放过程中的各种事件,确保应用的稳定性和用户体验。 ... [详细]
author-avatar
欢乐乡村烤鸭8321
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有