безупречная консолидация для нескольких микросервисов

У меня есть несколько микросервисов, для которых уже реализовано чванство. Я хотел бы объединить все api в едином пользовательском интерфейсе. Для этого я перешел по следующей ссылке. но попробовал это в подходе maven в STS. Пример Swagger Consilidation Github

Вот мои разные файлы в проекте,

@SpringBootApplication
@ComponentScan
@EnableAutoConfiguration
@EnableSwagger2
public class SgtestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SgtestApplication.class, args);
    }

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select() 
                  .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot")))
                  .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.cloud")))
                  .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.security")))
                     .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Single swagger")
                .description("API to retrieve swagger apis")
                .version("1.0.0")
                .build();
    }
}

Мой поставщик ресурсов следующий:

@Component
@Primary
@EnableAutoConfiguration
public class GatewaySwaggerResourceProvider implements SwaggerResourcesProvider {

    @Autowired
    private SwaggerServicesConfig swaggerServiceList;

    public GatewaySwaggerResourceProvider() {
    }

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

        List<SwaggerServices> servList=swaggerServiceList.getServiceList();
        for (SwaggerServices swaggerServices : servList) {
            resources.add(swaggerResource(swaggerServices.getName(), swaggerServices.getUrl(),swaggerServices.getVersion()));
        }
        /*swaggerServiceList.getServiceList().forEach(service -> {
            resources.add(swaggerResource(service.getName(), service.getUrl(), service.getVersion()));
        });*/
        return resources;
    }

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

и, наконец, конфигурация моей службы,

@Component
@EnableAutoConfiguration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "documentation.swagger")
public class SwaggerServicesConfig {

    List<SwaggerServices> swagger;

    public List<SwaggerServices> getServiceList() {
        return swagger;
    }

    public void setServiceList(List<SwaggerServices> swaggerResources) {
        this.swagger = swaggerResources;
    }

    @EnableConfigurationProperties
    @ConfigurationProperties(prefix = "documentation.swagger.services")
    public static class SwaggerServices {
        private String name;
        private String url;
        private String version;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }

        public String getVersion() {
            return version;
        }

        public void setVersion(String version) {
            this.version = version;
        }

        @Override
        public String toString() {
            return "SwaggerServices [name=" + name + ", url=" + url + ", version=" + version + "]";
        }

    }

}

в моем application.yml я указываю конечную точку api docs для различных микросервисов.

spring:
  profiles: default

server:
  port: 8014


documentation:
  swagger:
    service-list:
    - name: local-swagger
      url: http://localhost:8085/v2/api-docs
      version: 1.0

и мой вывод выглядит следующим образом:  output

может ли кто-нибудь помочь мне в том, что я делаю здесь не так? Я могу получить swager ui, но в нем не отображается какой-либо список api. Я новичок в чванстве, поэтому, пожалуйста, просмотрите мою программу.


person mike    schedule 19.06.2017    source источник
comment
Что вы получите, когда перейдете к http://localhost:8014/swagger-resources?   -  person Dilip Krishnan    schedule 20.06.2017
comment
Я не вижу результат, потому что ссылка на изображение не работает, но вы нашли решение? Потому что я пробовал то же самое, с каждым микросервисом на возможном другом хосте и порту, и мой результат: Не удалось загрузить определение API. undefined http://localhost:8070/apihttp://localhost:8081/api   -  person DarthRoman    schedule 06.02.2018
comment
Да, я нашел решение. Но все службы должны быть на одном хосте и на разных портах.   -  person mike    schedule 12.02.2018
comment
Привет, Майк, не могли бы вы поделиться своим подходом?   -  person Akash Chandwani    schedule 15.03.2019


Ответы (2)


Я думаю, что это ОШИБКА CORS. Укажите заголовок CORS origin для всех ваших служб документации Swagger.

Для лучшего подхода: вместо явного указания URL-адреса микросервисов. Зарегистрируйте все сервисы в Service register и получите от него все данные вашего экземпляра. Это лучший подход для централизованного чванства.

Для справки: Централизованная документация Swagger

person GnanaJeyam    schedule 15.04.2019

попробуйте это: https://dev.to/eon/how-to-consolidate-api-documentation-in-a-spring-boot-microservices-environment-dgd Я пытался решить эту проблему раньше, и в итоге получил это инструмент с открытым исходным кодом.

person HellishHeat    schedule 13.04.2020