前后端分离应用,后端提供接口供 web mobile 使用,这些接口又分为两大类,一部分由应用本身使用,另外一部分可能供第三方调用。
目前看到很多对外提供接口的都是通过 api.example.com 这种二级域名的方式。
所以想问下需要把对第三方提供的 api 接口剥离出来,建立一个应用,专门映射到 api.example.com 吗?然后在这个应用内部在转发到接口的具体实现?
另外,还有几个问题想确认:
1 API 应用的版本怎么处理?比如 api.example.com/user/v1.... ,是不同版本转发到不同实现,还是在具体的 API 实现里面进行区分?
2 API 的流量控制、授权感觉集中做比较好,但是一些涉及到粒度比较细的权限控制必须有具体的 API 实现来控制,怎么办?
我们目前的应用是一个大的应用,基于 spring boot,还有部分基于 node 的,主流怎么应对这种需求?
1
lhx2008 2019-01-02 21:16:03 +08:00 via Android
可以参考 rest 的设计方法,
一般版本号就 api.example.com/v1/user 公开接口的要提前想好,只加不改,要么就全改。自己的接口就可以随便点。 如果是 spring 栈的话就接过去 zuul 或者别的 spring cloud 网关来搞,包括鉴权和流控 spring 和 node 服务也是统一走网关 |
2
ibegyourpardon 2019-01-02 21:17:16 +08:00
我们现在的 api 也还是直接 laravel 走起。
但已经在前面的 nginx 层开始做一些处理了,今后会把 nginx 作为 api.example.com 的直接输出,后端再具体分发到不同的后端服务去。 版本的话处理方法很多的,但我还是倾向于把版本处理交给更后层处理而不是集中在前面。 因为我的理解中,除了授权等控制行为外,API 网关还有个重要的事是第一层路由。 我个人目前工作中是试图把 API 网关作为纯路由,至于那种控制和集中处理的事应该由另外一个配置中心来处理,对 API 网关进行操作。 |
3
yidinghe 2019-01-02 21:22:04 +08:00 via Android
1、版本可以考虑独立部署(每个版本独立部署一套)、代理分流( Nginx 根据版本号转发到各自的服务)。
2、授权方面建议参考 OAuth 的概念。 不管服务是 Java 还是 nodejs 实现的,神圣的 HTTP 连接着我们每一个服务。 |
4
wangxiaoaer OP @ibegyourpardon #2 就是说具体的 api 实现还是在原本应用,api.example.com 只是通过 nginx 把一些 api 抽取出来,暴露到外面吗?这样的话,怎么对这些 api 做控制、限流等?
|
5
wangxiaoaer OP @yidinghe #3 我也觉得一个版本一个服务应该是很清晰的。
|
6
ibegyourpardon 2019-01-02 21:29:52 +08:00
|
7
sipbw 2019-01-02 21:33:37 +08:00
请教一下,刚创建的主题怎么在问与答的列表中找不到。
楼主不好意思,借贴问一下。。 |
8
wangxiaoaer OP @ibegyourpardon #6 lua 是基于 nginx 的一种方案,看来我的理解也差不多,就是路由层也是需要有逻辑的。
我们目前还在考虑慢慢把服务容器化,可以部署多个实例,并且是动态的,这就涉及到服务发现,感觉还是有点繁琐。 zuul 没用过,不知道对非 spring 的应用支不支持,而且也感觉 jvm 太重,想找个轻量点的实现。 |
9
lincanbin 2019-01-02 21:33:48 +08:00
专门做一个 API 网关应用。
另外我个人不喜欢 restful,做监控的时候要对 restful 的 api 的 path 专门做一次合并,麻烦。 |
10
wangxiaoaer OP @lincanbin #9 我也倾向于专门做,看 8 楼回复,但是实现方案呢?涉及到服务转发,负载均衡调度算法、服务监控、流量统计等。
|
11
whileFalse 2019-01-02 21:38:52 +08:00
一套也可以。一套就是官方客户端和第三方授权之后拿到的权限列表不同。
|
12
ibegyourpardon 2019-01-02 21:39:44 +08:00
|
13
wangxiaoaer OP @ibegyourpardon #12 哈哈,关键是 lua 我们一点都不熟悉。
|
14
ibegyourpardon 2019-01-02 22:38:23 +08:00
@wangxiaoaer 同不熟悉,毫无基础。
但我想明白了这么两件事。(至少我自以为想明白了) 1 不管你怎么个 API 网关,用什么语言写,用什么控制,对我这样的小公司,在最前端这件事上,找不到任何比 Nginx 还要靠谱和适合我的工具了。 对,我是可以直接拿应用顶上去,要什么 Nginx,反正我们流量也不大……但我不敢,也不想。 2 Lua 我一点都不熟悉,但分析之后觉得我在这个层面上,并不需要让 Nginx 负责太多的逻辑,对我而言我更需要的是 Lua 给我实现接口,我可以由其他工具把我要的 Nginx 配置规则给塞过去并加载。我觉得从这个层面而言,并不需要我有太强的 Lua 方面的知识储备…… 就……艺不高人也胆大吧…… |
15
ooh 2019-01-03 00:06:19 +08:00 1
|
16
wangxiaoaer OP @ooh #15 试了试,docker 安装了好几次跑不起来,作罢。
|
17
ooh 2019-01-03 11:29:16 +08:00
@wangxiaoaer
https://gist.github.com/40robber/71965e9e4146c523d71c0b4aaa30c3ca 这个可以,最新的 1.0 测试版本好像有些变化,kong-dashboard 好像还没支持 |
18
wangxiaoaer OP @ooh #17 多谢,我试一试
|