摘要:下面來看下具體的整合步驟以及采坑記錄。正常情況下上面的整合步驟沒任何問題,今天有朋友在星球提問,說自己的業務服務加了,中聚合的文檔無法顯示,因為路徑錯了,少了配置的。
每個服務都有自己的接口,通過Swagger來管理接口文檔。在服務較多的時候我們希望有一個統一的入口來進行文檔的查看,這個時候可以在zuul中進行文檔的聚合顯示。
下面來看下具體的整合步驟以及采坑記錄。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 Listget() { List resources = new ArrayList<>(); // 排除自身,將其他的服務添加進去 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 獲取服務列表進行聚合,當然你也可以固定寫上你的服務列表,或者對接配置中心都可以。
其實除了DiscoveryClient 獲取服務列表,我們也可以根據zuul中路由的配置來獲取,可以使用RouteLocator 來操作。方式很多,用哪種都可以。
正常情況下上面的整合步驟沒任何問題,今天有朋友在星球提問,說自己的業務服務加了context-path,Zull中聚合的Swagger文檔無法顯示,因為路徑錯了,少了配置的context-path。效果如下圖:
也就是說在進行資源添加的時候需要將context-path加進去,也就是需要改動下面的代碼:
resources.add(swaggerResource(name, "/" + name + "/v2/api-docs", "2.0"));
最簡單的就是加一個配置,配置好每個服務對應的context-path,這樣在這里直接拼接上去就完事了。但這樣顯得有點低端呀,哈哈。
DiscoveryClient 是很強大的,我們可以用DiscoveryClient 來獲取Eureka中的信息,此時我有了一個想法,那就是業務服務將自身的context-path放入Eureka的metadata-map中,然后Zuul中聚合的時候從metadata-map中獲取context-path就行了。
業務服務加配置:
server.servlet.context-path=/yinjihuan eureka.instance.metadata-map.context-path=${server.servlet.context-path}
Zull中改造:
@Override public Listget() { List resources = new ArrayList<>(); // 排除自身,將其他的服務添加進去 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導致的問題,加入星球我們一起學習吧。
歡迎加入我的知識星球,一起交流技術,免費學習猿天地的課程(http://cxytiandi.com/course) PS:目前星球中正在星主的帶領下組隊學習Spring Cloud,等你哦!文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74391.html
摘要:代碼示例本文示例讀者可以通過查看下面倉庫的中的三個項目如果您對這些感興趣,歡迎收藏轉發給予支持以下專題教程也許您會有興趣基礎教程基礎教程 有很多讀者問過這樣的一個問題:雖然使用Swagger可以為Spring MVC編寫的接口生成了API文檔,但是在微服務化之后,這些API文檔都離散在各個微服務中,是否有辦法將這些接口都整合到一個文檔中?之前給大家的回復都只是簡單的說了個思路,昨天正好...
摘要:開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權限問題前后端分離二使用完美處理權限問題前后端分離三中密碼加鹽與中異常統一處理 開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
摘要:相比之前的變化內置加密算法,可以配置不同的加密不再綁定,通過配置即可使用加解密框架也可以支持支持用戶自定義加密算法地址示例代碼沒有發布到中央倉庫,只發布到這個倉庫,大家也可以自行下載源碼打包傳到自己公司的私服上。 之前有寫過一篇加密的文章《前后端API交互如何保證數據安全性》。主要是在Spring Boot中如何對接口的數據進行自動加解密操作,通過注解的方式來指定是否需要加解密。 原理...
摘要:每個服務運行在其獨立的進程中,服務與服務間采用輕量級的通信機制互相溝通通常是基于的。在微服務架構下,故障會被隔離在單個服務中。 1. 源碼下載地址 源碼鏈接: https://github.com/samt007/xy... 這是用Spring Cloud微服務架構搭建的一套基于EBS的API服務系統如對本文有任何的疑問,請聯系我:samt007@qq.com 2. Introduc...
閱讀 1090·2021-09-22 15:19
閱讀 1707·2021-08-23 09:46
閱讀 2231·2021-08-09 13:47
閱讀 1411·2019-08-30 15:55
閱讀 1414·2019-08-30 15:55
閱讀 1978·2019-08-30 15:54
閱讀 2801·2019-08-30 15:53
閱讀 717·2019-08-30 11:03