golang 应该如何选择 api 网关呢

342 天前
 RedBeanIce
公司基于 gin 开发了一个系统,目前是单体服务,基本上都是 Http 和前端交互。

由于业务发展,想转入微服务,我们想基于 eureka/Consul 做注册中心,引入一款网关作为负载均衡器。

所以请问一下,应该如何选择 api 网关呢。

(关于 gin 往注册中心注册,我们准备自己写。微服务之间的调用,也是准备自己写。)
当然准备是准备,,这个也说不准,看实际情况,
4602 次点击
所在节点    Go 编程语言
53 条回复
dextercai
342 天前
如果计划接口全用 gRPC 去开发,可以选:gRPC Gateway + Buf
StoneHuLu
342 天前
我之前群里和你说了,用 b 站的奎托斯啊,注册中心直接依赖 k8s 就行了,你们不会微服务不上 k8s 吧?服务注册发现还用自己搞?直接 k8s 用 endpoints 或者 service 、label 做不就得了。
rahuahua
342 天前
如果不上 K8S 这一套,推荐看看 APISIX
oreodream
342 天前
直接开源版本的 kong 网关就行了。
上面的老哥说的挺好的,gRPC Gateway + Buf 推荐,很舒服。但也有一些小坑要踩。可以调研一下
motecshine
342 天前
既然是做调研,问自己三个问题:

1. 服务怎么拆分
2. 拆分后 膨胀的工作量, 和熵增的架构 怎么治理 (服务治理
3. 我真的需要为服务吗
coderxy
342 天前
nginx->api gateway->grpc 服务, api gateway 用 go 自己写。 简单一点就是 nginx->业务服务
XCFOX
342 天前
推荐一下 Nats 这个消息中间件。
Nats 是一款分布式消息平台,内置负载均衡、服务注册、消息队列等功能,很适合用来做微服务间通讯。

https://nats.io/
https://github.com/nats-io/nats.go/blob/main/micro/README.md
zzhaolei
342 天前
五楼说的对。不过我认为排序可以反过来的,最主要一点是项目需要微服务还是简历需要微服务。
zpfhbyx
342 天前
我用过 kong 跟 apisix 最后用的 apisix
lesismal
342 天前
Dcynsd
342 天前
我是用的 阿里云 ALB 做负载均衡器
RedBeanIce
342 天前
楼上回复,均已感谢。

谢谢大家回复。
wkong
342 天前
建议别误入歧途😂
masterclock
342 天前
dapr
RedBeanIce
342 天前
@wkong 玩不了 k8s ,公司没有运维。
lesismal
342 天前
@RedBeanIce #12

OP 撒谎,明明没有感谢我。。。
我一声叹息的意思就是别做没必要的折腾了,自己都说了公司没有运维,这点规模的团队业务量估计也不会太大、性能足够、大不了硬件规格升级下也比负载均衡省事。如果真的业务量暴涨了,关键性能瓶颈基本都在数据库这层,即便扩容多节点的 gin 服务,cdn 回源到几个 nginx 、nginx 里均衡下 gin 服务就足够了,没必要非得叫什么 api 网关。

@dextercai @coderxy
前面有几个人建议引入 grpc 的,千万别信他们,引入一层,则每个接口都需要你把 grpc 那层、gin 这层都实现一道 grpc call 、method 的逻辑,本来 api 直达 gin handler 就可以,非要中间插一杠子、关键中间插这一道完全是多余的。
也建议那几位搞清楚 rpc 适合哪些地方,例如你搞数据中台,或者内部拆分的不同的服务之间的调用,rpc 比 http 性能高而且结构化之类的更规范方便,是可以的,这其中最适合的主要是数据量很大、可能数据层单点或者简单集群无法满足业务需要,或者你们微服务拆分的太多、如果都直连数据层、数据库之类的连接池数量压力就非常大,这时候你搞个几种的数据层服务、中台之类的是合理的,或者不同部门之间也都挺大、业务内容多,那么独立出来服务给其他部门调用。
但 OP 的这个场景是直接面向用户的 to c 的接口,这种在中间加一个 api 转 rpc ,纯纯是给自己加工作量、给公司增加成本浪费资源、并且出问题时候的纵向定位链条增加了、更麻烦,而且配套下来又要引入更多东西比如链路追踪。。。

@XCFOX #7 随便引入消息队列之类的更是离谱。消息队列用于解耦、削峰之类的 ok ,但你得是不要求消息队列消费后再返还结果的服务比较好。否则首先相当于改变了同步模式,因为你需要等待入队后消费方把结果再给你、你才能把结果返还给请求方。这本质上相当于回调,虽然你可以用 chan 之类的、进程内不同模块或者不同服务之间 rpc 之类的实现类似同步代码的封装、但还要处理超时失败之类的一系列配套处理,逻辑流程可比之前麻烦太多了。所以,如果是电商下单这种,例如你先插入了订单、然后 push 到消息队列里作为待处理订单、然后就可以响应用户下单成功了,后续的待处理由商户触发已发货、物流已出发、后续订单签收确认之类的是其他模块从待处理的消费队列里去一步步处理并丢入下一个流程的消息队列或者订单状态改变,本次请求不需要请求方等待消息队列消费后的结果,这是 ok 的,否则就是给自己找罪受

上来就推荐 k8s 同样的更是离谱,除了中大规模团队,上 k8s 新增的管理、软硬、人员成本,比带来的好处可高多了,入不敷出,别张口就来

@motecshine @zzhaolei @wkong 几位人间清醒比较值得赞,既往楼层的其他人(如果我没看错的话)统统不值得感谢、并且是误人子弟! OP 真是有病乱投医!
lesismal
342 天前
#16 `这时候你搞个几种的数据层服务` -> `这时候你搞个集中的数据层服务`
coderxy
342 天前
@lesismal 看你写了很多,我就反驳你一条吧。

我看你写了“则每个接口都需要你把 grpc 那层、gin 这层都实现一道 grpc call 、method 的逻辑”

一般 api gateway 写好了之后,后续增加接口只需要在 web 页面上配置一下 path+method 转发到哪个 service 的哪个 method ,谁还需要一个个接口硬编码去转发?
还有,链路追踪这些跟微服务根本就没有啥必然关系,就算是单体服务,照样可以用链路追踪,它可以帮助你快速发现和排查问题。

还有,给 OP 推荐这个方案是因为 OP 说要搞微服务+api 网关, 业务该不该上微服务是 OP 自己的判断,我只是按照 OP 的需求推荐方案。
就算退一万步说,公司的业务确实单体就够了,但是站在知识储备和个人发展的角度来说,做一点过度设计对自己的职业发展、对公司的后期拓展也不是啥坏事, 而不是一句公司业务不需要就拒绝这些技术方案。
wxw752
342 天前
我们在 kong 和 apisix 中选择了 apisix ,目前快两年了,中间升级过一次,没有问题。
version
342 天前
apisix 和 kong 都可以.支持多语言网关自定义插件..也可以插入 K8S 或者独立部署+普通 docker 服务
all in http 稳妥些..包括内网...现在 ai 加持.http 是未来趋势.
gRPC 负载均衡是个大坑...也不适合业务扩展..除了前几年扯上还能装下逼.明明 1 公里骑个单车或者走路都能到..非要打个车

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1001257

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX