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

前言

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

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

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

接口管理方式介绍

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

Swagger

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

1)、它可以直接嵌入在Spring Boot项目中,通过开发时编写注释,从而自动生成接口文档,实现代码与文档的高度一致;
2)、可以分析接口的结构,并且还可以通过发起请求来验证接口的正确性;
3)、它提供了多种编程语言的前后端分离解决方案,支持根据定义的接口导出各种语言的服务端或客户端代码 ;
4)、它还包括了Swagger Editor,这是使用yaml语言的Swagger API的编辑器,支持导出yaml和json格式的接口文件;
5)、包含了Swagger UI,它可以将Swagger Editor编辑好的接口文档以html的形式展示出来;
6)、免费开源,支持国际化,生态丰富、社区活跃;

它的缺点是:

1)、对代码有侵入性;
2)、不同项目的Swagger接口文档是分离的,需要到不同的地方去找;
3)、Swagger UI展现出来的接口文档缺乏分类,使用体验比较差;
4)、不同项目的接口文档没有权限管理,缺少Mock;

ApiDoc

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

RAP

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

它的优点如下:

1)、支持项目管理、团队管理、文档版本管理;
2)、支持Mock测试数据;
3)、阿里大厂出品,在阿里巴巴内部得到实践;
4)、支持接口检索;
5)、可以分析接口结构,发起请求校验接口的正确性;
6)、免费开源

缺点如下:

1)、文档和接口分离,很容易出现不一致的现象;
2)、每个接口都需要手工编辑;
3)、后端采用nodejs编写,与基于Java的Spring Cloud技术栈不一致;

DOCLever

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

1)、支持项目管理、团队管理、文档工具丰富;
2)、支持丰富的Mock测试数据;
3)、用户案例也比较丰富:滴滴、美团、58同城、同城旅游等;
4)、支持接口检索;
5)、可以分析接口的结构、发起请求校验接口正确性、参数也很丰富;
6)、支持复杂场景的自动化测试,比如获取验证码、登陆,获取订单列表,甚至获取某个特定订单详情等上下文关联的操作;

缺点如下:

1)、文档和接口分离,很容易出现不一致的现象;
2)、每个接口都需要手工编辑;
3)、后端也是采用nodejs编写,与Spring Cloud的Java技术栈不符;

CrapApi

优点如下:

1)、支持项目管理、团队管理、文档版本管理;
2)、支持Mock测试数据;
3)、支持接口检索;
4)、可以分析接口结构、发起请求校验接口的正确性;
5)、支持接口监控、设置报警规则,接口不可用时及时通知服务负责人;
6)、后端基于Java开发,与Spring Cloud技术栈Java匹配;
7)、免费开源;

缺点:

1)、文档和接口分离,很容易出现不一致的现象;
2)、每个接口都需要手工编辑;
3)、使用案例较少,功能不够完善,可能会有很多坑;

Spring Cloud集成Swagger

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

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

1)、在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>

2)、创建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")注解指定生效的环境,如这里我们设置除在生产环境外,其他环境都生效。

3)、添加文档内容

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

@Api:用在类上,说明该类的作用。br/>@ApiOperation:注解来给API增加方法说明。
@ApiImplicitParams : 用在方法上包含一组参数说明。br/>@ApiImplicitParam:用来注解来给方法入参增加说明。
@ApiResponses:用于表示一组响应。
br/>@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息。
@ApiModel:描述一个Model的信息(一般用在请求参数无法使用@ApiImplicitParam注解进行描述的时候)。

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

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

    @Autowired
    OperationUserService operationUserServiceImpl;

    @ApiOperation(value = "运维端用户注册", httpMethod = "POST")
    @RequestMapping(value = "/userRegister", method = RequestMethod.POST)
    public APIResponse sysUserRegister(@RequestParam(value = "mobileNo") String mobileNo,
            @RequestParam(value = "email") String email,
            @RequestParam(value = "nickName", required = false) String nickName,
            @RequestParam(value = "idName") String idName, @RequestParam(value = "idType") String idType,
            @RequestParam(value = "idNo") String idNo, @RequestParam(value = "gender") String gender,
            @RequestParam(value = "password") String password, @RequestParam(value = "verifyCode") String verifyCode,
            @RequestParam(value = "creator") String creator) {
        UserRegisterReqVo userRegisterReqVo = UserRegisterReqVo.builder().mobileNo(mobileNo).email(email)
                .nickName(nickName).idName(idName).idType(idType).idNo(idNo).gender(gender).passwd(password)
                .passcode(verifyCode).creator(creator).build();
        UserRegisterResVo userRegisterResVo;
        try {
            userRegisterResVo = operationUserServiceImpl.userRegister(userRegisterReqVo);
        } catch (BizException e) {
            log.error(e.toString() + "_" + e.getMessage(), e);
            return APIResponse.error(e.getCode(), e.getMessage());
        } catch (Exception e) {
            log.error(e.toString() + "_" + e.getMessage(), e);
            return APIResponse
                    .error(ApiResultStatus.INTERNAL_SERVER_ERROR.getApiResultStatus(),
                            ApiResultStatus.INTERNAL_SERVER_ERROR.getMessageResourceName());
        }
        return APIResponse
                .success(ApiResultStatus.SUCCESS.getApiResultStatus(), ApiResultStatus.SUCCESS.getMessageResourceName(),
                        userRegisterResVo);
    }
}

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

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

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

