多个微服务的摇摆整合

时间:2017-06-19 17:28:52

标签: java spring spring-boot swagger springfox

我有多个微服务,已经实现了swagger。我想把所有api都放在单一的招摇UI下。我已经按照以下链接执行此操作。但是在STS的maven方法中尝试过它。 Swagger Consilidation Github example

以下是我在项目中的不同文件,

GIF

我的资源提供者如下,

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

在我的application.yml中我指定了不同微服务的api docs端点。

@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 + "]";
        }

    }

}

我的输出如下,output

有人可以帮助我解决我在这里做错了什么吗?我能够获得swi ui,但它并没有显示任何api的列表。我是新手,所以请好好检查一下我的计划。

2 个答案:

答案 0 :(得分:0)

我认为有一个CORS错误。请为所有Swagger文档服务指定CORS原始标头。

获得更好的方法: 而不是显式指定微服务URL。将所有服务注册到服务注册,并从中获取所有实例详细信息。这是集中摆幅的更好方法。

供参考:https://github.com/GnanaJeyam/microservice-patterns/tree/master/centralized-swagger-docs

答案 1 :(得分:0)

尝试一下:https://dev.to/eon/how-to-consolidate-api-documentation-in-a-spring-boot-microservices-environment-dgd,我想尽早解决这个问题,最终生产了这个开源工具。