Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >集成SPRINGDOC OPENAPI 的微服务实践-spring cloud 入门教程

集成SPRINGDOC OPENAPI 的微服务实践-spring cloud 入门教程

作者头像
jack.yang
发布于 2025-04-05 11:08:38
发布于 2025-04-05 11:08:38
20000
代码可运行
举报
运行总次数:0
代码可运行

在文章集成SWAGGER2服务-spring cloud 入门教程中我们学习了使用swagger2来生成微服务的文档方法。但SpringFox 库最重要的问题是缺乏对最新版本 3 中的 OpenAPI 和 Spring 的支持使用 WebFlux 构建的反应式 API。所有这些特性都是由Springdoc OpenAPI 库实现的。因此,它可能会取代 SpringFox 作为 Swagger 和用于 Spring Boot 应用程序的 OpenAPI 3 生成工具。

例子

作为本文中的代码示例,我们将使用使用 Spring Cloud 构建的典型微服务架构。它由 Spring Cloud Config Server、Eureka 发现和作为 API 网关的 Spring Cloud Gateway 组成。我们还有三个微服务,外部客户端只能通过网关才能访问它们暴露 REST API 。下图显示了本文所提及的系统简单架构图。

执行

与 Springdoc OpenAPI 库相关的第一个好消息是它可以与 SpringFox 库一起存在而不会发生任何冲突。如果有人使用您的 Swagger 文档,要为基于标准 Spring MVC 的应用程序启用 Springdoc,您需要将以下依赖项包含到 Maven 中pom.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-webmvc-core</artifactId>
    <version>1.2.32</version>
</dependency>

我们的每个 Spring Boot 微服务都构建在 Spring MVC 之上,并为标准同步 REST 通信提供端点。但是,构建在 Spring Cloud Gateway 之上的 API 网关使用 Netty 作为嵌入式服务器,并基于响应式 Spring WebFlux。它还提供 Swagger UI 以访问所有微服务公开的文档,因此它必须包含启用 UI 的库。必须包含以下两个库才能为基于 Spring WebFlux 的响应式应用程序启用 Springdoc 支持。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-webflux-core</artifactId>
    <version>1.2.31</version>
</dependency>
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-webflux-ui</artifactId>
    <version>1.2.31</version>
</dependency>

我们可以通过在 Spring Boot 配置文件中设置属性或使用@Beans. 例如,我们不想为应用程序公开的所有 HTTP 端点(如 Spring 特定端点)生成 OpenAPI 清单,因此我们可以定义一个基本包属性用于扫描,如下所示。在我们的源代码示例中,每个应用程序 YAML 配置文件都位于config-service模块中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
springdoc:
  packagesToScan: pl.piomin.services.department

这是员工服务的主要类。我们使用@OpenAPIDefinition注释来定义 Swagger 站点上显示的应用程序的描述。如您所见,我们仍然可以使用@EnableSwagger2.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication
@EnableDiscoveryClient
@EnableSwagger2
@OpenAPIDefinition(info =
    @Info(title = "Employee API", version = "1.0", description = "Documentation Employee API v1.0")
)
public class EmployeeApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(EmployeeApplication.class, args);
    }
 
}

一旦您启动每个微服务,它将公开端点/v3/api-docs。我们可以通过使用springdoc.api-docs.pathSpring 配置文件中的属性来自定义该上下文。由于不是必须的,我们可以继续在 Spring Cloud Gateway 上实现。Springdoc 没有提供与 SpringFox 类似的类SwaggerResource,它在上一篇文章中用于暴露来自不同微服务的多个 API。幸运的是,有一种分组机制允许将 OpenAPI 定义分成具有给定名称的不同组。要使用它,我们需要声明一个GroupOpenAPIbean列表。

这是网关服务中负责创建由网关处理的 OpenAPI 资源列表的代码片段。首先,我们使用RouteDefinitionLocator豆。然后我们获取每个路由的 id 并将其设置为组名。因此,我们在 path 下有多个 OpenAPI 资源/v3/api-docs/{SERVICE_NAME},例如/v3/api-docs/employee

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
RouteDefinitionLocator locator;
 