原文地址:https://blog.51cto.com/14570694/2464681

时间: 2024-10-02 00:17:24

Spring Cloud微服务接口这么多怎么调试?的相关文章

在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四.服务间通信与集成 五.服务智能路由 六.集中配置管理 七.高可用和容错 八.监控和日志 九.服务的部署和发布策略 微服务概述 单体应用通常指在一个程序中满足多个业务或技术领域的需求,不同的需求领域内化为模块.假定我们要开发一个Web应用,通常的MVC模式可以满足要求.针对不同领域有不少代码生成工具

关于Spring Cloud微服务架构

微服务架构 Spring Cloud解决的第一个问题就是:服务与服务之间的解耦.很多公司在业务高速发展的时候,服务组件也会相应的不断增加.服务和服务之间有着复杂的相互调用关系,经常有服务A调用服务B,服务B调用服务C和服务D ...,随着服务化组件的不断增多,服务之间的调用关系成指数级别的增长,这样最容易导致的情况就是牵一发而动全身.经常出现由于某个服务更新而没有通知到其它服务,导致上线后惨案频发.这时候就应该进行服务治理,将服务之间的直接依赖转化为服务对服务中心的依赖.Spring Cloud

Spring Cloud微服务架构实现+Guava缓存+redis+数据库设计+微服务原理改造房产销售

Spring Cloud微服务架构实现+Guava缓存+redis+数据库设计+微服务原理改造房产销售 一.分布式服务框架的发展 1.1 第一代服务框架 代表:Dubbo(Java).Orleans(.Net)等 特点:和语言绑定紧密 1.2 第二代服务框架 代表:Spring Cloud等 现状:适合混合式开发(例如借助Steeltoe OSS可以让ASP.Net Core与Spring Cloud集成),正值当年 1.3 第三代服务框架 代表:Service Mesh(服务网格) => 例如

Spring Cloud微服务中网关服务是如何实现的?(Zuul篇)

导读 我们知道在基于Spring Cloud的微服务体系中,各个微服务除了在内部提供服务外,有些服务接口还需要直接提供给客户端,如Andirod.IOS.H5等等. 而一个很尴尬的境地是,如果直接将提供外部接口的微服务暴露给公网,那么意味着为了增强这个微服务的安全性,需要做很多额外的安全性措施,如报文数字签名.加密等:而大部分场景下,微服务本身又是提供给内部其他微服务调用的,即便所有的微服务都会不同程度地直接面向App客户端提供公网服务,那么为了这确保这些微服务的安全性,涉及的微服务也都需要实现

一张图了解Spring Cloud微服务架构

Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构.Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易维护的分布式系统开发工具包.Spring Cloud中各个组件在微服务架构中扮演的角色如下图所示,黑线表示注释说明,蓝线由A指向B,表示B从A处获取服务. Spring Cloud组成的

spring cloud微服务实践七

在spring cloud 2.x以后,由于zuul一直停滞在1.x版本,所以spring官方就自己开发了一个项目 Spring Cloud Gateway.作为spring cloud微服务的网关组件. 注:这一个系列的开发环境版本为 java1.8, spring boot2.x, spring cloud Greenwich.SR2, IDE为 Intelli IDEA spring cloud gateway 入门 根据官方的简介,它是spring mvc基础之上,旨在提供一个简单有效的

Spring Cloud微服务框架 实战企业级优惠券系统

第1章 课程介绍[终于等到你,快来认识我]本章中将对课程中涉及到的技术.工具.业务等进行简单介绍. 第2章 准备工作[工欲善其事,必先利其器]本章中将对课程中使用到的技术工具做介绍,包括Maven.MySQL.Redis.Kafka:会对它们的功能.安装.基本的使用方法进行介绍. 第3章 SpringBoot 开发框架[基础打不牢,学问攀不高]课程主体业务使用SpringCloud框架开发实现,但是SpringCloud基于SpringBoot实现.为便于更顺畅学习,本章中会对SpringBoo

Spring Cloud微服务运维神器之Consul Template?

Spring Cloud微服务架构浅析 这篇文章中要和大家分享下的就是在Spring Cloud微服务架构模式中被运维小哥用的很爽的一个工具Consul Template? 在具体介绍Consul Template是个什么东西之前,我们先来整体看一张微服务模式下的系统架构图,如下图所示: 在上图中,我们看到在基于Spring Cloud的微服务体系中,所有的微服务都会被注册到统一服务注册中心进行服务管理,这里使用的服务注册中心是Consul.假设在正常情况下,我们面向C端用户设计了一套微服务逻辑

Spring Cloud微服务Sentinel+Apollo限流、熔断实战

在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实项目实践过程,这中间被不少网络Demo示例级别水文误导过,为了以正视听特将实践过程加以总结,希望能够帮到有类似需要的朋友! 一.Sentinel概述 在基于Spring Cloud构建的微服务体系中,服务之间的调用链路会随着系统的演进变得越来越长,这无疑会增加了整个系统的不可靠因素.在并发流量比较高