问题背景:
前端通常会有两种架构,一种是无前后端分离的,前端为后端提供渲染模板,这种方式把前后端开发人员绑定到了一起,很不灵活;另一种是前后端分离,也是目前大多数公司在走的路线,通常会使用 node 提供一个中间层,使用 node 层和服务端进行交互。市面上主要有阿里的 egg.js 和百度的 yog2。我们目前采用 yog2,采用 yog2 后面临了两个问题,这两个问题直到今天被策底解决:
问题一:跨域,前端页面直接访问后端接口时,出现跨域问题;
问题二:404,由于前端 node 服务没有部署后端接口服务,访问接口时会 404;
下文的解决方案针对 yog2.
最初方案:
解决这两个问题,最初的方案是在每个 app 中实现了一个 proxy,这个 proxy 负责把访问后端的接口转发到后端服务上:
axios.get('/ns/proxy/sub/userInfo', { });
这样有以下几个缺点:
1、每个接口的path 需要这样写:/namespace/proxy/path,这样将导致请求后端接口时必须要通过 node 转发,但有些接口并不需要用 node 转发,平白无故浪费了流量,增加了 node 集群的负载,尤其对于千万级别的 pv,能节省一点算一点
2、每个模块中需要实现一层 proxy,而且不能保证每位同学都按照/namespace/proxy/path 这种方式进行接口请求,无疑会引入跨域和404问题;
3、这种方式给研发带来了