Как я могу объединить чванство микросервисов в единое чванство

Я пытаюсь создать единый чванство в моем проекте микросервисов, объединяя все чванства сервисов в один в шлюзе Api. Для этого я следую следующему руководству https://objectpartners.com/2017/09/28/aggregate-services-into-a-single-swagger

Проблема здесь в том, что когда я пытаюсь установить абсолютные URL-адреса, я получаю результат Не удалось загрузить определение API. undefined http://localhost:8070/apihttp://localhost:8081/api/v2/api-docs, где localhost: 8070 / api - это базовый URL-адрес шлюза api, а localhost: 8081 / api / v2 / api-docs - это URL-адрес документации микросервиса.

Вот мой код:

Конфигурация Swagger

package com.rfd.apigateway.swagger;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Configuration
@ConfigurationProperties(prefix = "swagger")
public class SwaggerConfiguration {

    private List<Resource> resources;

    public List<Resource> getResources() {
        return resources;
    }

    public void setResources(List<Resource> resources) {
        this.resources = resources;
    }
}

Ресурс

package com.rfd.apigateway.swagger;

public class Resource {
    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;
    }
}

DocumentationController

package com.rfd.apigateway.swagger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;

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

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

    private SwaggerConfiguration swaggerConfiguration;

    @Autowired
    public DocumentationController(SwaggerConfiguration swaggerConfiguration){
        this.swaggerConfiguration = swaggerConfiguration;
    }

    @Override
    public List get() {
        List resources = new ArrayList<>();
        for(Resource resource : this.swaggerConfiguration.getResources()){
            resources.add(createSwaggerResource(resource));
        }

        return resources;
    }

    private SwaggerResource createSwaggerResource(Resource resource) {
        SwaggerResource swaggerResource = new SwaggerResource();
        swaggerResource.setName(resource.getName());
        swaggerResource.setUrl(resource.getUrl());
        swaggerResource.setSwaggerVersion(resource.getVersion());
        return swaggerResource;
    }
}

Наконец, application.yml

swagger:
  resources:
    - name: transactions
      url: http://localhost:8081/api/v2/api-docs
      version: 1.0
    - name: payments
      url: http://localhost:8083/api/v2/api-docs
      version: 1.0

И пара изображений, которые помогут разобраться в проблеме:

URL-адрес Swagger шлюза Api  URL-адрес swagger шлюза API

URL-адрес api-документации микросервиса  URL-адрес api-docs микросервисов


person DarthRoman    schedule 06.02.2018    source источник
comment
вы должны указать URL-адрес документов. что это /api?   -  person pvpkiran    schedule 07.02.2018
comment
URL-адреса, которые я устанавливаю в файле yml, являются URL-адресами микросервисов swagger. У меня есть контроллер, который перенаправляет вызовы на /swagger-ui.html при запросе базового URL (в данном случае / api является префиксом для всех вызовов), поэтому в основном, когда вы обращаетесь к localhost: 808x / api, вы получаете доступ к чванство микросервиса.   -  person DarthRoman    schedule 07.02.2018
comment
Ладно. давай сделаем шаг назад. Служба, которая работает здесь, localhost: 8070 / api. Как получить доступ к пользовательскому интерфейсу этой службы?   -  person pvpkiran    schedule 07.02.2018
comment
Я отредактировал свой вопрос благодаря вашему комментарию, я не указывал на путь api-docs, но проблема все еще сохраняется. localhost: 8070 / api - это шлюз api с префиксом api, и у меня есть контроллер, который перенаправляет из / api в /api/swagger-ui.html, поэтому, обращаясь к localhost: 8070 / api, я получаю экран swagger с ошибкой сообщение.   -  person DarthRoman    schedule 07.02.2018
comment
Точнее, я собирался сказать, что вы не указываете свой URL-адрес на api-docs. Хорошо, что ты разобрался. какое сообщение об ошибке вы получаете   -  person pvpkiran    schedule 07.02.2018
comment
Я обновил вопрос, добавив несколько изображений, которые могут помочь понять проблему. Спасибо pvpkiran   -  person DarthRoman    schedule 07.02.2018
comment
Позвольте нам продолжить это обсуждение в чате.   -  person DarthRoman    schedule 07.02.2018
comment
Собственно, это было исправлено в версии 2.9.0 github.com/springfox/springfox/issues/2372   -  person Maks    schedule 31.10.2019


Ответы (2)


Проблема здесь была только в версии springfox ... Я попытался понизить ее с 2.8.0 до 2.7.0, и это сработало как шарм. Кажется, это признанная ошибка, как вы можете видеть здесь: https://github.com/springfox/springfox/issues/2235

Мне также пришлось включить cors в микросервисах, но это еще одна проблема.

person DarthRoman    schedule 07.02.2018
comment
Фактически, это было исправлено в версии 2.9.0 github.com/springfox/springfox/issues/2372 < / а> - person Maks; 30.10.2019

Мне удалось решить эту проблему, используя: https://github.com/varghgeorge/microservices-single-swagger

Этот простой микросервис sprintboot может отображать всю вашу документацию по swagger в одном месте. На основе конфигурации YAML он отобразит список служб и предоставит единый сервер документации для всех служб. В конфигурации YAML вы можете добавлять разные URL-адреса swagger.

person George    schedule 02.12.2020