CNode

请问下node做接口转发的意义在哪里?

问答
Hhyx0217发布于6 年前最后回复6 年前19 回复6142 浏览0 收藏

公司使用的是express做接口转发,我最近自己也用eggjs写了点,发现接口请求的时间比直接请求多了一倍。在性能上没有一点提升,不知道还有什么用呢?为了不暴露服务端接口?如果是安全问题后端应该也有解决方法吧

查看回复

回复 (19)

Z
zhangshichuan#1·6 年前

灵活/高效/解耦

H
hyx0217#2·6 年前
引用 zhangshichuan灵活/高效/解耦

@zhangshichuan 不太理解,前两个没体会到,只是增加了工作量,最后一个如果跟后端约定到restful api风格就可以了吧。 个人理解node如果做中间层,目前最大的作用就是做SSR,做接口转发我觉得完全没必要

Z
zy445566#3·6 年前

这个都是看业务。但也有很多公司就是为了中间件而中间件,学其皮囊弃其灵魂,没软用还加组件

Z
zuohuadong#4·6 年前
引用 hyx0217@zhangshichuan 不太理解,前两个没体会到,只是增加了工作量,最后一个如果跟后端约定到restful api风格就可以了吧。 个人理解node如果做中间层,目前最大的作用就是做SS...

@hyx0217 看场景,尤其是大项目,后端 C++ java 都这么写接口的话会累死。 场景一: X宝,大后端是 java 为主,支持基础业务。 中间一层 node.js ,比如618 ,双11 各种形形色色的活动,后端的基础业务其实不变,这块用 node 快速开发 非常合适。 如果你是用 java 写这些玩意,估计等你写出来双11,双12 都来了,需要灵活快速的脚本语言。 场景二: graphql 生态,可以自己去搜。 场景三: SSR 不多说。

小项目没必要! 小项目没必要

H
hyx0217#5·6 年前
引用 zuohuadong@hyx0217 看场景,尤其是大项目,后端 C++ java 都这么写接口的话会累死。 场景一: X宝,大后端是 java 为主,支持基础业务。 中间一层 node.js ,比如618 ,双...

@zuohuadong 刚刚研究了下graphql,node做接口转发可以使用这个吗?这样如果可以把后端提供的多个接口合并起来,也是个使用中间层的优点

G
Gitforxuyang#6·6 年前

我们这边 bff 做 统一鉴权。 有些复杂的接口在bff做组装、清洗甚至缓存。 有些简单的接口确实有点多此一举的感觉。 看实际情况了。

A
atian25#7·6 年前

发现接口请求的时间比直接请求多了一倍。

大概率是你的写法有问题,是不是同步了。

在性能上没有一点提升,不知道还有什么用呢?

主要在于解耦,通过服务自治来提升协作效率。如果你们后端的发布频率足够快,足够配合你们的任何需求,其实不用中间层也无所谓的。

这一层叫做 聚合层,简单理解为 Java 时代的 MVC 层,只不过现在很多团队会把这一层交给前端,然后前端会更倾向于用 Node 来实现。

H
hyx0217#8·6 年前
引用 Gitforxuyang我们这边 bff 做 统一鉴权。 有些复杂的接口在bff做组装、清洗甚至缓存。 有些简单的接口确实有点多此一举的感觉。 看实际情况了。

@Gitforxuyang 我们公司也是,鉴权都放在node端了,那这样后端那边不就都不用做了?还有那种复杂的接口比如在node组装请求多个接口合并成一个,或者其他的操作,这样是不是大大增加前端请求接口的时间。

H
hyx0217#10·6 年前
引用 atian25发现接口请求的时间比直接请求多了一倍。 大概率是你的写法有问题,是不是同步了。 在性能上没有一点提升,不知道还有什么用呢? 主要在于解耦,通过服务自治来提升协作效率。如果你们后端的发布频率足够...

@atian25 image.png 像这一块,我自己用eggjs写的,合并多个接口的请求,返回组合的数据,这样请求时间就会增加很多,但是前端如果请求多个接口因为是并行的,其实请求时间并不是很慢。只是请求了多个接口。我就很纠结到底该不该用

A
atian25#11·6 年前

你的写法有问题,for 循环里面是串行的。 看下 promise-fun

H
HelTi#12·6 年前

@hyx0217 你这写法不慢才怪呢。。串行执行,总时间是所有请求的时间合,你这必须串行执行?没必要的化用Promise.all,也可以使用async库

H
hyx0217#13·6 年前
引用 atian25你的写法有问题,for 循环里面是串行的。 看下 promise fun

@atian25 大佬是说的是用promise.all()是吗,我这样写是因为promise.all返回数组是根据响应时间来排序的所以用这种写法。请问下大佬要是用eggjs做类似这样的接口转发,请求时间一般来说还是有影响的是吗?毕竟中间加了一层,不过中间层其他的优点,这样的影响是否可以忽略不计了?

H
hyx0217#14·6 年前
引用 HelTi@hyx0217 你这写法不慢才怪呢。。串行执行,总时间是所有请求的时间合,你这必须串行执行?没必要的化用Promise.all,也可以使用async库

@HelTi 我明白,我之前也是promise.all写法,只是返回的顺序不一致,尴尬,我有其他思路了可以就是用promise.all,用映射标识每个请求对应的数据就行了,

G
Gitforxuyang#15·6 年前
引用 hyx0217@Gitforxuyang 我们公司也是,鉴权都放在node端了,那这样后端那边不就都不用做了?还有那种复杂的接口比如在node组装请求多个接口合并成一个,或者其他的操作,这样是不是大大增加前...

@hyx0217 是的。 我们原来就是各个微服务自己做鉴权。不好。 所以统一在bff层做。 至于你说的组合多个接口请求耗时会增加。我只能说在理论上只增加了一层http连接的时间。 在我们实际使用中。这一层消耗的时间不超过10ms。 可以说是可以忽略不计。

A
atian25#16·6 年前
引用 hyx0217@atian25 大佬是说的是用promise.all()是吗,我这样写是因为promise.all返回数组是根据响应时间来排序的所以用这种写法。请问下大佬要是用eggjs做类似这样的接口转发...

@hyx0217 可以看下 https://github.com/sindresorhus/promise-fun 提供了很多 Promise 的上层封装。

你这种场景一般用 p-map 来搞,可以设置并发数。

请求耗时是几乎可以忽略不计的,唯一的风险就是多了一个节点肯定不可避免会多了运维上的保障点

Z
zhangxh1023#17·6 年前
引用 hyx0217@atian25 大佬是说的是用promise.all()是吗,我这样写是因为promise.all返回数组是根据响应时间来排序的所以用这种写法。请问下大佬要是用eggjs做类似这样的接口转发...

@hyx0217

我这样写是因为promise.all返回数组是根据响应时间来排序的所以用这种写法。

Promise.all 的返回值, 不是应该是 根据 传入的 Promise 来排序的吗?

参与回复
登录后即可参与回复。登录