Spring Cloud Gateway集成聚合型Spring Boot API发布组件knife4j,增强Swagger

这篇具有很好参考价值的文章主要介绍了Spring Cloud Gateway集成聚合型Spring Boot API发布组件knife4j,增强Swagger。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家都知道,在前后端分离开发的时代,前后端接口对接是一项必不可少的工作。

可是,为后端开发,怎么和前端更好的配合,才能让自己不心累、脑累,直接扔给前端一个后端开放api接口文档或者页面,让前端不用看着难受,也不用前端老问你,来愉快的合作呢?

原来可能我们一直用的是Swagger,不得不说Swagger是一个非常好的框架,自从它的出现,大大减少了我们对接的繁重工作。(以前我们开发可是经常要写开发接口文档的)

可是我们在用Swagger时,不管是Swagger本身,还是SwaggerUI,用起来其实不是那么的便捷,尤其是SwaggerUI,反正我用起来真的很是难受,也许是因为它不是我们国人开发的,所以操作方面根本没有我们国人的操作习惯设计。

幸好啊,我们国人也是很厉害的。

Knife4j这个东东,简直是及时雨,用起来丝滑的很。看看它的界面,是不是就是国人的思维设计?

Spring Cloud Gateway集成聚合型Spring Boot API发布组件knife4j,增强Swagger,spring boot,后端,java

有了这个东东,那么我们来研究一下,怎么让他来集成我们的Gateway,那么如何实现Gateway,可以查看我的上一篇文章。

轻量级的Spring Cloud Gateway实践,实现api和websocket转发https://blog.csdn.net/t610654893/article/details/137783310?spm=1001.2014.3001.5501

那么,我在这个项目基础上,实现Knife4j的集成实现。

首先,我来说一下我的整体项目结构:

--- 俩个主要的Spring Boot名
【app-server】前端接口服务
【manager-server】后端管理平台服务器接口
--- 微服网关、配置等平台服务
【cloud-server】
---【gateway-starter】路由套件 
--- 等等
【common-server】公共starter目录的服务
---【boot-starter】公共套件 
--- 等等

好,那么我们先从gateway着手来实现。首先pom.xml内引入:

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

在Gateway项目内,新增一个类集成SwaggerResourcesProvider配置SwaggerProvider,获取Api-doc!

/**
 * <b>功能:</b>SWAGGER聚合服务<br>
 */
@Slf4j
@Component
@Primary
@AllArgsConstructor
public class SwaggerResourceConfig implements SwaggerResourcesProvider {

    @Resource
    private Environment env;

    private final RouteLocator routeLocator;
    private final GatewayProperties gatewayProperties;


    @Override
    public List<SwaggerResource> get() {
        List<SwaggerResource> resources = new ArrayList<>();
        List<String> routes = new ArrayList<>();
        routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
        gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())).forEach(route -> {
            route.getPredicates().stream()
                    .filter(predicateDefinition ->
                            ("Path").equalsIgnoreCase(predicateDefinition.getName()))
                    .forEach(predicateDefinition ->
                            resources.add(swaggerResource(route.getId(),
                                    predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("**", "v3/api-docs"))));
        });

        return resources;
    }

    private SwaggerResource swaggerResource(String name, String location) {
        log.info("name:{},location:{}", name, location);
        SwaggerResource swaggerResource = new SwaggerResource();
        swaggerResource.setName(env.getProperty(name));
        swaggerResource.setLocation(location + "?group=KN");
        swaggerResource.setSwaggerVersion("3.0.3");
        return swaggerResource;
    }
}

​​​​​为了能更好的实现界面的客观性,我们这里写了一个swaggerResource的方法,此方法主要是为了能更好的表达我们的Api接口是属于谁的。比如说我们在Gateway的配置内配置了:routes[0].id=lb://app-server, 那么我们在配置后再加一个app-server=分组接口,那么在Knife4j内就可以更直观的选择属于app-server的项目API了。

Spring Cloud Gateway集成聚合型Spring Boot API发布组件knife4j,增强Swagger,spring boot,后端,java

我们这里主要还是你为了集成Swagger的内容,来完成Knife4j的前段实现。

因为Gateway里没有配置SwaggerConfig,而运行Swagger-ui又需要依赖一些接口,所以我们还需要自己来实现swagger-resource端点。

这里其实也很简单,我们再新建一个类,来完成我们对swagger-resource的实现。

/**
 * <b>功能:</b>SWAGGER聚合服务<br>
 */
@RestController
public class SwaggerHandler {

    @Autowired(required = false)
    private SecurityConfiguration securityConfiguration;

