760 Star 6.6K Fork 1.4K

GVP萧明 / knife4j

 / 详情

如何将多个微服务的api整合到一个地址里面?

已完成
创建于  
2018-08-07 16:02

一般微服务中会牵扯到多个服务如:

1.用户服务
2.认证服务
3...

那么这在生成swagge api的时候就会多个地址.导致app那边很分散,有没有一种很好的手段将多个聚合到一个地址里面?

评论 (20)

吕兵阳 创建了任务
吕兵阳 更新了任务

我觉得可以这样做

这个纯粹依靠前端肯定不行了,需要写一个后台辅助的jar,或者SpringBoot的starter组件也行

这个starter提供对外的各个微服务的接口组合,开发者可以通过配置文件配置好各个服务的请求ip和port

因为各个微服务的swagger提供的api接口都是统一的,一个分组接口swagger-resource,一个详情接口,/v2/api-docs

此时,starter组件提供一个controller,根据配置的各个微服务ip和port,请求生成swagger响应的json

此时,提供一个统一的界面,将该接口的参数,通过swagger分组的方式,分别展示所有微服务的分组接口,开发者就可以根据分组选择,展示文档接口了

不管开发者访问那个微服务的文档界面,该微服务只要通过该Starter组件注册了相关微服务模块的ip以及端口,最终看到的都是整个系统所有的接口信息,然后根据分组,选择不同的微服务文档

这样应该是可行的.

这个SpringBoot的starter组件最终也会和springfox-swagger组件一样,提供两个接口

1.分组接口(/swagger-paths)

该接口将starter配置的所有微服务集合汇集在一起,请求各个微服务的swagger-resources接口,组合起来,最终响应出去json,比如下面:

[
    {
        "name": "用户服务",
        "host":"192.168.0.100",
        "port":8080
        "url": "/swagger-info",
        "groupname":"用户服务分组1"
    },
    {
        "name": "用户服务",
        "host":"192.168.0.100",
        "port":8080
        "url": "/swagger-info",
        "groupname":"用户服务分组2"
    },
    {
        "name": "认证服务",
        "host":"192.168.0.101",
        "port":8080
        "url": "/swagger-info",
        "groupname":"认证服务分组1"
    },
    {
        "name": "认证服务",
        "host":"192.168.0.101",
        "port":8080
        "url": "/swagger-info",
        "groupname":"认证服务分组2"
    }
]

2.详情接口(/swagger-info)

根据上面响应的分组信息,请求后加载当前微服务针对的真实swagger接口/v2/api-docs,生成文档

有没有现成的sample可以参考的

@吕兵阳 这个目前估计网上都没有吧……上面说的是我的实现思路,我可以帮你实现一下,不过可能没这么快,预计下周吧

你的多个微服务都是基于SpringBoot的 吗

在spring-cloud-gateway中整合各个服务时,文档虽然能显示,但是basePath一直显示不对,没有带上相应的服务名字,我是参考这个示例来改造的

@Kimmyzhao SpringCloud的basePath这个bug已经解决了,还没发布新版本,源码pull下来 install后可以使用的

@萧明 我的是sc的。我看能不能结合zuul来实现。

@吕兵阳 zuul通过分组应该是可以实现的

@萧明 我看了网上的方案,大都是采用的zuul实现的。将多个服务的resource同时返回。但是他们的api都是有个前缀 而我们的没有。我们每个服务都是如下的:

http://localhost:8767/v2/api-docs
http://localhost:8763/v2/api-docs

上面的分别代表两个微服务像这种的如何实现?

@吕兵阳 上面这个朋友发的你可以参考下

@吕兵阳 @萧明
《Spring Cloud Zuul中使用Swagger汇总API接口文档》,这个就是按照上面的思路在zuul中做的实现,但是用的原生swagger-ui,可以借鉴一下。

@yupaits @吕兵阳 这个其实和ui没关系的,通过zuul来弄也是通过分组来实现,只要后台有分组接口,swagger-bootstrap-ui也是能生成出来文档的

@yupaits 估计你都没有细看我发的为什么。你的是因为你的controller都有统一的前缀 但是我们的项目的所有controller是没有前缀的。所以你这个方法是不可行的。

@吕兵阳 如果是这样的话我觉得可以单独做一个SpringBoot的小组件,部署 在公司内外,开发者只需要根据多个微服务(ip:port)来组合项目就可以了,最终多个微服务组成一个项目,这个项目在这个服务里面有一个独立的地址,开放出去

每个微服务也不用集成ui的jar包了,这个小组件里面可以建自己的项目,随意组装不同服务的接口url,生成出来文档

感谢兄弟们,最终还是用zuul搞好了。
输入图片说明

吕兵阳 修改任务状态为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(4)
118100 xiaoym 1578918321 400709 kimmy8023 1578922738 922165 yupaits 1627204629
Java
1
https://gitee.com/xiaoym/knife4j.git
git@gitee.com:xiaoym/knife4j.git
xiaoym
knife4j
knife4j

搜索帮助