莫问前程 2020-08-02
1. <!-- Swagger --> 2. <dependency> 3. <groupId>io.springfox</groupId> 4. <artifactId>springfox-swagger-ui</artifactId> 5. <version>2.9.2</version> 6. </dependency> 7. <dependency> 8. <groupId>io.springfox</groupId> 9. <artifactId>springfox-swagger2</artifactId> 10. <version>2.9.2</version> 11. </dependency>
增加聚合代码:
1. @EnableSwagger2 2. @Component 3. @Primary 4. public class DocumentationConfig implements SwaggerResourcesProvider { 5. 6. @Autowired 7. private DiscoveryClient discoveryClient; 8. 9. @Value("${spring.application.name}") 10. private String applicationName; 11. 12. @Override 13. public List<SwaggerResource> get() { 14. List<SwaggerResource> resources = new ArrayList<>(); 15. // 排除自身,将其他的服务添加进去 16. discoveryClient.getServices().stream().filter(s -> !s.equals(applicationName)).forEach(name -> { 17. resources.add(swaggerResource(name, "/" + name + "/v2/api-docs", "2.0")); 18. }); 19. return resources; 20. } 21. 22. private SwaggerResource swaggerResource(String name, String location, String version) { 23. SwaggerResource swaggerResource = new SwaggerResource(); 24. swaggerResource.setName(name); 25. swaggerResource.setLocation(location); 26. swaggerResource.setSwaggerVersion(version); 27. return swaggerResource; 28. } 29. 30. }
我这边直接用DiscoveryClient 获取服务列表进行聚合,当然你也可以固定写上你的服务列表,或者对接配置中心都可以。
其实除了DiscoveryClient 获取服务列表,我们也可以根据Zuul中路由的配置来获取,可以使用RouteLocator 来操作。方式很多,用哪种都可以。
正常情况下上面的整合步骤没任何问题,今天有朋友在星球提问,说自己的业务服务加了context-path,Zuul中聚合的Swagger文档无法显示,因为路径错了,少了配置的context-path。效果如下图:
也就是说在进行资源添加的时候需要将context-path加进去,也就是需要改动下面的代码:
1. 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就行了。
业务服务加配置:
1. server.servlet.context-path=/yinjihuan 2. eureka.instance.metadata-map.context-path=${server.servlet.context-path}
Zuul中改造:
1. @Override 2. public List<SwaggerResource> get() { 3. List<SwaggerResource> resources = new ArrayList<>(); 4. // 排除自身,将其他的服务添加进去 5. discoveryClient.getServices().stream().filter(s -> !s.equals(applicationName)).forEach(name -> { 6. Optional<ServiceInstance> instanceOptional = discoveryClient.getInstances(name).stream().findFirst(); 7. if (instanceOptional.isPresent() && instanceOptional.get().getMetadata().containsKey("context-path")) { 8. String contexPath = instanceOptional.get().getMetadata().get("context-path"); 9. resources.add(swaggerResource(name, "/" + name + contexPath + "/v2/api-docs", "2.0")); 10. } else { 11. resources.add(swaggerResource(name, "/" + name + "/v2/api-docs", "2.0")); 12. } 13. 14. }); 15. return resources; 16. }
这样就完美解决了增加context-path导致的问题,加入星球我们一起学习吧。
星球正在搞活动,详情请查看:优秀程序猿背后的故事
加入星球特权
1、从前端到后端玩转Spring Cloud
2、实战分库分表中间件Sharding-JDBC
3、实战分布式任务调度框架Elastic Job
4、配置中心Apollo实战
5、高并发解决方案之缓存
6、更多课程等你来解锁,20+课程
尹吉欢
我不差钱啊
喜欢作者