1. 程式人生 > >springcloud zuul 彙總swagger文件

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-serverpayment-serverswagger配置基本相同

@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