.NET到Node.js
从.NET到Node.js谈前后端分离实践(by vczero)
一、最初的【无分离】实践
11年末的时候,用winForm开发程序,拖拖控件,点点按钮,连接数据库,做一些基本的管理系统;Java的JSP还能包揽一切,服务器端拼接模板,顶多使用servlet做一些业务逻辑,做到后端的MVC。那时候,带了一个学校的创新团队,做一些项目,但是基本上是一个人前端后一起搞,现在想想,真是【杂乱无章】,后端MVC还好,倒是前端,基本上只能做一些简单效果,施展的空间不大,幸好,也基本能完成项目。
我称之为【无分离】实践,如果是像一个人搞,开发速度倒是挺快的。
前后端无分离实践,从.NET winForm说起,当然你要说winForm没有服务端啊,这个我后面会提到ASP.NET的分离实践以及对winFrom的思考,或者说是【端 & 服务】的思考:

在这个过程中,经历的是将后端业务理解的更清楚。为什么这里展示的是WinForm呢,而不是ASP.NET呢,主要原因有两个:一个是后面将要突出【端 & 服务】,这里将桌面程序称之为PC Client;第二个原因是后面基于ASP.NET的实践基本上做到了前后端分离。
用Java EE开发过一个数据的分析系统,是web端的,期间第一版本基本上没有前后端分离,具体的表现如下。

二、开始尝试前后端分离(基于WCF的前后端分离实践)
12年底的时候,跟着博士参加比赛,首次真正的去尝试前后端分离,想想以前写的程序和可维护性真是菜的不行。比赛要的是一个产品,而不是关心你选择的平台。因为组内就我一个学过JAVA和开发过项目,大多是学的.NET,为了平衡,于是选择了.NET。这次对前后端分离是最深刻的,整个后端的架构开始新的尝试。那时候到处都在提服务共享,于是,我到处查找资料,后来在博士的指导下看到了Restful设计。于是最终的选择方案是.NET WCF REST + MongoDB构建服务端;前端是HTML + CSS + JS + Jquery(那时候的前端还没有用MVC);服务器时IIS。
我们的项目名称是"基于XXXX的服务",后来,成果也不错,拿了不错的成绩。觉得WCF的实践还是蛮爽的,后来在师兄公司实习也做了一点WCF的服务。具体的实践如下图:

整个项目就不细说,主要是说分离的实践,贴上当时开发的作品截图(左:服务平台; 右:微旅行推荐应用,都是比赛科研项目):

思考:winForm为什么不采用这种方式呢?
本质上,我认为桌面程序是PC Client,也是客户端的一种,那么就可以采用的WCF提供服务的方式;因此,如果项目很大,一部分专注服务开发,一部分专注Client开发(包括PC && Web),那样服务就可以共享,client可以各种各样。
三、最兴奋的实践(使用Node.js做服务中间层)
参加工作到今,我所在的团队在Node.js上的实践应该有2-3年吧,至少我来之前,就有用在产品的研发中。Node.js在服务端的性能卓越,尤其是擅长IO。就昨天还跟Android平台部的同事聊天,他说Node.js给APP增添了活力和提高了整个APP的体验。当然,参加了node.js开发的几款产品,对这种方式体会更加深刻。
Node.js作为中间服务的优势,如下图所示(嘿嘿:公司产品就不贴图了,这里代表的是我个人的观点)。

四、总结
(1)把【服务平台化】,多端调用,无论是PC Client, pc web, webAPP, APP(android && ios)...
(2)专注前后端分离实践,发挥客户端的性能和功能,例会pc web的MVC.
(3)大胆使用node.js作为服务中间层,发挥基于事件和异步IO的性能优势,至少,写的一些服务的压测结果还是挺好的(当然这是node的功劳了)。
.NET到Node.js的更多相关文章
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- Node.js:进程、子进程与cluster多核处理模块
1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...
- Node.js:理解stream
Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...
- Node.js:Buffer浅谈
Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
- Node.js入门(一)
一.Node.js本质上是js的运行环境. 二.可以解析js代码(没有浏览器安全级的限制): 提供系统级的API:1.文件的读写 2.进程的管理 3.网络通信 三.可以关注的四个网站: 1.https ...
- Node.js学习笔记——Node.js开发Web后台服务
一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...
- Node.js入门
开始之前,安利一本正在看的书<站在两个世界的边缘>,作者程浩,上帝丢给他太多理想,却忘了给他完成理想的时间.OK,有兴趣的可以看一看. node.js如标题一样,我也是刚开始接触,大家一起 ...
随机推荐
- 一C++PSO(PSO)算法
收集和变化PSO算法,它可用于参考实施: #include <cstring> #include <iostream> #include <cmath> #incl ...
- mybatis以序列周期,同样处理的这个问题的价值
原因猜测缓存,由于代码是肯定没问题,但无论怎么查都一样值 <select id="querySeq" resultType="java.lang.Long" ...
- 一起写2048(160行python代码)
前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家.而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到20 ...
- [HA]负载均衡:HAPROXY与KEEPALIVED强强联合
第一步:更改系统控制配置文件,同意分配虚拟IP(VIP) /etc/sysctl.conf net.ipv4.ip_nonlocal_bind=1 <pre style="word-w ...
- hdu 3683 Gomoku (模拟、搜索)
Gomoku Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- android在当前app该文件下创建一个文件夹
/********************************************************************* * Author : Samson * Date ...
- Visual Prolog 的 Web 专家系统 (6)
保存用户响应询价.作为进一步推理的条件 或GOAL段开始.最初的一句是write_startform() write_startform():- write("<form action ...
- SWOT分析是神马?
SWOT分析是思维的工具来理解事物的方式.人生在世,作为一个独立的实体,不可避免地需要思考的问题.除非你是猪.猪比这更聪明.眠质量,都要完爆白领,蓝领和金领们. SWOT分析分为四个象限.我们用一头名 ...
- 优秀团队建设--美国式团队(ppt)
美国式团队 一.团队精神 团队精神反映一个人的素养.一个人的能力,一个人与别人合作的精神和能力.一个团队是个有机的总体,作为个人,仅仅有全然融入到这个有机总体之中,才干最大限度地体现自己的价值. 团队 ...
- 流动python - 写port扫描仪和各种并发尝试(多线程/多进程/gevent/futures)
port扫描仪的原理非常easy.没有什么比操作更socket,能够connect它认为,port打开. import socket def scan(port): s = socket.socket ...