Документация Swagger Api в Spring API Gateway - PullRequest
0 голосов
/ 11 июля 2020

w

I have the above architecture in the project. Product, Order, Payment Microservice is a Rest API which currently has swagger integration, but now the flow is changed I can't expose the Microservice Rest API now all the REST API calls is been made from API Gateway.

Is there any way to document the API through API gateway in swagger or what is the best practice for this case.

This is the routing configuration in 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 in Order Microservice Project

@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();
    }
}

введите описание изображения здесь

Ответы [ 3 ]

3 голосов
/ 13 июля 2020

Нашел лучшее решение из приведенного ниже репо и видеоурока

Репо - https://github.com/springdoc/springdoc-openapi-demos

Видео - https://www.youtube.com/watch?v=utRxyPfFlDw&feature=youtu.be

0 голосов
/ 11 июля 2020

Убедитесь, что в ваших сервисах есть следующие зависимости: продукт, платеж, заказ и 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 во все ваши сервисы.

Добавьте зависимости прокси zuul в свой проект шлюза API. Это должно направить трафик c от api-gateway swagger к другим вашим службам.

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

Добавьте аннотацию @EnableZuulProxy в api-gateway.

Затем поместите эту конфигурацию в api -шлюз, и все должно работать.

@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;
}

}

Когда вы попадете на страницу swagger API-шлюза, в правом верхнем углу вы увидите вариант выбора продукта, оплаты и заказать услуги. Выберите любой из них и попробуйте использовать API.

0 голосов
/ 11 июля 2020

Существует одна распространенная практика - сделать отдельные конечные точки swagger доступными из самого шлюза. Я видел, как это делается во многих проектах производственного уровня.

Например, для службы заказа документация будет по адресу:

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

Можно использовать аналогичный подход. для других микросервисов.

...