19年以来,clojure社区新出了不少好东西,这里做个整理。

1. 构建工具

leiningenboot很好用,但是22年我建议使用clojure cli.

cli更轻量,不仅支持lein的大部分能力,而且启动十分迅速, 自带许多实用的新功能。

启动速度更快

使用lein

1
2
3
4
5
# lein new app test-lein
$ time lein run
Hello, World!

lein run  4.88s user 0.53s system 113% cpu 4.771 total

使用cli, 普通app模板

1
2
3
4
5
# clojure -X:new :name test/project
$ time clj -A:run-m
Hello, World!

clj -A:run-m  1.63s user 0.15s system 202% cpu 0.879 total

支持git依赖

这样你个人未开发完成的库,或者fork出来没PR的库,或者你觉得某个commit最稳定,就能独立使用了。

例如这个库

1
2
3
4
5
;; deps.edn
{:deps {io.github.cognitect-labs/test-runner
                {:git/url "https://github.com/cognitect-labs/test-runner"
                 :sha "2d69f33d7980c3353b246c28f72ffeafbd9f2fab"}}
}

支持Tools.build

这是一个较新的feature, 可以使用clj -T:buildtool args 来更方便的使用第三方库作者开发的各种小工具, 不用自己维护各种alias。 例如sean的clj-new, 可以这样使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# one-off to install clj-new as a tool:
clojure -Ttools install com.github.seancorfield/clj-new '{:git/tag "v1.2.381"}' :as clj-new

# commands to create new projects:

# create a new app:
clojure -Tclj-new app :name myname/myapp
# create a new library:
clojure -Tclj-new lib :name myname/mylib
# create a new template:
clojure -Tclj-new template :name myname/mytemplate
# create a new project from a public template:
clojure -Tclj-new create :template electron-app :name myname/myelectron-app

另外,可以使用build.clj文件来像boot或者gradle一样自定义构建过程。

其它的feature感兴趣的读者可自行去官网或者github查看。 建议配合babashka一起用。

2. 推荐的库

clojure社区推荐使用底层库(low level library)组合成一个自己想要的app,而不是框架(frameworks).

这里基于个人经验,推荐一些2022年常用的库

http server相关

  • reitit: 芬兰metosin家的http路由库, 建议结合malli使用
  • selmer: 模板渲染, 作者是luminus的作者,假如你需要html的话
  • undertow: undertow server库的clj桥接版本, 封装了一些clj到java层的胶水代码。
  • jetty: jetty或者tomcat, 老牌server了,性能肯定过的去, 玩黑科技比不过undertow或者裸netty等。

类型标注

2022年了,可能clj同学们也意识到了动态类型的维护性问题。所以官方出了个spec来做类型标注。 但是spec实在是难用,这里类型标注仅推荐一个,那就是

  • malli: 还是芬兰metosin家的, 使用hiccup语法的数据驱动型校验,功能十分易用强大。

依赖注入

工程一大,依赖真的不好管理,依赖注入目前有component, mountintegrant三种方案,这里仅推荐一个,那就是

  • integrant: 一个微框架,适用于数据驱动型架构。这玩意儿基于multi method, 相较于其它二者扩展性好很多。而且整个系统各部分可以真正配置化插件化,非常爽。

talking to SQL database

链接数据库这个应该没啥好说的,不推荐conman, 其它随意

  • honeysql : sql like DSL, 用过都说好
  • next-jdbc : 比clojure.java.jdbc强大, 改善了性能和易用性.

连接池建议java是啥就继续用啥,简单封装下完事儿,熟悉带来优雅

调度任务

单机调度任务用用quartz就完事儿了, 分布式的建议java用啥继续用啥, 例如xxl-job

  • cronut: 一个quartz的简单封装,比较老了但是能用

缓存

缓存建议直接使用core.cache极其扩展

  • redis: 建议自行用几行代码封装一把,实现core.cache的几个protocol

RPC

这个就见仁见智了,偏爱java的可以怼一把dubbo, 可能缺点胶水java代码。

个人十分建议直接上grpc, 并阅读陈天老师的这篇文章protobuf 为经络,gRPC为骨架,这能大大降低动态语言的维护成本。

APM产品和指标统计

APM这种感觉也没啥好说的,只要支持open tracing的都ok, 可以针对Java做个简单封装

例如这个文件,没几行就写完了上报jaeger的代码

指标统计开源产品可能都是Prometheus+Grafana了,这里推荐个简单的client

  • iapetos: Prometheus Java Client的clojure封装

前端

放弃cljs吧,我建议你直接使用React或者Vue, 别折腾了。cljs的报错几乎不可调试。

3. 后记

19年以后clojure社区不知道为啥又死灰复燃了,各种talk和meetup. 高质量库也层出不穷。 如果有本文没有发现的高质量库,欢迎评论里留言一起讨论

期望国内也能出更多clojure大牛和工作岗位~