成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Zuul中聚合Swagger的坑

icyfire / 877人閱讀

摘要:下面來(lái)看下具體的整合步驟以及采坑記錄。正常情況下上面的整合步驟沒任何問(wèn)題,今天有朋友在星球提問(wèn),說(shuō)自己的業(yè)務(wù)服務(wù)加了,中聚合的文檔無(wú)法顯示,因?yàn)槁窂藉e(cuò)了,少了配置的。

每個(gè)服務(wù)都有自己的接口,通過(guò)Swagger來(lái)管理接口文檔。在服務(wù)較多的時(shí)候我們希望有一個(gè)統(tǒng)一的入口來(lái)進(jìn)行文檔的查看,這個(gè)時(shí)候可以在zuul中進(jìn)行文檔的聚合顯示。

下面來(lái)看下具體的整合步驟以及采坑記錄。Cloud版本:Finchley.SR2, Boot版本:2.0.6

加入Swagger的依賴:



    io.springfox
    springfox-swagger-ui
    2.9.2


    io.springfox
    springfox-swagger2
    2.9.2

增加聚合代碼:

@EnableSwagger2
@Component
@Primary
public class DocumentationConfig implements SwaggerResourcesProvider {

    @Autowired
    private DiscoveryClient discoveryClient;
    
    @Value("${spring.application.name}")
    private String applicationName;
    
