Spring API网关中的Swagger API文档

tmb3ates  于 2022-11-06  发布在  Spring
关注(0)|答案(2)|浏览(215)

我在项目中有上述架构。产品,订单,支付微服务是一个Rest API,目前有swagger集成,但现在流程发生了变化,我不能暴露微服务Rest API,现在所有的REST API调用都是从API网关进行的。
是否有任何方法可以通过API网关以swagger形式记录API,或者对于这种情况,最佳做法是什么?
这是API网关Sping Boot 中的路由配置

@Bean
    public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/order/**")
                        .filters(f -> f.hystrix(option -> option.setName("order-service").
                                setFallbackUri("forward:/orderFallBack")))
                        .uri("lb://ORDER-SERVICE")
                        .id("order-service"))

                .route(r -> r.path("/payment/**")
                        .filters(f -> f.hystrix(option -> option.setName("payment-service")
                                .setFallbackUri("forward:/paymentFallBack")))
                        .uri("lb://PAYMENT-SERVICE")
                        .id("payment-service"))

                .route(r -> r.path("/product/**")
                        .filters(f -> f.hystrix(option -> option.setName("product-service")
                                .setFallbackUri("forward:/productFallBack")))
                        .uri("lb://PRODUCT-SERVICE")
                        .id("product-service"))
                .build();
    }

订单微服务项目中的Swagger配置

@Configuration
public class SwaggerConfiguration {
    @Bean
    public Docket orderApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(getApiInfo());
    }

    //create api metadata that goes at the top of the generated page
    private ApiInfo getApiInfo() {
        return new ApiInfoBuilder()
                .title("Fete Bird Order Microservice")
                .version("1.0")
                .description("API for managing Fete Bird Order Microservice.")
                .license("Fete Bird License Version 1.0")
                .build();
    }
}

wgx48brx

wgx48brx1#

有一种常见的做法是从网关本身提供单独的swagger端点。我在许多生产级项目中看到过这样做。
例如,对于订单服务,文档将位于:
http://gateway-url/order-service/swagger-ui.html
其他微服务也可以采用类似的方法。

busg9geu

busg9geu2#

请确保在您的服务中具有以下依赖项:产品、支付、订单和API网关:

<dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${swagger.version}</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${swagger.version}</version>
    </dependency>

在您的所有服务中添加@EnableSwagger2注解。
在你的API网关项目中添加zuul代理依赖项。这将把流量从api-gateway swagger路由到你的其他服务。

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>

在api-gateway中添加@EnableZuulProxy注解。
然后,将此配置放入api-gateway中,一切都将正常工作。

@Primary
@Configuration
public class Swagger2Config implements SwaggerResourcesProvider {

@Autowired
private RouteLocator routeLocator;

@Override
public List<SwaggerResource> get() {
    List<SwaggerResource> resources = new ArrayList<>();

    routeLocator.getRoutes().forEach(route -> {
        resources.add(swaggerResource(route.getId(), route.getFullPath().replace("**", "v2/api-docs"), "1.0"));
    });

    return resources;
}

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

}
当你登陆你的API网关页面时,在右上方你会看到一个产品、支付和订单服务的选择选项。选择其中任何一个,然后尝试使用API。

相关问题