内容简介:每个服务都有自己的接口,通过Swagger来管理接口文档。在服务较多的时候我们希望有一个统一的入口来进行文档的查看,这个时候可以在zuul中进行文档的聚合显示。下面来看下具体的整合步骤以及采坑记录。Cloud版本:Finchley.SR2, Boot版本:2.0.6加入Swagger的依赖:
每个服务都有自己的接口,通过Swagger来管理接口文档。在服务较多的时候我们希望有一个统一的入口来进行文档的查看,这个时候可以在zuul中进行文档的聚合显示。
下面来看下具体的整合步骤以及采坑记录。Cloud版本:Finchley.SR2, Boot版本:2.0.6
加入Swagger的依赖:
<!-- Swagger --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency>
增加聚合代码:
@EnableSwagger2 @Component @Primary public class DocumentationConfig implements SwaggerResourcesProvider { @Autowired private DiscoveryClient discoveryClient; @Value("${spring.application.name}") private String applicationName; @Override public List<SwaggerResource> get() { List<SwaggerResource> 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 List<SwaggerResource> get() { List<SwaggerResource> resources = new ArrayList<>(); // 排除自身,将其他的服务添加进去 discoveryClient.getServices().stream().filter(s -> !s.equals(applicationName)).forEach(name -> { Optional<ServiceInstance> 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,等你哦!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 监控聚合器系列之: open-falcon新聚合器polymetric
- elasticsearch学习笔记(七)——快速入门案例实战之电商网站商品管理:嵌套聚合,下钻分析,聚合分析
- mongodb高级聚合查询
- MongoDB聚合(aggregate)
- mongodb 聚合管道
- MongoDB指南---16、聚合
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Pro HTML5 and CSS3 Design Patterns
Michael Bowers / Apress / 2011-11-15 / GBP 35.50
Pro HTML5 and CSS3 Design Patterns is a reference book and a cookbook on how to style web pages using CSS3 and HTML5. It contains 350 ready--to--use patterns (CSS3 and HTML5 code snippets) that you ca......一起来看看 《Pro HTML5 and CSS3 Design Patterns》 这本书的介绍吧!