在国内Dubbo
成为很多互联网公司高并发分布式场景下GPC
框架的首选,Dubbo
从开源至今经历过蛮多的过程,从开源到中间的停止维护,经过三年的沉寂,2017年9月,阿里巴巴宣布重启Dubbo
项目。到2018年2月,阿里将Dubbo
捐献给Apache
基金会,随后Dubbo
经过孵化后顺利成为Apache
的顶级项目。
当然本文的重点不是介绍Dubbo
的使用,而是介绍如何利用smart-doc
工具来生成Dubbo
的RPC
内部接口文档。smart-doc
因为其基于注释和Java
接口定义自动推导的理念,开源以来受到国内很多开发者的喜爱。在开源之初,smart-doc
仅仅支持RESTFul API
文档的生成,但是在发展的过程中,不断有开发者询问smart-doc
能否支持Dubbo RPC
接口文档的生成。经过不断努力,在smart-doc 1.8.7
版本中我们增加了Dubbo RPC
接口的支持,下面来看看真正的操作。
一、集成smart-doc
smart-doc
本着使用简单的原则开发了maven
插件和gradle
,通过插件来降低smart-doc
的集成难度和去除依赖侵入性。您可以根据自己使用的依赖构建管理工具来选择相关的插件,下面以使用smart-doc-maven-plugin
插件集成smart-doc
生成Dubbo
为例。当然集成smart-doc
来生成Dubbo RPC
接口文档你有两种可选方式:
- 使用
smart-doc
扫描dubbo api
模块 - 使用
smart-doc
扫描dubbo provider
模块
下面来看下集成方式。
1.1 添加插件
在你的dubbo api
或者或者是dubbo provider
模块中添加smart-doc-maven-plugin
。当然你只需要选中一种方式即可
<plugin>
<groupId>com.github.shalousun</groupId>
<artifactId>smart-doc-maven-plugin</artifactId>
<version>[最新版本]</version>
<configuration>
<!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
<configFile>./src/main/resources/smart-doc.json</configFile>
<!--指定项目名称-->
<projectName>测试</projectName>
<!--smart-doc实现自动分析依赖树加载第三方依赖的源码,如果一些框架依赖库加载不到导致报错,这时请使用excludes排除掉-->
<excludes>
<!--格式为:groupId:artifactId;参考如下-->
<!--1.0.7版本开始你还可以用正则匹配排除,如:poi.* -->
<exclude>com.alibaba:fastjson</exclude>
</excludes>
<!--自1.0.8版本开始,插件提供includes支持-->
<!--smart-doc能自动分析依赖树加载所有依赖源码,原则上会影响文档构建效率,因此你可以使用includes来让插件加载你配置的组件-->
<includes>
<!--格式为:groupId:artifactId;参考如下-->
<include>com.alibaba:fastjson</include>
</includes>
</configuration>
<executions>
<execution>
<!--如果不需要在执行编译时启动smart-doc,则将phase注释掉-->
<phase>compile</phase>
<goals>
<goal>html</goal>
</goals>
</execution>
</executions>
</plugin>
添加smart-doc所需配置文件
在你的dubbo api
或者或者是dubbo provider
模块reources
中添加smart-doc.json
配置文件
{
"isStrict": false, //是否开启严格模式
"allInOne": true, //是否将文档合并到一个文件中,一般推荐为true
"outPath": "D://md2", //指定文档的输出路径
"projectName": "smart-doc",//配置自己的项目名称
"rpcApiDependencies":[{ // 项目开放的dubbo api接口模块依赖,配置后输出到文档方便使用者集成
"artifactId":"SpringBoot2-Dubbo-Api",
"groupId":"com.demo",
"version":"1.0.0"
}],
"rpcConsumerConfig":"src/main/resources/consumer-example.conf"//文档中添加dubbo consumer集成配置,用于方便集成方可以快速集成
}
关于smart-doc如果你生成文档需要更详细的配置请常看官方项目wiki文档
官方wiki文档
rpcConsumerConfig:
如果下你想让dubbo consumer
集成更加快速,你可以将集成配置示例consumer-example.conf
中,Smart-doc
会将该示例直接输出到文档中。
dubbo:
registry:
protocol: zookeeper
address: ${zookeeper.adrress}
id: my-registry
scan:
base-packages: com.iflytek.demo.dubbo
application:
name: dubbo-consumer
dubbo接口扫描
上面提到了smart-doc
支持单独去扫描dubbo api
或者dubbo provider
。在扫描原理是主要通过识别@dubbo
注释tag
或dubbo
的 @service
注解。
扫描dubbo api
dubbo api
通常都是很简洁的dubbo
接口定义,如果你需要让smart-doc
扫描到dubbo
接口,那么需要加上@dubbo
注释tag
。示例如下:
/**
* 用户操作
*
* @author yu 2019/4/22.
* @author zhangsan 2019/4/22.
* @version 1.0.0
* @dubbo
*/
public interface UserService {
/**
* 查询所有用户
*
* @return
*/
List<User> listOfUser();
/**
* 根据用户id查询
*
* @param userId
* @return
*/
User getById(String userId);
}
扫描dubbo provider
如果想通过dubbo provider
生成RPC
接口文档的情况,你不需要加任何的其他注释tag
,smart-doc
自动扫描@service
注解完成。
/**
* @author yu 2019/4/22.
*/
@Service
public class UserServiceImpl implements UserService {
private static Map<String,User> userMap = new HashMap<>();
static {
userMap.put("1",new User()
.setUid(UUIDUtil.getUuid32())
.setName("zhangsan")
.setAddress("四川成都")
);
}
/**
* 获取用户
* @param userId
* @return
*/
@Override
public User getById(String userId) {
return userMap.get(userId);
}
/**
* 获取用户
* @return
*/
@Override
public List<User> listOfUser() {
return userMap.values().stream().collect(Collectors.toList());
}
}
生成操作
直接通过maven
命令运行插件的文档生成命令或者在IDEA
中直接单击插件的可视化命令即可。
dubbo-api文档生成效果图
Add dependency
<dependency>
<groupId>com.demo</groupId>
<artifactId>SpringBoot2-Dubbo-Api</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>SpringBoot2-Dubbo-Api</artifactId>
<version>1.0.0</version>
</dependency>
用户操作
URI: dubbo://localhost:20880/com.iflytek.demo.dubbo.api.interfaces.UserService
Service: com.iflytek.demo.dubbo.api.interfaces.UserService
Protocol: dubbo
Author: yu 2019/4/22., zhangsan 2019/4/22.
Version: 1.0.0
查询所有用户
Definition: List<User> listOfUser()
Description: 查询所有用户
Response-fields:
Field | Type | Description | Since |
---|---|---|---|
uid | String | 用户id | - |
name | String | 用户名称 | - |
address | String | 地址 | - |
根据用户id查询
Definition: User getById(String userId)
Description: 根据用户id查询
Invoke-parameters:
Parameter | Type | Description | Required | Since |
---|---|---|---|---|
userId | String | 用户id | true | - |
Response-fields:
Field | Type | Description | Since |
---|---|---|---|
uid | String | 用户id | - |
name | String | 用户名称 | - |
address | String | 地址 | - |
使用总结
smart-doc
对于Dubbo RPC
文档生成的支持比较晚,当然目前市面也没有比其他比较好的工具以及模板参考。Dubbo RPC
文档的这块还需要更多的用户提出issue
和改进意见。当然如果你认同和喜欢smart-doc
请前往项目给我们一些支持点点star
。