用zuul將微服務的多個swagger api文件聚合成一個文件
阿新 • • 發佈:2019-04-23
1.在每個服務的pom中新增以下依賴
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
注意:僅僅需要新增這個就行。zuul負責ui
2.新建zuul工程,將這個放到你的config啟動,注意這裡我用了一個佔位符獲取當前文件的名稱,避免寫死後續可能新增其他模組
@ConditionalOnClass(value = {Swagger.class}) @Configuration @EnableSwagger2 public class SwaggerConfig { @Value("${spring.application.name}") private String applicationName; @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.miaoyouche")) .paths(PathSelectors.any()) .build() .globalOperationParameters(parameters()); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title(applicationName+"介面文件") .description(applicationName+"介面文件") .contact(new Contact("miaoyouche", "http://www.miaoyouche.com", "[email protected]")) .version("1.0") .build(); } private List<Parameter> parameters() { ParameterBuilder parameterBuilder = new ParameterBuilder(); List<Parameter> parameters = new ArrayList<>(); parameterBuilder.name("Authorization") .description("Authorization") .modelRef(new ModelRef("string")) .parameterType("header") .required(false).build(); parameters.add(parameterBuilder.build()); return parameters; } }
接著是zuul的配置
3.在zuul的config中新增如下配置,注意這裡有個apiNames是所有的分組服務名,避免寫死,直接從配置檔案讀取
@Component @Primary public class DocumentationConfig implements SwaggerResourcesProvider { @Value("${rest.api.names}") private String[] apiNames; @Override public List<SwaggerResource> get() { List resources = new ArrayList<>(); if (apiNames != null) { Arrays.stream(apiNames).forEach(s -> resources.add(swaggerResource(s, "/openapi/" + s + "/v2/api-docs", "2.0")) ); } 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; } }
4.zuul的pom檔案中新增以下依賴:
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> </dependency>
5.zuul的代理配置:
zuul:
routes:
myc-user:
path: /openapi/myc-user/**
serviceId: myc-user
myc-car:
path: /openapi/myc-car/**
serviceId: myc-car
myc-auth:
path: /openapi/myc-auth/**
serviceId: myc-auth
myc-order:
path: /openapi/myc-order/**
serviceId: myc-order
stripPrefix: true
報錯解決:
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.NoSuchMethodError: com.google.common.collect.FluentIterable.concat(Ljava/lang/Iterable;Ljava/lang/Iterable;)Lcom/google/common/collect/FluentIterable;
這個問題解決辦法是因為swagger依賴google的guava,而你當前專案的guava版本與之不匹配,而我因為使用當前最新的swagger2版本,我就將guava升到最新的版本
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>25.1-jre</version>
</dependency>