springcloud zuul 彙總swagger文件
系統是用zuul作為分散式系統的閘道器,同時使用swagger生成文件,把整個系統的文件整合在同一個頁面上。
專案結構
eureka-server:eureka服務註冊中心,埠8080,
zuul-server:zuul閘道器,埠8081
payment-server:支付系統,埠8082
order-server:訂單系統,埠8083
order-server1:訂單系統,埠8084
order-server2:訂單系統,埠8085
其中order-server、order-server1、order-server2組成訂單系統叢集。
下面是執行後的效果圖:
開啟zuul的swagger首頁http://localhost:8081/swagger-ui.html
實現方法
zuul-server
路由配置
zuul:
routes:
payment-server:
path: /pay/**
order-server:
path: /order/**
swagger配置類SwaggerConfig
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("分散式購物系統")
.description("購物系統介面文件說明")
.termsOfServiceUrl("http://localhost:8081")
.contact(new Contact("vker", "", " [email protected]"))
.version("1.0")
.build();
}
@Bean
UiConfiguration uiConfig() {
return new UiConfiguration(null, "list", "alpha", "schema",
UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS, false, true, 60000L);
}
}
重點:swagger文件資源配置類DocumentationConfig
@Component
@Primary
public class DocumentationConfig implements SwaggerResourcesProvider {
@Override
public List<SwaggerResource> get() {
List resources = new ArrayList<>();
resources.add(swaggerResource("訂單系統", "/order/v2/api-docs", "2.0"));
resources.add(swaggerResource("支付系統", "/pay/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;
}
}
可以看出來實現的重點就在DocumentationConfig
中,通過配置文件資源,當在首頁下拉框選擇訂單系統時,會請求http://localhost:8081/order/v2/api-docs獲取文件詳情,而根據zuul的路由配置,zuul會將/order/**請求路由到serviceId為order-server
的系統上。而且由於order-server是一個叢集,就算其中一臺服務掛掉,也不會影響到文件的獲取。
order-server
swagger配置類SwaggerConfig
,order-server
、payment-server
swagger配置基本相同
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("w.m.vker.demo"))
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("訂單系統api")
.description("訂單系統介面文件說明")
.contact(new Contact("vker", "", "[email protected]"))
.version("1.0")
.build();
}
@Bean
UiConfiguration uiConfig() {
return new UiConfiguration(null, "list", "alpha", "schema",
UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS, false, true, 60000L);
}
}
swagger整合xrebel
xrebel是一款web除錯工具,可以參考教程XRebel使用教程。
xrebel的工作原理是追蹤頁面的各種請求分析整個請求的流程和消耗時間,而swagger則提供了頁面線上介面除錯功能,將兩則結合起來,可以快速除錯介面的同時分析介面的流程和缺陷,可謂是如虎添翼。
如圖:
點選swagger的try it out時 左下角的xrebel工具欄會記錄發起的請求詳情。
當我多次呼叫訂單系統介面的時候,xrebel甚至可以顯示zuul將這個請求通過負載均衡分發到哪一個服務上,如圖:
實現方法
將xrebel整合到zuul-server啟動的vm options引數中,在zuul其中成功後,開啟http://localhost:8081/xrebel頁面,想頁面正下方中央的文字框內的js程式碼
<script>
window.XREBEL_SERVERS = ['http://localhost:8081'];
(function() {
const script = document.createElement('script');
script.src = window.XREBEL_SERVERS[0] + '/a65f4bf22bdd793dca6963ffe7fa0c62/resources/init.min.js';
document.body.appendChild(script);
}());
</script>
複製出來。然後找到springfox-swagger-ui依賴的jar包,如果使用maven管理,則jar包的位置在maven倉庫路徑\io\springfox\springfox-swagger-ui\版本號
的資料夾下,將jar包用解壓後找到swagger-ui.html檔案,將之前的複製的js檔案貼上到裡面,然後執行zuul-server,就可以在swagger首頁http://localhost:8081/swagger-ui.html看到左下角出現這個可愛的工具欄啦。
最後附上程式碼地址:https://github.com/91wangmeng/spring-boot-swagger-distributed-demo.git