做者 | 柯然(邪影)
來源|阿里巴巴雲原生公衆號html
Swagger 是一個規範和完整的前端框架,用於生成、描述、調用和可視化 RESTful 風格的 Web 服務。Swagger 規範也逐漸發展成爲了 OpenAPI 規範。前端
Springfox 是一個集成了 Swagger,基於 Sring MVC/Spring Webflux 實現的一個 Swagger 描述文件生成框架,經過使用它定義的一些描述接口的註解自動生成 Swagger 的描述文件,使 Swagger 可以展現並調用接口。java
相信不少人都據說和使用過 Swagger 和 Springfox,這裏就再也不贅述了。git
Dubbo-Admin 中有接口測試功能,可是缺乏接口描述的文檔,因此該測試功能比較適合接口開發人員用於測試接口。而其餘人想要使用該功能就必須先經過接口開發者編寫的文檔或者其餘方式,瞭解清楚接口信息才能使用該功能測試接口。github
Dubbo 這邊有沒有集合文檔展現和測試功能,能夠不用寫文檔就能把接口直接給調用方,相似 Swagger/Springfox 的工具呢?web
以前作過一些調研,找到一些相似的工具:spring
它們都有一個共同點:會把你的提供者變爲 Web 項目。固然有些提供者是經過 web 容器加載啓動的,甚至也有和 web 工程在一塊兒的,那就無所謂了。apache
但也有非 web 的提供者,爲了文檔我得把它變爲 web 項目嗎?(還要引入一堆 Web 框架的依賴?好比 Spring MVC?)或者說生產環境打包時,刪除它的引用和代碼裏的相關注解? 有沒有簡單點的方式呢?json
OpenAPI 中沒有 RPC 的規範,Swagger 是 OpenAPI 的實現,因此也不支持 RPC 相關調用。Springfox 是經過 Swagger 實現的 RESTful API 的工具,而 RESTful 又是基於 Web 的,Dubbo 無法直接使用。咱們最終選擇了本身實現:api
今天,我很高興的宣佈:Dubbo 用戶也能夠享受相似 Swagger 的體驗了 -- Dubbo-Api-Docs 發佈了。
Dubbo-Api-Docs 是一個展現 dubbo 接口文檔,測試接口的工具。
使用 Dubbo-Api-Docs 分爲兩個主要步驟:
在 dubbo 項目引入 Dubbo-Api-Docs 相關 jar 包,並增長相似 Swagger 的註解。
經過以上兩個步驟,便可享受相似 Swagger 的體驗,而且能夠在生產環境中關閉 Dubbo-Api-Docs 的掃描。
Dubbo-Api-Docs 目前經過直連服務節點的方式獲取該服務的接口列表。測試接口時,能夠直連也能夠經過註冊中心,將來會增長經過註冊中心獲取服務列表的方式,並根據 Dubbo 的升級規劃增長新的功能支持,也會根據社區的需求增長功能。
Dubbo-Api-Docs 會在服務提供者啓動完畢後,掃描 docs 相關注解並將處理結果緩存,並增長一些 Dubbo-Api-Docs 相關的 Dubbo 提供者接口。緩存的數據在未來可能會放到 Dubbo 元數據中心中。
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-api-docs-annotations</artifactId> <version>${dubbo-version}</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-api-docs-core</artifactId> <version>${dubbo-version}</version> </dependency>
爲避免增長生產環境中的資源佔用,建議單首創建一個配製類用於啓用 Dubbo-Api-Docs,並配合 @Profile("dev") 註解使用。>
固然,Dubbo-Api-Docs 僅在項目啓動時多消耗了點 CPU 資源,並使用了一點點內存用於緩存,未來會考慮將緩存中的內容放到元數據中心。
git clone -b 2.7.x https://github.com/apache/dubbo-spi-extensions.git
進入 dubbo-spi-extensions/dubbo-api-docs/dubbo-api-docs-examples 目錄。
dubbo-api-docs-examples 中有兩個子模塊:
下面咱們在這兩個子模塊中增長 Dubbo-Api-Docs:
examples-api:
maven 引入:
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-api-docs-annotations</artifactId> <version>2.7.8</version> </dependency>
org.apache.dubbo.apidocs.examples.params 中有兩個 Bean,咱們來爲它們添加 docs 註解。
public class QuickStartRequestBean { @RequestParam(value = "You name", required = true, description = "please enter your full name", example = "Zhang San") private String name; @RequestParam(value = "You age", defaultValue = "18") private int age; @RequestParam("Are you a main?") private boolean man; // getter/setter略... }
public class QuickStartRespBean { @ResponseProperty(value = "Response code", example = "500") private int code; @ResponseProperty("Response message") private String msg; // getter/setter略... }
因爲咱們只挑選了部分接口做爲演示,到此這些接口涉及的 docs 註解添加完畢。
examples-provider:
maven 引入:
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-api-docs-core</artifactId> <version>2.7.8</version> </dependency>
咱們挑選一個接口做爲演示:
org.apache.dubbo.apidocs.examples.api.impl.QuickStartDemoImpl 中的 quickStart 方法。
QuickStartDemoImpl 實現了 api 包中的 org.apache.dubbo.apidocs.examples.api.IQuickStartDemo 接口。
@DubboService @ApiModule(value = "quick start demo", apiInterface = IQuickStartDemo.class, version = "v0.1") public class QuickStartDemoImpl implements IQuickStartDemo { @ApiDoc(value = "quick start demo", version = "v0.1", description = "this api is a quick start demo", responseClassDescription="A quick start response bean") @Override public QuickStartRespBean quickStart(@RequestParam(value = "strParam", required = true) String strParam, QuickStartRequestBean beanParam) { return new QuickStartRespBean(200, "hello " + beanParam.getName() + ", " + beanParam.toString()); } }
到此 docs 相關注解已添加完畢,下面咱們來開啓 Dubbo-Api-Docs。新增一個配製類,位置任意,只要能被 spring boot 掃描到就行。
咱們在 org.apache.dubbo.apidocs.examples.cfg 包中新增一個配製類 DubboDocConfig:
@Configuration @Profile("dev") // 配合 Profile 一塊兒使用, 在 profile 爲 dev 時纔會加載該配製類 @EnableDubboApiDocs // 開啓 Dubbo-Api-Docs public class DubboDocConfig { }
到此 Dubbo-Api-Docs 相關的東西已經添加完畢。
dubbo-api-docs-examples 中有更多更爲詳盡的例子,下文中有註解的詳細說明。下面咱們來看一下增長 Dubbo-Api-Docs 後的效果圖:
在 examples-provider 目錄中:
mvn spring-boot:run
dubbo-admin 須要下載 develop 分支源碼啓動。
git clone -b develop https://github.com/apache/dubbo-admin.git
參考 dubbo-admin 裏的說明啓動:
1. 在 dubbo-admin-server/src/main/resources/application.properties 中修改註冊中心地址 2. 編譯 mvn clean package 3. 啓動: mvn --projects dubbo-admin-server spring-boot:run 或者 cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.1.jar 4. 瀏覽器訪問: http://localhost:8080 5. 默認賬號密碼都是: root
Dubbo-Api-Docs 根據功能拆分,分別在兩個倉庫中:
dubbo-spi-extensions 倉庫地址
該倉庫存放 dubbo 的一些非核心功能的擴展,Dubbo-Api-Docs 做爲該倉庫中的一個子模塊,因爲該倉庫屬於 Dubbo 3.0 中規劃的一部分,而 Dubbo-Api-Docs 是基於 Dubbo 2.7.x 開發的,因此在該倉庫中增長了 2.7.x 分支,Dubbo-Api-Docs 就在該分支下。
該倉庫中包含了 Dubbo-Api-Docs 的文檔相關注解、註解掃描能力和使用示例:
Dubbo-Admin 倉庫地址
文檔的展現及測試放在了 dubbo admin 項目中。
@EnableDubboApiDocs:配製註解,啓用 dubbo api docs 功能。
示例使用 nacos 做爲註冊中心,下載並啓動 nacos。
任意啓動 examples-provider 和 examples-provider-sca 中的任意一個,固然也能夠兩個都啓動。examples-provider 使用 20881 端口 examples-provider-sca 使用 20882 端口。兩個項目都是 spring boot 項目,啓動類在 org.apache.dubbo.apidocs.examples 包下。
啓動 Dubbo-Admin,瀏覽器訪問:http://www.javashuo.com/tag/http://localhost:8080。
進入 dubbo-admin 中的 「接口文檔」 模塊。
在 「dubbo 提供者 IP」 和 「dubbo 提供者端口」 中分別輸入提供者所在機器 IP 和端口,點擊右側 「加載接口列表」 按鈕。
左側接口列表中加載出接口列表,點擊任意接口,右邊展現出該接口信息及參數表單。
填入表單內容後,點擊最下方測試按鈕。