Spring Cloud Zuul中使用Swagger汇总API接口文档

有很多读者问过这样的一个问题:虽然使用Swagger可以为Spring MVC编写的接口生成了API文档,但是在微服务化之后,这些API文档都离散在各个微服务中,是否有办法将这些接口都整合到一个文档中?之前给大家的回复都只是简单的说了个思路,昨天正好又有人问起,索性就举个例子写成博文供大家参考吧。

如果您还不了解Spring Cloud ZuulSwagger,建议优先阅读下面两篇,有一个初步的了解:

  • Spring Cloud构建微服务架构:服务网关(基础)
  • Spring Boot中使用Swagger2构建强大的RESTful API文档

准备工作

上面说了问题的场景是在微服务化之后,所以我们需要先构建两个简单的基于Spring Cloud的微服务,命名为swagger-service-aswagger-service-b

下面只详细描述一个服务的构建内容,另外一个只是名称不同,如有疑问可以在文末查看详细的代码样例。

  • 第一步:构建一个基础的Spring Boot应用,在pom.xml中引入eureka的依赖、web模块的依赖以及swagger的依赖(这里使用了我们自己构建的starter,详细可点击查看)。主要内容如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath/>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.7.0.RELEASE</version>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
  • 第二步:编写应用主类:
@EnableSwagger2Doc
@EnableDiscoveryClient
@SpringBootApplication
public class Application {

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}

@RestController
class AaaController {
@Autowired
DiscoveryClient discoveryClient;

@GetMapping("/service-a")
public String dc() {
String services = "Services: " + discoveryClient.getServices();
System.out.println(services);
return services;
}
}
}

其中,@EnableSwagger2Doc注解是我们自制Swagger Starter中提供的自定义注解,通过该注解会初始化默认的Swagger文档设置。下面还创建了一个通过Spring MVC编写的HTTP接口,用来后续在文档中查看使用。

  • 第三步:设置配置文件内容:
spring.application.name=swagger-service-a
server.port=10010

eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/

swagger.base-package=com.didispace

其中,eureka服务端的配置采用了本站的公益eureka,大家可以通过http://eureka.didispace.com/查看详细以及使用方法。另外,swagger.base-package参数制定了要生成文档的package,只有com.didispace包下的Controller才会被生成文档。

注意:上面构建了swagger-service-a服务,swagger-service-b服务可以如法炮制,不再赘述。

构建API网关并整合Swagger

在Spring Cloud构建微服务架构:服务网关(基础)一文中,已经非常详细的介绍过使用Spring Cloud Zuul构建网关的详细步骤,这里主要介绍在基础网关之后,如何整合Swagger来汇总这些API文档。

  • 第一步:在pom.xml中引入swagger的依赖,这里同样使用了我们自制的starter,所以主要的依赖包含下面这些:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.7.0.RELEASE</version>
</dependency>
  • 第二步:在应用主类中配置swagger,具体如下:
@EnableSwagger2Doc
@EnableZuulProxy
@SpringCloudApplication
public class Application {

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}

@Component
@Primary
class DocumentationConfig implements SwaggerResourcesProvider {
@Override
public List<SwaggerResource> get() {
List resources = new ArrayList<>();
resources.add(swaggerResource("service-a", "/swagger-service-a/v2/api-docs", "2.0"));
resources.add(swaggerResource("service-b", "/swagger-service-b/v2/api-docs", "2.0"));
return resources;
}

private SwaggerResource swaggerResource(String name, String location, String version) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion(version);
return swaggerResource;
}
}
}

说明:@EnableSwagger2Doc上面说过是开启Swagger功能的注解。这里的核心是下面对SwaggerResourcesProvider的接口实现部分,通过SwaggerResource添加了多个文档来源,按上面的配置,网关上Swagger会通过访问/swagger-service-a/v2/api-docsswagger-service-b/v2/api-docs来加载两个文档内容,同时由于当前应用是Zuul构建的API网关,这两个请求会被转发到swagger-service-aswagger-service-b服务上的/v2/api-docs接口获得到Swagger的JSON文档,从而实现汇总加载内容。

测试验证

