Spring API Gateway中的Swagger API文档

9

w

我在项目中有以上架构。产品、订单、支付微服务是Rest API,目前已经集成了Swagger,但是现在流程发生了变化,我不能暴露微服务的Rest API,现在所有的REST API调用都是从API网关进行的。
有没有办法通过API网关在swagger中文档化API,或者这种情况下的最佳实践是什么。
这是API Gateway Spring 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();
    }
}

enter image description here


你解决了吗? - undefined
@DumanZhanbolatov 这可能会对你有帮助的 https://www.youtube.com/watch?v=utRxyPfFlDw&feature=youtu.be 和 https://github.com/springdoc/springdoc-openapi-demos - undefined
有更新吗?有人找到解决办法了吗? - undefined
可以从spring.io的会议中获得帮助。请访问https://www.youtube.com/watch?v=utRxyPfFlDw&t=1895s。 - undefined
2个回答

0
确保您的服务中有以下依赖项:产品、支付、订单和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-gateway的swagger页面时,在右上角会看到一个选择选项,包括产品、支付和订单服务。选择其中任何一个,并尝试使用API。

我没有使用Zuul,而是使用Swing Gateway。 - undefined
你的Swagger在个人项目上能正常工作吗?例如,如果你访问{host}:{port}/order-service/swagger-ui.html,你能发送请求吗? - undefined
是的,Swagger在独立项目中可以正常工作。但是在API网关中无法正常工作。 - undefined
所以,问题出在代理请求上。 Swing Gateway是什么?我找不到任何用于本地测试的Maven依赖项。它是一种自定义开发的库还是可以在Maven中央仓库找到的东西? - undefined
我按照你的指示成功在API网关中获取到了Swagger的ul,但是无法像示例中那样获取到Swagger文档。我的端点没有暴露出http://localhost:8084/order/v2/api-docs。 - undefined
显示剩余4条评论

-1

有一种常见的做法是使单独的Swagger端点从网关本身可用。我在许多生产级项目中都见过这样做。

例如,对于订单服务,文档将位于:

http://gateway-url/order-service/swagger-ui.html

可以采用类似的方法来处理其他微服务。


我不知道如何从Api Gateway公开Swagger UI,你能帮我写一些代码吗? - undefined
你不需要为网关上的Swagger进行任何特定的配置,你应该能够像访问其他API一样访问它。你可以做的一件事是检查你的网关配置,如果你能在这里发布它可能会有所帮助。另一件事是确保你正在调用Swagger的正确URL - 尝试localhost:8084/order-service/swagger-ui.html。 - undefined
终端网关没有暴露 http://localhost:8084/order/v2/api-docs。你能帮我吗? - undefined
1
你能帮我决定应该使用springdoc-openapi还是springfox吗? - undefined
我确实使用了spring-fox来实现这个,但是我建议使用open-api,因为它是更新的版本,很多项目正在从spring-fox迁移到open-api。 - undefined
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接