SpringCloudAlibaba网关聚合微服务swagger

微服务swagger配置

引入依赖

<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>

配置swagger


import io.swagger.annotations.ApiOperation;
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;
 
/*
 * 
 * 接口文档生成工具
 */
@EnableSwagger2
@Configuration
public class SwaggerConfig {
    @Bean
    public Docket productApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))  //添加ApiOperiation注解的被扫描
                .paths(PathSelectors.any())
                .build();
 
    }
 
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().title("swagger和springBoot整合").description("swagger的API文档")
                .version("1.0").build();
    }
 
}

配置微服务yml文件,需要给服务加个前缀,不然网关转发到微服务上找不到api-docs文件

启动微服务,查看swagger通过访问http://localhost:9001/UserService/swagger-ui.html

网关配置聚合swagger

引入依赖

<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>

配置聚合swagger


import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.support.NameUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.config.ResourceHandlerRegistry;
import org.springframework.web.reactive.config.WebFluxConfigurer;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Component
@AllArgsConstructor
public class CustomSwaggerResourceProvider implements SwaggerResourcesProvider {
    /**
     * Swagger2默认的url后缀
     */
    public static final String SWAGGER2URL = "/v2/api-docs";
    /**
     * 网关路由
     */
    @Autowired
    private final RouteLocator routeLocator;
    @Autowired
    private final GatewayProperties gatewayProperties;
    /**
     * 聚合其他服务接口
     * @return
     */
    @Override
    public List<SwaggerResource> get() {
        List<SwaggerResource> resourceList = new ArrayList<>();
        List<String> routes = new ArrayList<>();
        //获取网关中配置的route
        routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
        gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId()))
                .forEach(routeDefinition -> routeDefinition.getPredicates().stream()
                        .filter(predicateDefinition -> "Path".equalsIgnoreCase(predicateDefinition.getName()))
                        .forEach(predicateDefinition -> resourceList.add(
                                swaggerResource(
                                        routeDefinition.getId(),
                                        predicateDefinition
                                                .getArgs()
                                                .get(NameUtils.GENERATED_NAME_PREFIX + "0")
                                                .replace("/**",SWAGGER2URL)
                                )
                        )));
        return resourceList;
    }

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



}

swagger-controller


import com.gjs.springcloudgateway.config.CustomSwaggerResourceProvider;
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;


@RestController
@RequestMapping("/swagger-resources")
public class SwaggerResourceController {

    private CustomSwaggerResourceProvider customSwaggerResourceProvider;

    @Autowired
    public SwaggerResourceController(CustomSwaggerResourceProvider customSwaggerResourceProvider) {
        this.customSwaggerResourceProvider = customSwaggerResourceProvider;
    }

    @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<>(customSwaggerResourceProvider.get(), HttpStatus.OK);
    }

}

配置yaml文件,路由id与上面配置前缀一致

启动网关,通过网关访问swagger:localhost/swagger-ui.html

效果

这样访问网关的swagger可以去选择访问对应微服务的swagger

swagger的一些常用注解:

在使用 Swagger 来生成 API 文档时,在接口的定义上通常需要添加一些注解来描述接口的信息。以下是一些常用的 Swagger 注解及其作用:

  1. @Api:用于描述整个接口文档的信息,如接口的名称、描述等。
  2. @ApiOperation:用于描述接口的操作,包括接口的描述、请求方法等。
  3. @ApiParam:用于描述接口的参数信息,包括参数名、描述、是否必须等。
  4. @ApiImplicitParams:用于描述接口的隐式参数。
  5. @ApiResponses:用于描述接口的响应信息,包括不同响应状态码下的描述。
  6. @ApiModel:用于描述数据模型。
  7. @ApiModelProperty:用于描述数据模型的属性。
### 回答1: gateway(网关)和swagger3可以结合使用,以便显示和测试API的好处。Swagger是一种API规范,使API文档易于理解和使用。网关将客户端请求发送到API,并将API响应返回给客户端,可以通过swagger UI进行预览和测试。 ### 回答2: Gateway网关是一个负责接入各种服务的组件,在系统架构中扮演着重要的角色。它可以对入口请求进行统一处理,如鉴权、路由、流量控制等,并将请求转发到具体的服务上。 Swagger3是一种流行的API文档生成框架,旨在帮助开发人员更好地理解和使用API。 在Gateway网关聚合Swagger3,可以实现以下功能: 1. 统一的API文档:在Gateway网关中集成Swagger3,可以方便地生成API文档,并在统一的位置对外暴露。这样不仅可以减少开发人员重复编写文档的工作量,而且可以提高文档的可读性和可维护性。 2. 经过授权的API调用:Gateway网关可以通过集成Swagger3的鉴权功能,将用户授权和API调用联系起来。这意味着只有经过授权的用户才能调用特定的API,从而提高了系统的安全性。 3. 统一的API管理:通过Gateway网关,可以将不同的API集成进来,并在同一个位置进行管理和监控。这样可以减少API管理过程中的复杂度,提高管理效率。 4. 支持多种协议:Gateway网关可以支持多种协议,如HTTP、WebSocket、TCP和UDP等。通过聚合Swagger3,可以更好地支持RESTful风格的API,并对其他协议提供更好的支持。 综上所述,Gateway网关聚合Swagger3可以提高系统的可维护性和可扩展性,同时也可以使API的管理更加方便和高效。此外,它还可以提高系统的安全性,更好地支持RESTful风格的API,并供其他协议提供更好的支持。 ### 回答3: Gateway网关被广泛应用于微服务架构,其作为微服务系统的入口,扮演着负载均衡、路由转发、安全验证、限流熔断等重要角色。Swagger是一种用于描述和共享RESTful API的工具,Swagger可以帮助开发人员快速了解其使用API的方式,节省开发时间。 随着Swagger的不断发展,Swagger 3.0版本已经推出,并且在一定程度上解决了Swagger 2.0存在的问题。使用Swagger 3.0可以更加方便地描述和调试API,并且可以支持多种编程语言。与此同时,Gateway网关Swagger 3.0的整合也为企业多个微服务之间的信息传递带来了更加便利的方式。Gateway网关可以将多个微服务的接口进行聚合,进而组成一个统一的API接口,而Swagger 3.0的描述规范可以使Gateway网关更加精准地描述这些API接口的使用方式和参数信息,从而使API的使用者能够更加便捷地了解API的使用方式,提高了开发效率。 通过Gateway网关聚合Swagger 3.0,企业可以将多个微服务API进行整合,组成一个更加高效的整体API接口,并且可以减少开发人员的代码开发量。同时,这种集成方式也可以使API的使用者更加方便地了解API的基本信息,减少了可能出现的错误和不必要的麻烦。因此,Gateway网关聚合Swagger 3.0是非常重要的,对企业提升API管理能力、提高开发效率和优化用户体验有着巨大的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值