    @Autowired(required = false)
    private UiConfiguration uiConfiguration;

    private final SwaggerResourcesProvider swaggerResources;

    @Autowired
    public SwaggerHandler(SwaggerResourcesProvider swaggerResources) {
        this.swaggerResources = swaggerResources;
    }

    @GetMapping("/swagger-resources/configuration/security")
    public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
        return Mono.just(new ResponseEntity<>(
                Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
    }

    @GetMapping("/swagger-resources/configuration/ui")
    public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
        return Mono.just(new ResponseEntity<>(
                Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
    }

    @GetMapping("/swagger-resources")
    public Mono<ResponseEntity> swaggerResources() {
        return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
    }

    @GetMapping("/api")
    @SentinelResource("api")
    public Set<ApiDefinition> apiRules() {
        return GatewayApiDefinitionManager.getApiDefinitions();
    }

    @GetMapping("/gateway")
    @SentinelResource("gateway")
    public Set<GatewayFlowRule> apiGateway() {
        return GatewayRuleManager.getRules();
    }

    @GetMapping("/flow")
    @SentinelResource("flow")
    public List<FlowRule> apiFlow() {
        return FlowRuleManager.getRules();
    }
}

Gateway端接口已经配置完成。接下来配置实现客户端,由于我的工程俩个server都引入了boot-server,所以这里我只在boot-server内实现即可。

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-micro-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

客户端服务基本也就是按照Swagger的配置写config即可。这样更加方便我们以Swagger为基础更增强我们的api接口发布。为了更详尽的使用,我们一一实现。

增加Swagger 配置类

@EnableOpenApi
@Configuration
@EnableConfigurationProperties(value = {SwaggerProperties.class})
public class SwaggerConfiguration {

  @Resource
  private SwaggerProperties swaggerProperties;

  @Bean
  public Docket createRestApi() {
      Boolean enable = swaggerProperties.getEnable();
      String tryHost = swaggerProperties.getTryHost();
      return new Docket(DocumentationType.OAS_30)
              .groupName("KN")
              // 定义是否开启swagger,false为关闭,可以通过变量控制
              .enable(enable)
              // 将api的元信息设置为包含在json ResourceListing响应中。
              .apiInfo(apiInfo())
              // 接口调试地址
              .host(tryHost)
              // 选择哪些接口作为swagger的doc发布
              .select()
              .apis(RequestHandlerSelectors.any())
              .paths(PathSelectors.regex("/api/.*"))
              .build();
 }


  /**
   * <b>功能描述:</b>API 页面上半部分展示信息<br>
   * <b>修订记录:</b><br>
   * <li>20201225&nbsp;&nbsp;|&nbsp;&nbsp;田星亮&nbsp;&nbsp;|&nbsp;&nbsp;创建方法</li><br>
   */
  private ApiInfo apiInfo() {
      return new ApiInfoBuilder()
              .title(swaggerProperties.getApplicationName())
              .description(swaggerProperties.getApplicationDescription())
              .termsOfServiceUrl("https://www.kn.com/")
              .contact(new Contact("KN", null, "admin@kn.com"))
              .version(swaggerProperties.getApplicationVersion())
              .build();
  }
}

​​​​​​​这里我们再增强一下,使我们的接口更符合api接口规范,给API头增加名为Token的头,在createRestApi方法Docket实现内增加俩个方法后缀,并付上实现:

.build()
// 授权信息设置,必要的header token等认证信息
.securitySchemes(securitySchemes())
.securityContexts(securityContexts());
 /**
   * <b>功能描述:</b>设置授权信息<br>
   */
  private List<SecurityScheme> securitySchemes() {
      return Collections.singletonList(new ApiKey("token", "token", In.HEADER.toValue()));
  }


  /**
   * <b>功能描述:</b>授权信息全局应用<br>
   */
  private List<SecurityContext> securityContexts() {
      return Collections.singletonList(
              SecurityContext.builder()
                      .securityReferences(Collections.singletonList(new SecurityReference("token", new AuthorizationScope[]{new AuthorizationScope("global", "")})))
                      .build()
      );
  }

​​​​​​​上方内配置项详解,完成灵活调用

@Data
@ConfigurationProperties("swagger")
public class SwaggerProperties {

    /**
     * 是否开启swagger,生产环境一般关闭,所以这里定义一个变量
     */
    private Boolean enable;

    /**
     * 项目应用名
     */
    private String applicationName;

    /**
     * 项目版本信息
     */
    private String applicationVersion;

    /**
     * 项目描述信息
     */
    private String applicationDescription;

    /**
     * 接口调试地址
     */
    private String tryHost;
}

至此,我们配置完成,打开Gateway所属的端口链接即可完成Knife4j的访问。Knife4j的配置内还有一些高级项配置,大家按照自己需要增强哦,比如说api排序这个我就很喜欢。文章来源地址https://www.toymoban.com/news/detail-855402.html

到了这里,关于Spring Cloud Gateway集成聚合型Spring Boot API发布组件knife4j,增强Swagger的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud Gateway实现灰度发布功能

    灰度发布又名金丝雀发布,在微服务中的表现为同一服务同时上线不同版本,让一部分用户使用新版本来验证新特性,如果验证没有问题,则将所有用户都迁移到新版本上。 在微服务架构中,网关负责请求的统一入口,主要功能之一是请求路由。而灰度发布实质就是让指定用

    2024年02月21日
    浏览(81)
  • 第十章 : Spring cloud 网关中心 Gateway (灰度发布)

    第十章 : Spring cloud 网关中心 Gateway (灰度发布) 前言 本章知识点:介绍了常用版本发布的方式:蓝绿发布,滚动发布以及金丝雀发布,并对比了各个发布方式的优劣势,重点阐述了如何通过Spring cloud 网关中心 Gateway 基于nacos 注册中心与配置中心的前提条件下,实现网关灰

    2024年01月17日
    浏览(38)
  • Spring Cloud Gateway集成Nacos实现负载均衡

    💡Nacas可以用于实现Spring Cloud Gateway中网关动态路由功能,也可以基于Nacos来实现对后端服务的负载均衡,前者利用Nacos配置中心功能,后者利用Nacos服务注册功能。 接下来我们来看下Gateway集成Nacos实现负载均衡的架构图 一. 环境准备 1. 版本环境 Jdk: java.version1.8/java.version Spr

    2024年02月10日
    浏览(59)
  • Spring Cloud之API网关(Gateway)

    目录 API网关 好处 解决方案 Gateway 简介 特征 核心概念 Route(路由) Predicate(断言) Filter(过滤器) 工作流程 Route(路由) 路由配置方式 1.yml配置文件路由 2.bean进行配置 3.动态路由 动态路由 Predicate(断言) 特点 常见断言 示例 Filter(过滤器) filter分类 Pre 类型 Post 类型 网关过滤器 格式

    2024年02月08日
    浏览(51)
  • Spring Cloud Gateway 网关整合 Knife4j 4.3 实现微服务接口文档聚合

    🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正! youlai-mall 开源微服务商城新版本基于 Spring Boot 3 和 Java 17,同时采用 Knife4j 4.3。与以前版本不同的是

    2024年02月05日
    浏览(50)
  • Spring Cloud Gateway集成sentinel进行网关限流

    本文使用版本如下:

    2024年02月09日
    浏览(49)
  • Spring Cloud Gateway集成Nacos作为注册中心和配置中心

    本篇文章将介绍Spring Cloud Alibaba体系下Spring Cloud Gateway的搭建,服务注册中心和分布式配置中心使用Nacos,后续将会持续更新,介绍集成Sentinel,如何做日志链路追踪,如何做全链路灰度发布设计,以及Spring Cloud Gateway的扩展等。 ​ Spring Boot,Spring Cloud,Discovery,Config等基础依

    2024年02月11日
    浏览(113)
  • Gateway网关组件(在Spring Cloud整合Gateway(idea19版本))

            Spring Cloud Gateway官网:Spring Cloud Gateway         局域网中就有网关这个概念,局域网接收数据或发送数据都要通过网关,比如使用VMware虚拟机软件搭建虚拟机集群的时候,往往我们需要选择IP段中的⼀个IP作为网关地址,网关可以对请求进行控制,提升我们系统的安

    2024年02月16日
    浏览(44)
  • Spring Cloud Gateway - 新一代微服务API网关

    如果没有网关,难道不行吗?功能上是可以的,我们直接调用提供的接口就可以了。那为什么还需要网关? 因为网关的作用不仅仅是转发请求而已。我们可以试想一下,如果需要做一个请求认证功能,我们可以接入到 API 服务中。但是倘若后续又有服务需要接入,我们又需要

    2024年02月16日
    浏览(49)
  • 微服务·架构组件之网关- Spring Cloud Gateway

    微服务架构已成为构建现代化应用程序的关键范式之一,它将应用程序拆分成多个小型、可独立部署的服务。Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件,用于构建和管理微服务架构中的网关。本报告旨在调查和介绍Spring Cloud Gateway的核心概念、架构、功能以及其在

    2024年02月09日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包