    @Override
    public List get() {
        List resources = new ArrayList<>();
        // 排除自身,將其他的服務(wù)添加進(jìn)去
        discoveryClient.getServices().stream().filter(s -> !s.equals(applicationName)).forEach(name -> {
            resources.add(swaggerResource(name, "/" + name + "/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;
    }

}

我這邊直接用DiscoveryClient 獲取服務(wù)列表進(jìn)行聚合,當(dāng)然你也可以固定寫上你的服務(wù)列表,或者對(duì)接配置中心都可以。

其實(shí)除了DiscoveryClient 獲取服務(wù)列表,我們也可以根據(jù)zuul中路由的配置來(lái)獲取,可以使用RouteLocator 來(lái)操作。方式很多,用哪種都可以。

正常情況下上面的整合步驟沒任何問(wèn)題,今天有朋友在星球提問(wèn),說(shuō)自己的業(yè)務(wù)服務(wù)加了context-path,Zull中聚合的Swagger文檔無(wú)法顯示,因?yàn)槁窂藉e(cuò)了,少了配置的context-path。效果如下圖:

也就是說(shuō)在進(jìn)行資源添加的時(shí)候需要將context-path加進(jìn)去,也就是需要改動(dòng)下面的代碼:

resources.add(swaggerResource(name, "/" + name + "/v2/api-docs", "2.0"));

最簡(jiǎn)單的就是加一個(gè)配置,配置好每個(gè)服務(wù)對(duì)應(yīng)的context-path,這樣在這里直接拼接上去就完事了。但這樣顯得有點(diǎn)低端呀,哈哈。

DiscoveryClient 是很強(qiáng)大的,我們可以用DiscoveryClient 來(lái)獲取Eureka中的信息,此時(shí)我有了一個(gè)想法,那就是業(yè)務(wù)服務(wù)將自身的context-path放入Eureka的metadata-map中,然后Zuul中聚合的時(shí)候從metadata-map中獲取context-path就行了。

業(yè)務(wù)服務(wù)加配置:

server.servlet.context-path=/yinjihuan
eureka.instance.metadata-map.context-path=${server.servlet.context-path}

Zull中改造:

@Override
public List get() {
    List resources = new ArrayList<>();
    // 排除自身,將其他的服務(wù)添加進(jìn)去
    discoveryClient.getServices().stream().filter(s -> !s.equals(applicationName)).forEach(name -> {
        Optional instanceOptional = discoveryClient.getInstances(name).stream().findFirst();
        if (instanceOptional.isPresent() && instanceOptional.get().getMetadata().containsKey("context-path")) {
            String contexPath = instanceOptional.get().getMetadata().get("context-path");
            resources.add(swaggerResource(name, "/" + name + contexPath + "/v2/api-docs", "2.0"));
        } else {
            resources.add(swaggerResource(name, "/" + name + "/v2/api-docs", "2.0"));
        }
            
    });
    return resources;
}

這樣就完美解決了增加context-path導(dǎo)致的問(wèn)題,加入星球我們一起學(xué)習(xí)吧。

歡迎加入我的知識(shí)星球,一起交流技術(shù),免費(fèi)學(xué)習(xí)猿天地的課程(http://cxytiandi.com/course) PS:目前星球中正在星主的帶領(lǐng)下組隊(duì)學(xué)習(xí)Spring Cloud,等你哦!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74391.html

相關(guān)文章

  • Spring Cloud Zuul使用Swagger匯總API接口文檔

    摘要:代碼示例本文示例讀者可以通過(guò)查看下面?zhèn)}庫(kù)的中的三個(gè)項(xiàng)目如果您對(duì)這些感興趣,歡迎收藏轉(zhuǎn)發(fā)給予支持以下專題教程也許您會(huì)有興趣基礎(chǔ)教程基礎(chǔ)教程 有很多讀者問(wèn)過(guò)這樣的一個(gè)問(wèn)題:雖然使用Swagger可以為Spring MVC編寫的接口生成了API文檔,但是在微服務(wù)化之后,這些API文檔都離散在各個(gè)微服務(wù)中,是否有辦法將這些接口都整合到一個(gè)文檔中?之前給大家的回復(fù)都只是簡(jiǎn)單的說(shuō)了個(gè)思路,昨天正好...

    Salamander 評(píng)論0 收藏0
  • 兩年了,我寫了這些干貨!

    摘要:開公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來(lái)越多時(shí),大家搜索起來(lái)就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章系列處理登錄請(qǐng)求前后端分離一使用完美處理權(quán)限問(wèn)題前后端分離二使用完美處理權(quán)限問(wèn)題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來(lái)越多時(shí),大家搜索起來(lái)就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章! Spring Boo...

    huayeluoliuhen 評(píng)論0 收藏0
  • API數(shù)據(jù)加密框架monkey-api-encrypt

    摘要:相比之前的變化內(nèi)置加密算法,可以配置不同的加密不再綁定,通過(guò)配置即可使用加解密框架也可以支持支持用戶自定義加密算法地址示例代碼沒有發(fā)布到中央倉(cāng)庫(kù),只發(fā)布到這個(gè)倉(cāng)庫(kù),大家也可以自行下載源碼打包傳到自己公司的私服上。 之前有寫過(guò)一篇加密的文章《前后端API交互如何保證數(shù)據(jù)安全性》。主要是在Spring Boot中如何對(duì)接口的數(shù)據(jù)進(jìn)行自動(dòng)加解密操作,通過(guò)注解的方式來(lái)指定是否需要加解密。 原理...

    BetaRabbit 評(píng)論0 收藏0
  • 讓ERP的服務(wù)更開放! ——用微服務(wù)架構(gòu)搭建的一套基于EBS的API服務(wù)系統(tǒng)

    摘要:每個(gè)服務(wù)運(yùn)行在其獨(dú)立的進(jìn)程中,服務(wù)與服務(wù)間采用輕量級(jí)的通信機(jī)制互相溝通通常是基于的。在微服務(wù)架構(gòu)下,故障會(huì)被隔離在單個(gè)服務(wù)中。 1. 源碼下載地址 源碼鏈接: https://github.com/samt007/xy... 這是用Spring Cloud微服務(wù)架構(gòu)搭建的一套基于EBS的API服務(wù)系統(tǒng)如對(duì)本文有任何的疑問(wèn),請(qǐng)聯(lián)系我:[email protected] 2. Introduc...

    JouyPub 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<