做者 | 柯然(邪影)
来源|阿里巴巴云原生公众号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 和端口,点击右侧 “加载接口列表” 按钮。
左侧接口列表中加载出接口列表,点击任意接口,右边展现出该接口信息及参数表单。
填入表单内容后,点击最下方测试按钮。