资讯专栏INFORMATION COLUMN

Zuul中聚合Swagger的坑

icyfire / 773人阅读

摘要:下面来看下具体的整合步骤以及采坑记录。正常情况下上面的整合步骤没任何问题,今天有朋友在星球提问,说自己的业务服务加了,中聚合的文档无法显示,因为路径错了,少了配置的。

每个服务都有自己的接口,通过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 List get() {
        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 List get() {
    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,等你哦!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74391.html

相关文章

  • Spring Cloud Zuul使用Swagger汇总API接口文档

    摘要:代码示例本文示例读者可以通过查看下面仓库的中的三个项目如果您对这些感兴趣,欢迎收藏转发给予支持以下专题教程也许您会有兴趣基础教程基础教程 有很多读者问过这样的一个问题:虽然使用Swagger可以为Spring MVC编写的接口生成了API文档,但是在微服务化之后,这些API文档都离散在各个微服务中,是否有办法将这些接口都整合到一个文档中?之前给大家的回复都只是简单的说了个思路,昨天正好...

    Salamander 评论0 收藏0
  • 两年了,我写了这些干货!

    摘要:开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章系列处理登录请求前后端分离一使用完美处理权限问题前后端分离二使用完美处理权限问题前后端分离三中密码加盐与中异常统一处理 开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章! Spring Boo...

    宋华 评论0 收藏0
  • 两年了,我写了这些干货!

    摘要:开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章系列处理登录请求前后端分离一使用完美处理权限问题前后端分离二使用完美处理权限问题前后端分离三中密码加盐与中异常统一处理 开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章! Spring Boo...

    huayeluoliuhen 评论0 收藏0
  • API数据加密框架monkey-api-encrypt

    摘要:相比之前的变化内置加密算法,可以配置不同的加密不再绑定,通过配置即可使用加解密框架也可以支持支持用户自定义加密算法地址示例代码没有发布到中央仓库,只发布到这个仓库,大家也可以自行下载源码打包传到自己公司的私服上。 之前有写过一篇加密的文章《前后端API交互如何保证数据安全性》。主要是在Spring Boot中如何对接口的数据进行自动加解密操作,通过注解的方式来指定是否需要加解密。 原理...

    BetaRabbit 评论0 收藏0
  • 让ERP的服务更开放! ——用微服务架构搭建的一套基于EBS的API服务系统

    摘要:每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通通常是基于的。在微服务架构下,故障会被隔离在单个服务中。 1. 源码下载地址 源码链接: https://github.com/samt007/xy... 这是用Spring Cloud微服务架构搭建的一套基于EBS的API服务系统如对本文有任何的疑问,请联系我:samt007@qq.com 2. Introduc...

    JouyPub 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<