springcloud gateway整合swagger做分布式聚合文档

Spring Cloud 之服务网关 Gateway(二) 集成 Swagger 组件 Spring Cloud 之服务网关 Gateway(二) 集成 Swagger 组件 概述 Swagger 是一个可视化 API 测试工具, 能够有效的构建强大的 Restful API 文档, 省去接口文档管理工作. 如果修改了代码, API 文档也会实时更新. 并且可以部分替代 Postman 用来调试接口 Spring Boot 整合了 swagger 组件, 使用也比较简单. 微服务随着项目的增加, 访问每一个应用的 swagger 显然是不合适的. 我们希望网关可以将所有的应用的 swagger 阅读详情

项目中使用gateway做路由,根据请求头访问不同的api,api中使用openfegin,去访问对应的service。为了说明配置,摘取项目核心的代码。包括gateway,user-api,standard-api。

1.swagger依赖

gateway和api中的需要引入swagger的相应依赖:

<properties>
    <swagger.version>2.9.2</swagger.version>
</properties>
<dependencies> 
    <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
</dependencies>      
2.gateway中配置加载swagger信息
import com.ruizhi.detection.component.SwaggerProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.swagger.web.*;

import java.util.List;

/**
 * @description: 用于加载swagger中相关信息的controller
 * @Author: 
 * @Date: 2020/2/11 11:27
 */
@RestController
@RequestMapping("/swagger-resources")
public class SwaggerResourceController {

    private SwaggerProvider swaggerProvider;

    // TODO: 添加权限校验
    @Autowired
    public SwaggerResourceController(SwaggerProvider swaggerProvider) {
        this.swaggerProvider = swaggerProvider;
    }

    @RequestMapping(value = "/configuration/security")
    public ResponseEntity<SecurityConfiguration> securityConfiguration() {
        return new ResponseEntity<>(SecurityConfigurationBuilder.builder().build(), HttpStatus.OK);
    }

    @RequestMapping(value = "/configuration/ui")
    public ResponseEntity<UiConfiguration> uiConfiguration() {
        return new ResponseEntity<>(UiConfigurationBuilder.builder().build(), HttpStatus.OK);
    }

    @RequestMapping
    public ResponseEntity<List<SwaggerResource>> swaggerResources() {
        return new ResponseEntity<>(swaggerProvider.get(), HttpStatus.OK);
    }
}
3.gateway中配置nacos中注册的服务
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @description: 用于加载在nacos中注册的服务
 * @Author:
 * @Date: 2020/2/11 11:23
 */
@Component
public class SwaggerProvider implements SwaggerResourcesProvider {

    /**
     * swagger2默认的url后缀
     */
    private static final String SWAGGER2URL = "/v2/api-docs";

    /**
     * 网关路由
     */
    private final RouteLocator routeLocator;

    /**
     * 网关应用名称
     */
    @Value("${spring.application.name}")
    private String self;

    @Autowired
    public SwaggerProvider(RouteLocator routeLocator) {
        this.routeLocator = routeLocator;
    }

    @Override
    public List<SwaggerResource> get() {
        List<SwaggerResource> resources = new ArrayList<>();
        List<String> routeHosts = new ArrayList<>();
        // 获取所有可用的host:serviceId
        routeLocator.getRoutes().filter(route -> route.getUri().getHost() != null)
                .filter(route -> !self.equals(route.getUri().getHost()))
                .subscribe(route -> routeHosts.add(route.getUri().getHost()));
        // 记录已经添加过的server,存在同一个应用注册了多个服务在nacos上
        Set<String> dealed = new HashSet<>();
        routeHosts.forEach(instance -> {
            // 拼接url
            String url = "/" + instance + SWAGGER2URL;
            if (!dealed.contains(url)) {
                dealed.add(url);
                SwaggerResource swaggerResource = new SwaggerResource();
                swaggerResource.setUrl(url);
                swaggerResource.setName(instance);
                resources.add(swaggerResource);
            }
        });
        return resources;
    }
}
4.user-api和standard-api中设置swagger中的配置

这两个类基本上差不多,我只贴其中一个

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @description: 配置描述swagger的描述
 * @Author: 
 * @Date: 2020/2/11 11:47
 */
@EnableSwagger2
@Configuration
public class SwaggerConfig {