将上面构建的两个微服务以及API网关都启动起来之后,访问网关的swagger页面,比如:http://localhost:11000/swagger-ui.html,此时可以看到如下图所示的内容:

可以看到在分组选择中就是当前配置的两个服务的选项,选择对应的服务名之后就会展示该服务的API文档内容。

代码示例

本文示例读者可以通过查看下面仓库的中的swagger-service-aswagger-service-bswagger-api-gateway三个项目:

  • Github
  • Gitee

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!

以下专题教程也许您会有兴趣
  • Spring Boot基础教程
  • Spring Cloud基础教程

money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1381. 设计一个支持增量操作的栈(deque/数组)

1. 题目 请你设计一个支持下述操作的栈。 实现自定义栈类 CustomStack &#xff1a; CustomStack(int maxSize)&#xff1a;用 maxSize 初始化对象&#xff0c;maxSize 是栈中最多能容纳的元素数量&#xff0c;栈在增长到 maxSize 之后则不支持 push 操作。void push(int x)…

GARFIELD@10-31-2004

apprentice转载于:https://www.cnblogs.com/rexhost/archive/2004/10/31/59013.html

Spring Cloud构建微服务架构:分布式服务跟踪(入门)【Dalston版】

通过之前的N篇博文介绍&#xff0c;实际上我们已经能够通过使用它们搭建起一个基础的微服务架构系统来实现我们的业务需求了。但是&#xff0c;随着业务的发展&#xff0c;我们的系统规模也会变得越来越大&#xff0c;各微服务间的调用关系也变得越来越错综复杂。通常一个由客户…

有哪些值得计算机专业学生加入的国企?

文 |重庆搬砖喵知乎知乎上最近有个问题很火&#xff1a;有哪些值得计算机专业学生加入的国企&#xff1f;这个问题确实很应今年秋招的景&#xff0c;于是转载了知乎答主重庆搬砖喵 的高赞回答分享给大家。原回答链接&#xff1a;https://www.zhihu.com/question/285730093/answ…

上海著名综合性商厦一览 (1)

上海著名综合性商厦一览 jxjb 2004-10-29 11:53:21 发表于搜狐焦点上海房地产网-谈房论市-东方康洛论坛 主要包括&#xff1a;第一百货东楼 华联商厦 置地广场 友谊欧洲商城 东方商厦 港汇广场 汇金百货 梅龙镇广场 中环广场二百永新 正大广场 上海第一八佰伴友谊南方商城…

LeetCode 1383. 最大的团队表现值(贪心,优先队列,难)

1. 题目 公司有编号为 1 到 n 的 n 个工程师&#xff0c;给你两个数组 speed 和 efficiency &#xff0c;其中 speed[i] 和 efficiency[i] 分别代表第 i 位工程师的速度和效率。 请你返回由最多 k 个工程师组成的 ​​​​​​最大团队表现值 &#xff0c;由于答案可能很大&am…

程序员坐牢了,会被安排去写代码吗?

文 | 无念源 | 知乎今天给大家分享一篇有意思的爽文&#xff0c;但也是根据多年之前一个真实报道改编而来的。本文字数较多&#xff0c;建议先收藏&#xff0c;上下班路上、带薪上厕所、浑水摸鱼时再慢慢看~本故事纯属虚构请大家不要随意模仿&#xff0c;后果自负&#xff01;因…

Dubbo将积极适配Spring Cloud生态,Spring Cloud体系或将成为微服务的不二选择!

2016年&#xff0c;我在博客中发表过一篇《微服务架构的基础框架选择&#xff1a;Spring Cloud还是Dubbo&#xff1f;》获得了很大的阅读量和转载量。在这篇文章中&#xff0c;我主要对比了Spring Cloud与Dubbo所具备的能力&#xff0c;并阐述了个人推崇Spring Cloud的原因。但…

Java sdk及tomcat安装设置

在安装好Java SDK后&#xff0c;还需要设置一些系统变量&#xff0c;系统变量的设置可以在系统属性-高级-环境变量中进行 JAVA_HOMEJAVA安装目录 CLASSPATH… 库路径&#xff0c;可以是目录或jar文件&#xff0c;如C:\j2sdk1.4.0_01\lib\dt.jar;d:\java&#xf…

剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)

1. 题目 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5限制&#xff1a; 0 < 数组长度 < 50000来源&#xff1a;力…

【小马哥】Spring Cloud系列讲座

这里推荐一个不错的Spring Cloud系列讲座&#xff0c;讲师简介如下&#xff1a; 小马哥&#xff0c;阿里巴巴技术专家&#xff0c;从事十余年Java EE 开发&#xff0c;国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施、迁移等。重点关注云计算、微服务以及…

名校女教授,强迫其男博士“发生性关系多年”!索赔750万

转自 | 论文项目硕博招聘、磐创AI来源 | FOREIGNDAILY 、双一流高校等早稻田大学是日本的知名大学&#xff0c;但最近这所知名大学却引来了不小的争议。早稻田大学一名25岁的学生&#xff0c;将他的女导师和学校一起告上了法庭&#xff0c;要求他们赔偿自己750万日元&#xff…

剑指Offer - 面试题43. 1~n整数中1出现的次数(找规律+公式)

1. 题目 输入一个整数 n &#xff0c;求1&#xff5e;n这n个整数的十进制表示中1出现的次数。 例如&#xff0c;输入12&#xff0c;1&#xff5e;12这些整数中包含1 的数字有1、10、11和12&#xff0c;1一共出现了5次。 示例 1&#xff1a; 输入&#xff1a;n 12 输出&…

从网上看到的很搞笑的东西

[转]天下无贼经典台词IT版 戴尔&#xff1a;“人心散了&#xff0c;队伍不好带了!“ IBM&#xff1a;“我最烦你们些胡乱降价的了&#xff0c;一点技术含量都没有!“ 惠普&#xff1a;“实话告诉你们&#xff0c;惠普很生气&#xff0c;后果很严重!“ Intel&#xff1a;“你过得…

Spring Cloud实战小贴士:turbine如何聚合设置了context-path的hystrix数据

之前在spring for all社区看到这样一个问题&#xff1a;当actuator端点设置了context-path之后&#xff0c;turbine如何聚合数据&#xff1f;首先&#xff0c;我们要知道actuator端点设置了context-path是什么意思&#xff1f;也就是说&#xff0c;此时spring boot actuator的端…

prompt范式有了商业模式,卖提示词可以赚钱??

文 | 衡宇 发自 凹非寺源 | 量子位DALLE 2、GPT-3提示词在线交易平台&#xff0c;了解一下&#xff1f;最近&#xff0c;一家初创公司PromptBase&#xff0c;允许用户在该平台买卖提示词&#xff08;Prompt&#xff09;&#xff0c;提示词售价为1.99美元。PromptBase将向卖家抽…

LintCode 795. 4种独特的路径(DFS)

1. 题目 一个机器人位于一个m*n的网格的左上角。 机器人可以在任何时间点移动任何方向&#xff0c;但是每个网格只能达到一次。机器人正试图到达网格的右下角。 有多少种可能的独特路径? 样例 1: 输入: 2 3 输出: 4样例 2: 输入: 3 3 输出: 122. 解题 暴力回溯即可 class …

GARFIELD@01-19-2005

i begot them before, and you got them now 转载于:https://www.cnblogs.com/rexhost/archive/2005/01/19/94132.html

SpringCloud中文社区转型Spring4All欢迎您的加入

相信关注我们Spring Cloud中文社区&#xff08;bbs.springcloud.com.cn&#xff09;的朋友们最近已经在最新的横幅中发现了一个全新的社区&#xff1a;spring4all.com&#xff0c;相信从名字大家也能猜到该域名寓意Spring For All&#xff0c;那么我们为什么要重新创建这样一个…

全世界都在说中国话?2022国际大数据竞赛首次以“中文”命题

8月10日&#xff0c; IKCEST第四届“一带一路”国际大数据竞赛暨第八届百度&西安交大大数据竞赛&#xff08;以下简称“国际大数据竞赛”&#xff09;正式启动&#xff0c;本届赛题聚焦“低资源语言机器翻译”行业难题&#xff0c;向全球开发者发出邀请。百度发布稀缺语种任…