如何Spring Cloud Zuul作為網(wǎng)關(guān)的分布式系統(tǒng)中整合Swagger文檔在同一個(gè)頁面上

本文不涉及技術(shù)牲迫,只是單純的一個(gè)小技巧豌汇。
閱讀本文前,你需要對(duì)spring-cloud-zuul充岛、spring-cloud-eureka保檐、以及swagger的配置和使用有所了解。

如果你的系統(tǒng)也是用zuul作為分布式系統(tǒng)的網(wǎng)關(guān)崔梗,同時(shí)使用swagger生成文檔夜只,想把整個(gè)系統(tǒng)的文檔整合在同一個(gè)頁面上,可以參考本文炒俱。

項(xiàng)目結(jié)構(gòu)

eureka-server:eureka服務(wù)注冊中心盐肃,端口8080,
zuul-server:zuul網(wǎng)關(guān),端口8081
payment-server:支付系統(tǒng)权悟,端口8082
order-server:訂單系統(tǒng)砸王,端口8083
order-server1:訂單系統(tǒng),端口8084
order-server2:訂單系統(tǒng)峦阁,端口8085
其中order-server谦铃、order-server1、order-server2組成訂單系統(tǒng)集群榔昔。

項(xiàng)目結(jié)構(gòu)

下面是運(yùn)行后的效果圖:
打開zuul的swagger首頁http://localhost:8081/swagger-ui.html
效果圖

實(shí)現(xiàn)方法

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("分布式購物系統(tǒng)")
                .description("購物系統(tǒng)接口文檔說明")
                .termsOfServiceUrl("http://localhost:8081")
                .contact(new Contact("vker", "", "6492178@gmail.com"))
                .version("1.0")
                .build();
    }

    @Bean
    UiConfiguration uiConfig() {
        return new UiConfiguration(null, "list", "alpha", "schema",
                UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS, false, true, 60000L);
    }
}

重點(diǎn):swagger文檔資源配置類DocumentationConfig

@Component
@Primary
public class DocumentationConfig implements SwaggerResourcesProvider {
    @Override
    public List<SwaggerResource> get() {
        List resources = new ArrayList<>();
        resources.add(swaggerResource("訂單系統(tǒng)", "/order/v2/api-docs", "2.0"));
        resources.add(swaggerResource("支付系統(tǒng)", "/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;
    }
}

可以看出來實(shí)現(xiàn)的重點(diǎn)就在DocumentationConfig中驹闰,通過配置文檔資源,當(dāng)在首頁下拉框選擇訂單系統(tǒng)時(shí)撒会,會(huì)請(qǐng)求http://localhost:8081/order/v2/api-docs獲取文檔詳情嘹朗,而根據(jù)zuul的路由配置,zuul會(huì)將/order/**請(qǐng)求路由到serviceId為order-server的系統(tǒng)上诵肛。而且由于order-server是一個(gè)集群屹培,就算其中一臺(tái)服務(wù)掛掉,也不會(huì)影響到文檔的獲取。

order-server

swagger配置類SwaggerConfig,order-server褪秀、payment-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("訂單系統(tǒng)api")
                .description("訂單系統(tǒng)接口文檔說明")
                .contact(new Contact("vker", "", "6492178@gmail.com"))
                .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調(diào)試工具,可以參考教程XRebel使用教程媒吗。
xrebel的工作原理是追蹤頁面的各種請(qǐng)求分析整個(gè)請(qǐng)求的流程和消耗時(shí)間仑氛,而swagger則提供了頁面在線接口調(diào)試功能唾戚,將兩則結(jié)合起來按摘,可以快速調(diào)試接口的同時(shí)分析接口的流程和缺陷,可謂是如虎添翼。
如圖:

效果圖

點(diǎn)擊swagger的try it out時(shí) 左下角的xrebel工具欄會(huì)記錄發(fā)起的請(qǐng)求詳情仪芒。
當(dāng)我多次調(diào)用訂單系統(tǒng)接口的時(shí)候自阱,xrebel甚至可以顯示zuul將這個(gè)請(qǐng)求通過負(fù)載均衡分發(fā)到哪一個(gè)服務(wù)上嚎莉,如圖:
這里寫圖片描述

實(shí)現(xiàn)方法

將xrebel集成到zuul-server啟動(dòng)的vm options參數(shù)中,在zuul其中成功后,打開http://localhost:8081/xrebel頁面沛豌,想頁面正下方中央的文本框內(nèi)的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>

復(fù)制出來。然后找到springfox-swagger-ui依賴的jar包赃额,如果使用maven管理加派,則jar包的位置在maven倉庫路徑\io\springfox\springfox-swagger-ui\版本號(hào) 的文件夾下,將jar包用解壓后找到swagger-ui.html文件跳芳,將之前的復(fù)制的js文件粘貼到里面芍锦,然后運(yùn)行zuul-server,就可以在swagger首頁http://localhost:8081/swagger-ui.html看到左下角出現(xiàn)這個(gè)可愛的工具欄啦飞盆。

這里寫圖片描述

最后附上代碼地址:https://github.com/91wangmeng/spring-boot-swagger-distributed-demo.git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娄琉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吓歇,更是在濱河造成了極大的恐慌孽水,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件城看,死亡現(xiàn)場離奇詭異女气,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)测柠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門炼鞠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轰胁,你說我怎么就攤上這事谒主。” “怎么了赃阀?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵霎肯,是天一觀的道長。 經(jīng)常有香客問我,道長姿现,這世上最難降的妖魔是什么肠仪? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮备典,結(jié)果婚禮上异旧,老公的妹妹穿的比我還像新娘。我一直安慰自己提佣,他們只是感情好吮蛹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拌屏,像睡著了一般潮针。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倚喂,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天每篷,我揣著相機(jī)與錄音,去河邊找鬼端圈。 笑死焦读,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舱权。 我是一名探鬼主播矗晃,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宴倍!你這毒婦竟也來了张症?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤鸵贬,失蹤者是張志新(化名)和其女友劉穎俗他,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恭理,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拯辙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颜价。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涯保。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖周伦,靈堂內(nèi)的尸體忽然破棺而出夕春,到底是詐尸還是另有隱情,我是刑警寧澤专挪,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布及志,位于F島的核電站片排,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏速侈。R本人自食惡果不足惜率寡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倚搬。 院中可真熱鬧冶共,春花似錦、人聲如沸每界。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眨层。三九已至庙楚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趴樱,已是汗流浹背馒闷。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叁征,地道東北人窜司。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像航揉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子金刁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容