Node是一个基于Chrome V8引擎的JS运行环境,使用了事件驱动,非阻塞式I/O模型。
Node基于chrome V8引擎,因此在Node中写JS代码和在浏览器中写JS代码90%都是一样的,几乎没有区别。区别:Node里没有浏览器API,例如window,document等,但多了Node特有的API。
Application代码传递给Chrome V8引擎解析。Chrome V8引擎会调用NodeJS的内置模块(如OS,Process,File System,Net等模块)访问操作系统。
NodeJS是非阻塞IO,阻塞IO和非阻塞IO的区别是:系统接收输入再到输出期间,能不能接收其他输入。LIBUV就是实现非阻塞IO的核心模块,左边NodeJS线程通过非阻塞IO的方式调用右边C++线程。
Node拓展了前端的技能领域,适用场景:
- SEO优化:在对搜索引擎SEO优化需求较高的业务中,特别是内容类页面,适合用Node来做SSR
- 性能优化:适合用Node来做SSR
- BFF层:后台服务较多的业务中,可以用Node来做BFF层,整合这些后台服务。BFF层使用后端的RPC通信,并为前端提供HTTP服务
上述内容后端Java工程师也能做,但因为和页面展现相关所以前端做起来更得心应手。前端用Node做还有个优势是同构应用开发起来比较简单,因为Node是基于chrome V8引擎能在服务端运行JS,所以模板组件既能在浏览器渲染,也能在Node渲染。
用Node结合KOA等框架做个后台服务,甚至搭配前端React框架做个同构应用渲染页面不难。难的是真实线上应用要可靠性高,响应速度快。
- 可靠性高:需要能抗住高并发性能压测。
- 响应速度快:除了代码层面优化外,需要在架构层面做动静分离的设计。
静态资源:response不会因request的参数变化而变化的资源,通常是资源文件。静态资源不会存在Node服务器上,通常是存放在Apache这样的专业的用C++底层技术做的服务器上作为源站,由CDN提供服务。用户request发到最近的CDN上,CDN会从源站拿到静态资源返回response。当然CDN会做缓存,从源站拿到的静态资源缓存在本地硬盘上,这样相同的request会直接返回本地缓存的资源。
动态资源:会因request的参数变化而变化的资源。参数变种很多不可控,所以不会堆大量的源站机器承载。
- Nginx反向代理:例如http://xxxx.com/123,页面内容根据path里的id进行变化,可以在云服务器的Nginx上根据请求路径配置location的反向代理,规则转成 /xxx?id=123 打到Node服务器上,实时获取资源。
- 负载均衡:Node服务器可以开多个端口,在Nginx配置中进行负载均衡。
- Redis缓存:Node服务器获取到的实时资源,可以在Redis里进行缓存。相同request可以优先返回Redis缓存。
通过动静分离的架构设计可以最大化地提升响应速度。