    /**
     * 创建API
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 详细定制
                .apiInfo(apiInfo("1.0.0"))
                .select()
                // 指定扫描的包路径
              .apis(RequestHandlerSelectors.basePackage("com.detection.controller"))
                // 扫描所有
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * 添加摘要信息
     */
    private ApiInfo apiInfo(String version) {
        // 用ApiInfoBuilder进行定制
        return new ApiInfoBuilder()
                .title("标准管理的接口文档")
                .version(version)
                .build();
    }
}
5.gateway中路由规则的配置
spring:
  cloud:
    gateway:
      enabled: true
      discovery:
        locator:
          lower-case-service-id: true
      routes:
        #netty 路由过滤器(数组),http或https开头 lb://代表是服务的名称  predicates:表示会过滤掉的请求头
        - id: user-router
          uri: lb://user-api
          predicates:
            - Path=/user-api/**
          filters:
          - StripPrefix=1
        - id: standard-router
          uri: lb://standard-api
          predicates:
            - Path=/standard-api/**
          filters:
          - StripPrefix=1
        - id: file-upload-router
          uri: lb://file-service
          predicates:
            - Path=/file-service/**
          filters:
          - StripPrefix=1
    #处理跨域请求问题
    globalcors:
      cors-configurations:
        '[/**]':
          allowedOrigins: "*"
          allowedMethods: "*"

这里需要主要path中的请求头,需要跟uri中的一致,都是你服务的名称,否则你访问的时候,就过滤不掉头部,请求具体的api时会多一个请求头。
配置好之后,启动访问http://localhost:{port}/swagger-ui.html就可以看到swagger的页面了。其中port为你的gateway端口.
在这里插入图片描述
具体swagger的配置,可以网上搜索一下api,这里我贴几个大概的参考下。

1.controller的代码
    /**
     * 新增标准信息
     * @param dto 标准的dto
     * @return
     */
    @ApiOperation(value = "新增标准信息", httpMethod = "POST")
    @RequestMapping(value = "/saveStandardInfo", method = RequestMethod.POST)
    public ResponseDto saveStandardInfo(@RequestBody StandardInfoDto dto) {
        return iStandardInfoService.saveStandardInfo(dto);
    }

    /**
     * 标准信息--查看
     * @param standardId 标准的id
     * @return ResponseDto
     * <StandardInfoDto>这种写法是为了让其在swagger中展示嵌套的json值
     */
    @ApiOperation(value = "根据id查询标准信息", httpMethod = "GET")
    @RequestMapping(value = "/findStandardInfo", method = RequestMethod.GET)
    @ApiImplicitParam(name = "standardId", value = "标准id", dataType = "string")
    public ResponseDto<StandardInfoDto> findStandardInfo(@RequestParam(value = "standardId") String standardId) {
        return iStandardInfoService.findStandardInfo(standardId);
    }

    /**
     * 标准信息--修改状态
     * @param standardId    标准的id
     * @param standardState 标准的状态
     * @return
     */
    @ApiOperation(value = "修改标准信息的状态", httpMethod = "GET")
    @RequestMapping(value = "/updateStateStandardInfo", method = RequestMethod.GET)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "standardId", value = "标准id", dataType = "string"),
            @ApiImplicitParam(name = "standardState", value = "标准的状态", dataType = "string", example = "1,2,3")
    })
    public ResponseDto updateStateStandardInfo(@RequestParam(value = "standardId") String standardId, @RequestParam(value = "standardState") String standardState) {
        return iStandardInfoService.updateStateStandardInfo(standardId, standardState);
    }
2.model
/**
 * @description:用于返回数据的dto
 * @Author:
 * @Date: 2019/8/15  15:46
 */
@Data
@ApiModel("返回类")
public class ResponseDto<T> {

    /**
     * 状态码
     */
    @ApiModelProperty(value = "状态码")
    private Integer code;

    /**
     * 状态信息
     */
    @ApiModelProperty(value = "状态信息")
    private String message;

    /**
     * 数据
     */
    @ApiModelProperty(value = "数据")
    private T data;

    public ResponseDto(Integer code, String message, T data) {
        this.code = code;
        this.data = data;
        this.message = message;
    }
}

这里注意就是apiModel中,可以用value,也可以用tag,但是用tag会出现多个的model,还有就是不管用tag还是value,不能出现"/"否则会报错。

spring-cloud-gateway聚合swagger文档 需求背景 spring cloud搭建微服务系统,每个业务模块使用swagger开放文档接口查询,在业务网关模块提供swagger文档聚合查询接口,可以通过选择业务模块分类查看。 框架选型、版本及主要功能 spring boot 2.1.6.RELEASE spring cloud Greenwich.SR3 spring cloud gateway 2.1.3.RELEASE 网关组件 knife4j 2.0.1 增强swagger ui样式,网关使用其starter依赖 swagger bootstr 阅读详情

相关推荐