@Bean
public List<GroupedOpenApi> apis() {
    List<GroupedOpenApi> groups = new ArrayList<>();
    List<RouteDefinition> definitions = locator.getRouteDefinitions().collectList().block();
    definitions.stream().filter(routeDefinition -> routeDefinition.getId().matches(".*-service")).forEach(routeDefinition -> {
        String name = routeDefinition.getId().replaceAll("-service", "");
        GroupedOpenApi.builder().pathsToMatch("/" + name + "/**").setGroup(name).build();
    });
    return groups;
}

API 路径 like/v3/api-docs/{SERVICE_NAME}并不是我们想要实现的,因为我们到下游服务的路由是基于从发现中获取的服务名称。因此,如果您调用 address 就像http://localhost:8060/employee/**它会在employee-service. 这是网关服务配置中的路由定义。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
      - id: employee-service
        uri: lb://employee-service
        predicates:
        - Path=/employee/**
        filters:
        - RewritePath=/employee/(?<path>.*), /$\{path}
      - id: department-service
        uri: lb://department-service
        predicates:
        - Path=/department/**
        filters:
        - RewritePath=/department/(?<path>.*), /$\{path}
      - id: organization-service
        uri: lb://organization-service
        predicates:
        - Path=/organization/**
        filters:
        - RewritePath=/organization/(?<path>.*), /$\{path}

由于 Springdoc 不允许自定义分组机制的默认行为来更改生成的路径,因此我们需要提供一些解决方法。我的提议只是在专用于 Open API 路径处理的网关配置中添加一个新的路由定义。它将路径重写/v3/api-docs/{SERVICE_NAME}/{SERVICE_NAME}/v3/api-docs,由另一个负责与 Eureka 发现交互的路由处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- id: openapi
  uri: http://localhost:${server.port}
  predicates:
  - Path=/v3/api-docs/**
  filters:
  - RewritePath=/v3/api-docs/(?<path>.*), /$\{path}/v3/api-docs

测试

为了测试我们的简单示例,我们需要运行所有微服务、配置服务器、发现和网关。微服务在动态生成的端口下可用,配置服务器在 下可用8888,发现在 下8061,网关在 下8060。我们可以通过调用访问每个微服务http://localhost:8060/{SERVICE_PATH}/**,例如http://localhost:8060/employee/**。Swagger UI 在 address 下可用http://localhost:8060/swagger-ui.html。在运行所有必需的 Spring Boot 应用程序之后,让我们先来看看 Eureka。

访问在网关上公开的 Swagger UI 后,您可能会看到我们可以在发现中注册的所有三个微服务之间进行选择。这正是我们想要实现的。

结论

Springdoc OpenAPI 兼容 OpenAPI 3,并支持 Spring WebFlux,而 SpringFox 不支持。因此,选择似乎是显而易见的,特别是如果您使用的是响应式 API 或 Spring Cloud Gateway。在本文中,我向您展示了如何在具有网关模式的微服务架构中使用 Springdoc。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringCloudGateway+Discovery+Swagger 搭建服务文档中心
spring cloud 2020.3 swagger 3 springdoc-openapi 1.5.10
路过君
2021/12/07
1.7K0
SpringCloudGateway+Discovery+Swagger 搭建服务文档中心
SPRING CLOUD 微服务快速指南-spring cloud 入门教程
我的博客上有很多关于使用 Spring Boot 和 Spring Cloud 进行微服务的文章。本文的主要目的是简要总结这些框架提供的最重要的组件,这些组件可以帮助您创建微服务,并实际上向您解释什么是用于微服务架构的 Spring Cloud。本文涵盖的主题是:
jack.yang
2025/04/05
1120
SPRING CLOUD 微服务快速指南-spring cloud 入门教程
使用 Spring Boot 2.0,Eureka 和 Spring Cloud 的微服务快速指南
原文地址:https://dzone.com/articles/quick-guide-to-microservices-with-spring-boot-20-e
Techeek
2018/06/29
7.8K0
使用 Spring Boot 2.0,Eureka 和 Spring Cloud 的微服务快速指南
微服务聚合Swagger文档,这波操作是真的香!
对比knife4j和原生Swagger的微服务使用,再次证明knife4j是springfox-swagger的增强UI实现,完全遵循了springfox-swagger中的使用方式。
macrozheng
2020/07/24
4.5K0
微服务聚合Swagger文档,这波操作是真的香!
集成 Kubernetes 来构建微服务-spring cloud 入门教程
Spring Cloud和Kubernetes是目前Java平台下微服务应用的使用得最多的产品。然而,当谈到微服务架构时,它们有时被描述为具有竞争力的解决方案。它们都在微服务架构中实现流行的模式,如服务发现、分布式配置、负载平衡或断路。当然,他们的做法不同。 Kubernetes 是一个用于运行、扩展和管理容器化应用程序的平台。Kubernetes 最重要的组件之一是etcd。该高度可用的键值存储负责存储所有集群数据,包括服务注册表和应用程序配置。我们不能用任何其他工具代替它。可以使用Istio或 Linkerd等第三方组件来实现更高级的路由和负载均衡策略。要在 Kubernetes 上部署和运行应用程序,我们无需在源代码中添加任何内容。编排和配置是在应用程序之外实现的——在平台上。 Spring Cloud 提出了一种不同的方法。所有组件都必须在应用程序端包含和配置。它为我们提供了许多与用于云原生开发的各种工具和框架集成的可能性。但是,一开始 Spring Cloud 是围绕 Eureka、Ribbon等 Netflix OSS 组件构建的、Hystrix 或 Zuul。它为我们提供了一种机制,可以轻松地将它们包含到我们基于微服务的架构中,并将它们与其他云原生组件集成。一段时间后,必须重新考虑这种方法。今天,我们有很多由 Spring Cloud 开发的组件,比如 Spring Cloud Gateway(Zuul 替代品)、Spring Cloud Load Balancer(Ribbon 替代品)、Spring Cloud Circuit Breaker(Hystrix 替代品)。还有一个相对较新的与Kubernetes集成的项目——Spring Cloud Kubernetes。
jack.yang
2025/04/05
910
集成 Kubernetes 来构建微服务-spring cloud 入门教程
Spring Cloud 之服务网关 Gateway(二) 集成 Swagger 组件
Spring Cloud 之服务网关 Gateway(二) 集成 Swagger 组件
芥末鱿鱼
2020/09/22
2K0
Spring Cloud 之服务网关 Gateway(二) 集成 Swagger 组件
拥抱 OpenAPI 3: springdoc-openapi 食用指南
使用 springdoc-openapi 可以快速为 springboot 项目生成规范的 API 文档,具体使用步骤如下:
phoenix.xiao
2022/11/11
7K0
拥抱 OpenAPI 3: springdoc-openapi 食用指南
集成SWAGGER2服务-spring cloud 入门教程
Swagger 是最流行的用于设计、构建和记录 RESTful API 的工具。它与 Spring Boot 有很好的集成。要将其与 Spring 结合使用,我们需要向 Maven管理文件中 添加以下两个依赖项pom.xml。
jack.yang
2025/04/05
1070
集成SWAGGER2服务-spring cloud 入门教程
SpringBoot3集成Swagger
springfox 已经停止更新很久了,SpringBoot新版本都不支持。为了能够继续使用Swagger,只能调整继承库。
郭顺发
2023/07/17
2.6K0
SpringBoot3集成Swagger
【Knife4j】小试牛刀,基于gateway的集成
均参考上篇文章即可,可回头看《【Knife4j】小试牛刀,基于eureka的集成》
小尘哥
2022/09/01
1.1K0
【Knife4j】小试牛刀,基于gateway的集成
基于GraphQL的微服务实践-spring cloud 入门教程
通常,与 REST 相比,GraphQL 被认为是一种革命性的 Web API 设计方式。但是,如果您仔细研究该技术,您会发现它们之间存在很多差异。GraphQL 是一种相对较新的解决方案,已于 2015 年由 Facebook 开源。今天,REST 仍然是最流行的用于公开 API 和微服务之间的服务间通信的范式。GraphQL 会在未来超过 REST 吗?让我们来看看如何使用 Spring Boot 和 Apollo 客户端创建通过 GraphQL API 进行通信的微服务。
jack.yang
2025/04/05
1610
基于GraphQL的微服务实践-spring cloud 入门教程
神器 SpringDoc 横空出世!最适合 SpringBoot 的API文档工具来了!
SpringDoc是一款可以结合SpringBoot使用的API文档生成工具,基于OpenAPI 3,目前在Github上已有1.7K+Star,更新发版还是挺勤快的,是一款更好用的Swagger库!值得一提的是SpringDoc不仅支持Spring WebMvc项目,还可以支持Spring WebFlux项目,甚至Spring Rest和Spring Native项目,总之非常强大,下面是一张SpringDoc的架构图。
macrozheng
2022/04/12
6.4K0
神器 SpringDoc 横空出世!最适合 SpringBoot 的API文档工具来了!
SpringCloudGateway+Discovery+Swagger 动态更新分组API清单
SpringCloudGateway+Discovery+Swagger 搭建服务文档中心 中使用配置方法创建分组API清单,如果服务发生变更,需重启gateway才能生效
路过君
2021/12/07
1.1K0
使用 Spring Cloud Gateway 进行微服务架构的 API 网关实践
随着微服务架构的流行,API网关成为了微服务架构中不可或缺的一部分。API网关不仅仅是一个简单的路由器,而且还有许多其他的功能,例如负载均衡,安全性和监控等。Spring Cloud Gateway是一个轻量级的API网关,它是Spring Cloud生态系统中的一个组件,可以帮助开发人员快速构建高效的微服务架构。
堕落飞鸟
2023/04/11
1.4K0
在微服务项目中引入 knife4j
knife4j 是为 Java MVC 框架集成 Swagger 生成 Api 文档的增强解决方案。说白了,如果项目开发为前后端分离开发的话,这个插件就非常的省事儿,不用再很麻烦的写接口文档了。之前用过 Swagger 来生成文档,但是在某些情况下,Swagger 却并不适合国内的项目,尤其是验收文档。给甲方的验收文档往往包含接口文档,这是 knife4j 的导出就派上用场了。
Bess Croft
2021/11/17
2.4K0
Spring Boot 3 整合Knife4j(OpenAPI3规范)
地址:https://doc.xiaominfo.com/ Knife4j是一个集Swagger2 和 OpenAPI3 为一体的增强解决方案。
Harry技术
2025/01/13
1.4K0
Spring Boot 3 整合Knife4j(OpenAPI3规范)
Spring Boot 3.x 中使用 SpringDoc 2 / Swagger3(详解)
SpringBoot 已经成为 Java 开发的首选框架,今天码哥跟大家聊一聊 Spring Boot3 如何与 Swagger3 集成打造一个牛逼轰轰的接口文档。
码哥字节
2024/11/23
3.3K0
Spring Boot 3.x 中使用 SpringDoc 2 / Swagger3(详解)
Spring Boot使用OpenAPI规范
在WEB领域里面,随着前后端分离,后端的HTTP接口便需要去维护一份大而全的Rest API,一个比较靠谱的文档工具是必不可少的。
李鸿坤
2020/10/23
4.1K0
Spring Boot使用OpenAPI规范
在SpringCloud2023中快速集成SpringCloudGateway网关
本文主要简单介绍SpringCloud2023实战中SpringCoudGateway的搭建。
codetrend
2024/04/17
3320
在SpringCloud2023中快速集成SpringCloudGateway网关
Spring Cloud Gateway 聚合swagger文档
关于pigX:全网最新的微服务脚手架,Spring Cloud Finchley、oAuth2的最佳实践
冷冷
2018/07/20
2.3K0
推荐阅读
相关推荐
SpringCloudGateway+Discovery+Swagger 搭建服务文档中心
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验