SMSS是一个由我我的发起的开源项目,目的是创建一套轻量化,高可用,高安全和方便扩展的业务支撑框架。SMSS面向TCP/IP层开发,适合扩展上层业务接口。数据结构传输序列化经过Protobuf实现。传输过程当中的数据通过OpenSSL加密再由接收端进行解密,文件传输也须要由发送方的秘钥首先作签名再由接收方验签。核心功能彻底不须要DB支撑,下降学习、开发和部署的难度。客户端使用Electron,也足够简单和保持跨平台特性。另外一个方面,我相信对于每个曾经心怀梦想进入IT行业的人来讲,可以建立属于本身的开源项目都是一种对“我的价值”的体现。我也相信这样的梦想从未消失,只是各类“福报”淹没了。因此,三月前我决定与其等待他人给我“福报”不如本身动手来实现属于本身的“福报”。html
目前项目已经发布在gitee上(源码地址),技术验证和原型开发已经完成。client目录下是客户端相关源码,开发语言为JavaScript。server目录下是服务端相关源码,开发语言为C++。扩展功能可能会经过Java来支撑。doc目录下主要是一些设计文档和Protobuf结构文档。node
开发过程当中不管是技术要点仍是架构方面都有不少收获,本文主要就这些方面的感悟进行分享。更多实现细节我会在从此分专题介绍。linux
一个框架不管大小最终都须要服务于具体业务,或提供支撑或提供具体实现。但是咱们又不能仅仅经过具体业务来设计框架,那样话就失去了通用性。一段没有通用性的代码是毫不能称之为框架的。所以,为了设计一套优秀的系统,设计人员应该具有至少两个方面的能力——高度抽象的能力和剥离依赖的能力。首先,设计师须要先将业务需求抽象,抽象出那些适合开闭原则的接口。例如,模块A和模块B须要通讯,咱们能够分别在两个模块中实现一对Socket。但是若是还有模块C须要加入该怎么作呢?做为一个更加合理的方案是设计一个模块X,全部须要通讯的模块都须要先向模块X注册,而且只须要向模块X发送消息。转发和消息缓存所有由X内部完成。说到转发,X如何保证消息可以正确的从A发送到B呢。或许你会想到将每个模块的通讯端用一个map保存起来以方便点对点发送。点对点的发送是一个好方法,但是若是业务需求是A要同时向BCD发送消息呢?为了解决这个问题,我参考IP包TTL的概念,每个须要发送的消息都添加一个计数器。不管该消息是广播仍是点对点发送,都会通知每一节点来读取,每读取一次计数器减一。固然只有正确的节点才会将消息发送出去,对应的模块才会接收到。当计数器为0的时候表示该消息已经能够释放。模块X能够从缓存中取出下一条消息继续广播。没错,这就是微服务的本质,而模块X还有一个更通俗的名字——网络总线(netbus)。git
这个问题也是我在开发工做中被问及最多的。这是一个简单的问题,每个开发人员都会面临相似的难题。有时候咱们发现,不少的代码堆在一块儿既没法阅读也没法维护。但是有时候咱们也发现,过渡封装让简单的逻辑难以理解。那么到底怎么作才是合理的呢?这里我提供封装的三个层次。在这三个层次上你均可以对代码进行封装,除此以外先堆在一块儿也不失为一个策略。算法
要解释这个问题,咱们应该明确几个概念。你的代码给谁看?注释须要解释什么?注释如何被利用?编程
所以,我对注释的观点是:按照文档生成工具的规定格式写注释便可。提交源码的同时生成一份document,既能够证实你的工做量又知足了大多数状况下的要求。至于方法内部的注释,关键地方说明一下便可。json
若是只能用一句话来回答,就是都要学。设计模式
全部的发明本质上都是发现。新技术的产生并非一个孤立的事件,它每每是为了解决一些之前不被重视的难题。Java中有IO和NIO的概念,相信不少人都了解。工做中我发现,不少人其实对NIO的理解不够深入,仅仅是知道它是一种non block IO。但是为何它是非阻塞的,非阻塞就必定比阻塞好吗?我经过学习libevent,理解了在操做系统层面自己就对IO提供了select、poll和epoll几种驱动模型,目的是IO的多路复用。但是系统总线只有一条,复用的究竟是什么。复用的实际上是程序(CPU运算)。相比IO总线来讲,CPU的运算效率高得多。传统的阻塞IO当程序须要从文件或网络上读取/发送数据的时候就需等待在那里直到操做完成,而非阻塞IO模型使得程序能够在这个过程当中先向下运行,直到数据准备好之后再回来处理。缓存
那么非阻塞IO必定比传统IO好吗?有过JavaScript开发经验的人必定会对各类回调不陌生,甚至“深恶痛绝”。因为nio模型不会等待数据读取,一般状况下咱们须要经过注册回调函数来完成任务。若是有大量的IO须要处理,回调函数就会层层递进。这样就增长了开发和维护的难度。安全
你瞧,学习底层原理和理解新技术自己并不矛盾。理解一些底层原理也会更容易掌握新技术。除此之外,设计模式和算法也是咱们平时须要积累的地方。SMSS中利用红黑树完成用户ID和用户名的查找,在用户登陆和用户离线的时候会触发红黑树的旋转。最后我想说,底层原理和新技术自己不矛盾,你都应该学习。更加多元的技术能让你走的更远,更加扎实的理论功底能让你走的更稳。
面对一项复杂的任务,我应该注意些什么
和全部人同样,这也是我在开发SMSS中常常思考的问题。目前,每次增长一个新的功能我都会首先考虑,这个功能应该如何测试,尽可能作到每完成一块均可以经过测试观察是否达到了预期。传统的瀑布式开发显然已经不适用了,因为全部的设计和开发工做都由我我的在业余时间完成,时间并不容易自由控制。所以若是一个小的功能点在写完后没法被验证,几天后我就极容易忘记当初的思路。完成一个较大的模块每每须要几周时间,若是等到那时再测试就很难发现问题了。若是你也能遵循这套标准来安排本身的工做和学习,那么恭喜你,你已经掌握了敏捷开发的关键要点。
不少时候,有关设计方面的应用就是在这样的一点一滴中获得实践。
接下来简单介绍一下我在SMSS中运用到的技术。
最后,但愿你们能继续关注我后面的技术分享,也欢迎加群来与我交流。