Dubbo微服务基于swagger自动生成文档及测试调用

swagger简介

swagger官方对其软件定位于API构建工具。
它本身包含的功能很多,官方给出的功能特点有:
API设计: 可以使用swagger提供的编辑工具,开发API的接口申明。
构建工具: 并通过反向工程生成各语言API接口的脚手架代码。
文档工具: 可以通过swagger的规范将代码中的注释生成格式化文档。
测试工具: 可以通过使用swagger-ui工具,直接调用基于swagger规范开发的API接口进行测试。
更多内容请访问官网了解 [https://swagger.io/]

微服务基于swagger自动生成文档原理

在微服务中通过引入swagger核心基础组件,使用swagger的注解在微服务的接口和使用的模型上添加API规范说明。
接口说明

@Deprecated
@Api(value = "XX平台服务适配接口")
public interface MidSysServiceV2 {
    /**
     * xx接口
     *
     * @param channel
     *            调用渠道
     * @param mainRiskCode
     *            主险code
     * @param riskNo
     *            保单号
     * @param midSysOrderNo
     *            投保时的核心订单号
     */
    @ApiOperation(value = "撤单接口", notes = "")
    public DubboResultV1<String> doOrderCancel(
            @ApiParam(name = "channel", value = "调用渠道", required = true) SourceChannel channel,
            @ApiParam(name = "mainRiskCode", value = "主险编码", required = true) String mainRiskCode, 
            @ApiParam(name = "riskNo", value = "保单号", required = true) String riskNo,
            @ApiParam(name = "midSysOrderNo", value = "投保时的核心订单号", required = true) String midSysOrderNo);

模型说明

@ApiModel(value="SourceChannel",description="渠道对象")
public enum SourceChannel {
    HXCP("hxcx", "小程序"),
    HXYD("hxyd", "移动官网"),
    HXGW("hxgw", "PC官网"),
    HXJDT("hxjdt", "经代通");
    
    @ApiModelProperty(value = "渠道编码", name = "code", example = "hxjdt")
    private String code;
    @ApiModelProperty(value = "渠道描述", name = "descript", example = "经代通")
    private String descript;

在微服务启动的时候,dubbo-swagger组件通过遍历工作中dubbo的实现类。
通过反射机制获取swagger的注解信息,将注释信息生成为基于json格式的元数据信息。

{"swagger":"2.0","info":{"version":"","title":"hxjk-haioums-provider-dev","contact":{"name":"yidonghulian-dev"}},"basePath":"/","paths":{"/h/com.ab.hxjk.haioums.dubbo.api.MidSysServiceV2/doNoCardPay":{"post":{"tags":["MidSysServiceV2"],"summary":"无卡支付接口","description":"DubboResultV1 
......

并且还为dubbo接口生成了REST风格的api,代理微服务的访问。

Mapped "{[/h/{interfaceClass}/{methodName}],produces=[application/json;charset=utf-8]}" onto public org.springframework.http.ResponseEntity<java.lang.String> com.deepoove.swagger.dubbo.web.DubboHttpController.invokeDubbo(java.lang.String,java.lang.String,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception

大概流程就是引入的组件中有一个controller类,将REST请求中的json参数,转换为对应的POJO模型对象,并通过dubbo服务的消费方连接到自己提供的服务提供方,产生服务调用。

配置

首先在微服务接口工程中引入swagger的核心包。

        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-core</artifactId>
            <version>1.5.16</version>
        </dependency>       

为API接口及模型添加注解

常用注解有:

- @Api()用于类; 
表示标识这个类是swagger的资源 
- @ApiOperation()用于方法; 
表示一个http请求的操作 
- @ApiParam()用于方法,参数,字段说明; 
表示对参数的添加元数据(说明或是否必填等) 
- @ApiModel()用于类 
表示对类进行说明,用于参数用实体类接收 
- @ApiModelProperty()用于方法,字段 
表示对model属性的说明或者数据操作更改 
- @ApiIgnore()用于类,方法,方法参数 
表示这个方法或者类被忽略 
- @ApiImplicitParam() 用于方法 
表示单独的请求参数 
- @ApiImplicitParams() 用于方法,包含多个 @ApiImplicitParam

在微服务接口实现工程中引入swagger-dubbo包

        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>swagger-dubbo</artifactId>
            <version>2.0.1</version>
        </dependency>       

并在工程中添加对组件的配置(因为工程是springboot,所以是基于配置类来实现的配置。)

@DubboComponentScan(basePackages = { "com.ab.hxjk.haioums.dubbo" })  //dubbo实现类的路径
@EnableDubboSwagger //生成api-docs及调用的REST接口
@Configuration
public class SwaggerConfig {

}

*备注:如果需要通过swagger-ui工程调用微服务工程swagger的REST接口,需要申请工程支付跨域调用 。

@Configuration
public class CorsConfig {
    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        // 设置你要允许的网站域名,如果全允许则设为 *
        config.addAllowedOrigin("*");
        // 如果要限制 HEADER 或 METHOD 请自行更改
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        // 这个顺序很重要哦,为避免麻烦请设置在最前
        bean.setOrder(0);
        return bean;
    }
}

工程启动以后就可以访问swagger的REST接口了。

可以通过相对路径/swagger-dubbo/api-docs获取API的元数据信息。
也可以通过相对路径/h/{DUBBO_SERVICE_INTERFACE_FULLPACKAGE_PATH}/{DUBBO_SERVICE_INTERFACE_METHOD}调用微服务。

配置swagger-ui

可以通过docker的现成镜像swaggerapi/swagger-ui [https://hub.docker.com/r/swaggerapi/swagger-ui/]运行swagger-ui客户端,或是通过下载工程[https://codeload.github.com/Sayi/swagger-dubbo/zip/master],将工程中的子项目swagger-dubbo-master\swagger-dubbo-example\dubbo-provider-springboot进行修改使用。该工程我已经重构提交到http://gitlab.ab.com/JKX/HXYDHL/microservices/tree/master/swagger-dubbo-ui上了。
下面是运行界面:
可以通过在swagger-ui的首页中访问微服务REST接口/api-docs,获取接口API信息。

swagger-dubbo-images1.png

也可以通过/api-docs返回的结果对微服务进行调用。
swagger-dubbo-images2.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容