swagger1st
swagger1st库提供了符合Ring规范的handler,能够根据Swagger定义解析、验证、路由HTTP请求。
使用swagger1st,不是在代码中定义API,而是利用Swagger官方的编辑器根据Swagger 2.0规范定义API。这样产生了一种API优先的开发流程,并且是使用独立于任何开发语言的方式定义API。
friboo
friboo提供了一些component,用于辅助Clojure的微服务应用开发。friboo鼓励采用swagger1st实行API优先的开发方式。
HTTP component
使用def-http-component宏创建HTTP component。http组件启动时,内部调用swagger1st创建handler,并使用jetty适配器运行之。
(ns myapi
(:require [org.zalando.stups.friboo.system.http :refer [def-http-component]))
(def-http-component MyAPI "my-api.yaml" [db scheduler])
(defn my-api-function [parameters request db scheduler]
; 这里能够使用依赖的db和scheduler组件
)
上面的代码创建了MyAPI组件,依赖于db和scheduler组件。my-api-function函数的第一个参数是一个扁平的map,对应的Swagger规范的parameters。
http组件使用:configuration存放配置项,在启动组件时用到它,例如
(map->MyAPI {:configuration {:port 8080
:cors-origin "*.zalando.de"}})
推荐采用下面的方式创建一个http系统。
(ns my-app.core
(:require [org.zalando.stups.friboo.config :as config]
[org.zalando.stups.friboo.system :as system]))
(defn run
[default-configuration]
(let [configuration (config/load-configuration
(system/default-http-namespaces-and :db)
[my-app.sql/default-db-configuration
my-app.api/default-http-configuration
default-configuration])
system (system/http-system-map configuration
my-app.api/map->API [:db]
:db (my-app.sql/map->DB {:configuration (:db configuration)}))]
(system/run configuration system)))
DB component
使用def-db-component宏创建。DB组件本质上是一个兼容db-spec
的数据结构,使用:datasource存放数据源。
(ns mydb
(:require [org.zalando.stups.friboo.system.db :refer [def-db-component]))
(def-db-component MyDB)
与http组件类似,db组件使用:configuration存放配置项,在启动组件时用到。
(map->MyDB {:configuration {:subprotocol "postgresql"
:subname "localhost/mydb"}})