SpringBoot [ 5.集成Swagger-Bootstrap-UI]

SpringBoot [ 4.集成Swagger-Bootstrap-UI] - 目录 文章目录1.引入依赖 首先Swagger它是一个API文档工具,可以通过各种注解生成接口文档,Model文档,但是我在使用Swagger的时候,觉得实用性并不高,一个机会接触到了基于Swagger开发的Swagger-Bootstrap-UI,觉得很好用; 这款工具对我们公司的开发帮助还挺大,我们后端人员经常...

馒头的博客 4059

SpringCloud集成Swagger

原理 利用zuul获取其他服务的API信息进行集中管理 服务 eureka 注册中心 http://localhost:7001/eureka zuul API网关 http://localhost/api/ provider服务提供者htpp://localhost:8080/provider/ 配置 eureka配置 zuul配置 provider为一个普通的Springcloud服务,提供api接口 zuul中添加swagger 架包 <dependency>

weixin_44728369的博客 962

磁栅尺的基本原理

一、磁栅尺简介 磁栅尺(Magnetic scale)是一种常见于工业自动化设备领域的线性位移测量方案,因为其耐用性强,对环境要求不高,逐渐替代了对环境要求苛刻的光学直线测量方案。 作为自动化设备领域里不多见的精密位移检测方案,磁栅尺使用广泛,尤其适用于检测行程长、测量精度要求高、工况复杂的大型机床。磁栅尺安装方便,抗干扰能力强,抗冲击性强,不易受到振动、粉尘、水垢、油污等影响,耐高温和耐低温性能也较为突出。 二、磁栅尺基本组成与原理 磁栅尺主要由两个部分组成,磁尺和读磁头。 磁尺 磁尺是磁栅尺

Luckboy_shy的博客 1万+

SPRING CLOUD GATEWAY集成SWAGGER方案总结

https://www.freesion.com/article/50961265470/ 文章目录 spring cloud gateway集成swagger方案总结 前言 一、服务的swagger配置 1.引入依赖包 2.添加swagger配置类 二、spring cloud gateway 集成swagger 1.spring cloud gateway搭建 2.在网关中引入swagger包

yygr的博客 6512

shopee app算法分析第一篇

shopee app算法分析第一篇分析完整算法大概要好几篇,耐心等待下.国内只会发律师函,牛逼,一个律师套话,一个律师发函,大意了(警惕卡通律师头像),希望law可以保护好你,还是干国外好.

2529

【unity】Google 登录和Google支付接入unity

google 支付 google 登录

云渊寒烬 8495

SpringCloud gateway (史上最全)

SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

2509_94199628的博客 608

手把手教你用STM32F103C8T6驱动HUB75 LED点阵屏(附74HC595级联代码)

本文详细介绍了如何使用STM32F103C8T6开发板驱动HUB75接口的LED点阵屏,包括硬件连接、74HC595级联代码、时序控制及灰度显示实现。通过实战案例展示动态文字显示和性能优化技巧,帮助开发者快速掌握LED点阵屏驱动技术。

weixin_42623010的博客 341

SpringCloudAlibaba篇(八)SpringCloudGateWay聚合swagger3、SpringBoot2.6.X整合swagger3+knife4j

文章目录前言构建依赖配置类 前言 Knife4j的前身是swagger-bootstrap-ui,前身swagger-bootstrap-ui是一个纯swagger-ui的ui皮肤项目 knife4j官网 构建依赖 <!-- knife4j--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter&lt

weixin_43627706的博客 3962

DEXPI与Proteus XML:解锁过程工业P&ID数据互操作性的技术核心

本文深入探讨了DEXPI与Proteus XML在过程工业P&ID数据互操作性中的核心技术。通过解析DEXPI标准的开源特性和Proteus XML的架构设计,揭示了其在跨平台数据交换中的关键作用,并结合CADMATIC和西门子COMOS的实战案例,展示了如何实现高效的数据集成与转换。

weixin_29195615的博客 383

MIUI升级后录音神秘消失?别慌!手把手教你从Android/data目录找回宝贵录音文件

本文详细解析了MIUI升级后录音文件消失的原因,并提供了从Android/data目录找回录音文件的实用指南。通过技术分析和步骤演示,帮助小米手机用户解决录音文件丢失问题,同时分享预防措施和高级恢复方案,确保重要录音数据安全。

weixin_30696427的博客 281
上一篇: windows中nginx启动报bind() to 0.0.0.0:80 failed(An attempt was made to access a socket in a way forbid)
下一篇: springcloud gateway中进行统一处理api接口异常返回
蓝色格子
博客等级 码龄9年 129粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值