互联网科技程序员Java

Spring Cloud微服务接口这么多怎么调试

2019-08-08  本文已影响18人  Java_苏先生

导读

我们知道在微服务架构下,软件系统会被拆分成很多个独立运行的服务,而这些服务间需要交互通信,就需要定义各种各样的服务接口。具体来说,在基于Spring Cloud的微服务模式中,各个微服务会基于Spring MVC的Controller定义多个该微服务需要向外部发布的接口。

根据各个微服务功能边界定义的不同,有些微服务会提供与具体业务相关的接口,如支付接口账户接口等;而有些微服务则会提供一些公共性质的服务接口,如短信接口统一认证接口之类。而这些微服务往往又是由多个不同的团队在开发维护,传统方式下服务接口的定义往往需要服务提供方提供良好的可阅读性比较高的接口文档才可以比较方便地对接和测试,而事实上,随着时间的推移人员的迭代更新,很多情况下这些早期的接口文档往往很快就会因为无人维护而过时,即便不过时,微服务模式下这样的方式也会因为服务接口文档太多而让开发人员显得抓狂!

那么有没有一种更便捷地方式,可以让开发接口的同时,自动就能生成与服务接口高度一致的文档来呢?答案是有的,接下来就和大家一起聊聊到底有什么样方式可以让微服务的接口管理变得更加容易些!

接口管理方式介绍

事实上,市面上已经有多种开源项目提供了这样的支持!如:SwaggerApiDocRAPDOCLeverCrapApi等,这些项目都提供了对于Api在线文档的管理功能,那么在Spring Cloud体系中哪一种方式更加适合呢?下面,我们一起来对比下这些项目的优缺点。

1. Swagger

Swagger是一款基于YAMLJSON语言的文档在线生成和代码自动生成的工具。它的优点如下

它的缺点是

2. ApiDoc

ApiDoc是一款轻量级的类似于Swagger的在线文档生成工具。其缺点也类似于Swagger,接口管理自动测试等功能也比较弱,并且其社区生态国际化方面都还不如Swagger。

3. RAP

RAP是一个可视化接口管理工具,它可以通过分析接口结构,动态生成模拟数据,校验真实接口正确性,围绕接口定义,通过一系列自动化工具提升微服务模式下的协作效率。

它的优点如下

缺点如下

4. DOCLever

DOCLever也是一个免费开源的接口管理工具,它的优点如下

缺点如下

5. CrapApi

优点如下

缺点

6. Spring Cloud集成Swagger

通过对上述开源项目的分析,除Swagger外其余项目采取的都是文档和代码分离的方式,虽然这样会减少对代码的侵入,但是也会造成文档和代码的不一致现象,所以在基于Spring Cloud的微服务项目中,我们选择Swagger作为微服务接口管理工具。

那么基于Spring Boot的Spring Cloud微服务该如何集成Swagger呢?

①. 在Spring Boot微服务项目中引入Maven依赖:

<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.2.2</version>
</dependency>

②. 创建Swagger2配置类:

@Configuration
@EnableSwagger2
@Profile("!production")
public class SwaggerConfiguration {
    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.SWAGGER_2)
        .groupName("Api")
        .select()
        .apis(withClassAnnotation(RestController.class))
        .build()
        .globalOperationParameters(commonParameters())
        .apiInfo(apiInfo());
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
        .title("Api")
        .version("1.0.0-SNAPSHOT")
        .build();
    }
    private List<Parameter> commonParameters() {
        List<Parameter> parameters = Lists.newArrayList();
        parameters.add(new ParameterBuilder()
        .name("war")
        .description("backdoor 在测试环境绕过鉴权")
        .modelRef(new ModelRef("string"))
        .parameterType("query")
        .required(false)
        .defaultValue("war123")
        .build());
        parameters.add(new ParameterBuilder()
        .name("uid")
        .description("backdoor 设定的用户ID")
        .modelRef(new ModelRef("string"))
        .parameterType("query")
        .required(false)
        .defaultValue("1000053")
        .build());
        parameters.add(new ParameterBuilder()
        .name("Authorization")
        .description("生产环境中,需要传递的用户当前 Token")
        .modelRef(new ModelRef("string"))
        .parameterType("header")
        .required(false)
        .defaultValue("Bearer XXXXX")
        .build());
        return parameters;
    }
}

以上配置类中,我们可以通过@Profile("!production")注解指定生效的环境,如这里我们设置除在生产环境外,其他环境都生效。

③. 添加文档内容

在完成上述配置后,其实已经可以生产文档内容了,但是这样的文档主要针对请求本身,描述的主要来源是函数的命名,多用户并不友好,为了让文档更加易于阅读和理解,我们可以通过Swagger注解来增加一些说明。这些注解主要有:

接下来,我们通过一个实际的微服务接口定义案例来演示下:

@Api(value = "运维端系统用户层外部接口", description = "用于组装直接面向运维App端相关服务")

以上我们在微服务下定义了一个用户注册接口,此时启动微服务,然后输入微服务的IP+端口+/swagger-ui.html,就可以看到Swagger-UI了,如下:

通过Swagger-UI我们就可以校验的方式测试接口了,同时因为接口字段都在UI有说明和暂时,并且是与实际代码完全一致的,所以在对接时基于这些接口定义进行对接就可以了!

上一篇 下一篇

猜你喜欢

热点阅读