我的目的是为了让服务器开发像玩LEGO一样简单!
发布于 5 个月前 作者 miserylee 620 次浏览 最后一次编辑是 4 个月前 来自 分享

此处功能将来必改,不要写死!

每一位服务器开发者遇到最头疼的问题,莫过于业务迭代需求太过迅速,写好的代码三番五次的需要修改。作为一个有梦想,有追求的好青年,我怎么愿意去动一动曾经写的像一坨*的代码,可是完全重构没时间没精力。orz,做人怎么那么难!

基于上面的问题,我和我的小伙伴们基于创业两年来的沉淀,开始着手讨论一个“一劳永逸”的方法。嗯,我们需要一套框架,能够理顺服务器开发的各个方面,至少有一套规则能够把开发流程化。市面上成熟的服务器开源框架很多呀,可是总感觉不是太适合用呢。

一个初创企业最不缺少的就是创新精神!所以我们发起了一个计划:自己开发一套服务器框架,基于我们的沉淀下来的经验。我们是创业者,所以我们最懂初创企业最需要一套怎样的框架。

最近组件化开发的思想炒得挺火的,React,Vue,Angular2都致力于将前端开发组件化。Okok,如果用组件化的思想去开发服务器,会是怎样的体验?:D

Plugit就此诞生!

_(:з」∠)_ 说了那么多,我其实是来招募项目贡献者的。Plugit经过了两周开发,目前已具备基本雏形,但毕竟一个人势单力薄,这个框架已经越来越复杂,仅凭我一个人的能力可能再过一些日子就Hold不住了。所以,如果你满足以下若干要求,不需要联系我,默默地去贡献代码吧!

贡献者要求

  1. 具备基本的编码道德
  2. 基本的英文阅读和书写能力
  3. 精通Node.js开发,了解ES6
  4. 会用NPM,Bower,Webpack,Git等工具
  5. 了解服务器开发流程
  6. 最好懂服务器架构相关知识,当然不懂也没关系,毕竟我们需要创新嘛,自成一套也是没毛病的
  7. 有读源码的能力 (毕竟没来得及写文档 XD
  8. 有奇思妙想

Plugit架构图

Plugit架构图 大部分的流程都在架构图中展示出来了,架构图只是为了更直观的表达,可能有一些不完善,一切以源码为准!

Plugit基本原则&架构介绍

  • 所有的接口都是工作流
  • 工作流是指令驱动的,所有的工作者都需要消费指令,所有的工作者都可以发布指令
  • 所有包含写操作的工作流都应该注入事务(保证数据安全,处理错误回滚)
  • 工作流的荷载以合流的形式进行流动
  • 工作流的指令表必须在工作流结束前消费完
  • 所有的工作者最多只能绑定一个组件来进行数据操作
  • 工作者调用组件的查询操作应该跳过事务的处理范围(为了减少服务器资源消耗)
  • 只有注册了的组件才能够被映射连接
  • 只有连接进了映射表的组件才能够被使用
  • 工作者将会以映射表为准来绑定组件
  • 每个组件母口只能装载一个组件(默认为对应类型的Base组件)
  • 只有注册了的插件才能够被映射连接
  • 只有连接进了映射表的插件才能被使用
  • 工作者将会以映射表为准来触发插件
  • 插件的触发由消息中心来进行派发
  • 每个插件母口可以装载多个插件(默认装载插口测试插件)
  • 插件可以调用工作流来执行数据操作(不允许直接操作Model)

Plugit的设计主要是将数据操作的过程解耦,使用工作流来控制业务的走向,使用组件来实现原子化的数据操作,在所有写操作都被事务保证的情况下,工作流可以不用关心工作者的安排顺序,能满足业务需求即可。插件则采用消息的形式,可以将核心业务无关的部分使用插件来处理,业务无需关注插件执行的成功与否。Plugit以一套可视化的管理工具来管理组件和插件的映射表,实现完全自由的业务切换。在所有以上基础上,开发者只用关注于工作流、组件、插件、数据模型的设计即可,大大简化将这个系统进行集成的过程。

Plugit依赖

{
    "co": "^4.6.0",
    "jsondiffpatch": "^0.1.43",
    "koa": "^1.2.1",
    "koa-body": "^1.4.0",
    "koa-cors": "0.0.16",
    "koa-jwt": "^1.2.0",
    "koa-rbac": "^1.0.5",
    "koa-router": "^5.4.0",
    "koa-static": "^2.0.0",
    "merge": "^1.2.0",
    "mongodb": "^2.2.4",
    "mongoose": "^4.5.6",
    "mongoose-timestamp": "^0.6.0",
    "mongoose-unique-validator": "^1.0.2"
  }

Plugit文档结构

.
|____.eslintrc.json
|____.gitignore
|____Example //示例
| |____app.js //示例程序入口
| |____components //示例组件
| | |____account
| | | |____Base.js //Account类型组件的Base组件,用于默认组件连接
| | | |____Event1.js //Account类型的活动组件
| |____configurations 
| | |____RBACRules.json
| |____plugins
| | |____HttpLogger.js	//自定义插件
| |____public
| | |____index.html
| |____router
| | |____accounts.js //业务路由
| | |____index.js
| |____schemas
| | |____Account.js //业务model
| |____workflows
| | |____Account.js //Account工作流
|____index.js //Plugit 入口
|____package.json
|____plugit //Plugit源码
| |____base //Plugit超类
| | |____Component.js //组件超类
| | |____Plugin.js //插件超类
| | |____Worker.js //工作者超类
| | |____Workflow.js //工作流超类
| |____core //Plugit核心实现
| | |____ComponentMap.js //组件映射表
| | |____ComponentMapDesignTable.js //组件映射表设计工作台
| | |____ComponentRegistry.js //组件注册表
| | |____ComponentRegistTable.js //组件注册工作台
| | |____Database.js //数据库连接和model注册
| | |____NotificationCenter.js //消息中心
| | |____PluginMap.js //插件映射表
| | |____PluginMapDesignTable.js //插件映射表设计工作台
| | |____PluginRegistry.js //插件注册表
| | |____PluginRegistTable.js //插件注册工作台
| | |____Plugit.js //Plugit主程序
| | |____Transaction.js //事务系统
| |____default.conf.js //默认配置
| |____middleware 
| | |____attachComponent.js //连接组件中间件
| | |____errorHandler.js //错误处理中间件
| | |____ignoreAssets.js
| | |____logger.js
| |____public //Plugit管理面板
| | |____build //打包后的代码
| | | |____plugit-backend
| | | | |____assets
| | | | | |____boundles
| | | | | | |____app.65df7e6a6ae5843a1ee3.js
| | | | | | |____vendors.65df7e6a6ae5843a1ee3.js
| | | | | |____fonts
| | | | | | |____MaterialIcons-Regular.eot
| | | | | | |____MaterialIcons-Regular.ttf
| | | | | | |____MaterialIcons-Regular.woff
| | | | | | |____MaterialIcons-Regular.woff2
| | | | | | |____Menlo-Regular.eot
| | | | | | |____Menlo-Regular.svg
| | | | | | |____Menlo-Regular.ttf
| | | | | | |____Menlo-Regular.woff
| | | | | | |____Menlo-Regular.woff2
| | | | |____index.html
| | |____src //打包前的Plugit管理面板源码 使用了React+Redux来开发
| | | |____bower.json
| | | |____fonts
| | | | |____Menlo-Regular.eot
| | | | |____Menlo-Regular.svg
| | | | |____Menlo-Regular.ttf
| | | | |____Menlo-Regular.woff
| | | | |____Menlo-Regular.woff2
| | | |____less
| | | | |____common.less
| | | |____scripts
| | | | |____actions
| | | | | |____component.js
| | | | | |____componentMaps.js
| | | | | |____componentMapsGroups.js
| | | | |____components
| | | | | |____App.jsx
| | | | | |____common
| | | | | | |____DataFetcher.jsx
| | | | | | |____Flex.jsx
| | | | | | |____MatchInput.jsx
| | | | | | |____SplitView.jsx
| | | | | |____componentMaps
| | | | | | |____ComponentInfo.jsx
| | | | | | |____ComponentMaps.jsx
| | | | | | |____ComponentMapsGroups.jsx
| | | | | | |____ComponentsByType.jsx
| | | | | | |____CurrentInstalledComponent.jsx
| | | | | |____Navigator.jsx
| | | | |____containers
| | | | | |____AppContainer.jsx
| | | | | |____ComponentInfoContainer.jsx
| | | | | |____ComponentMapsContainer.jsx
| | | | | |____ComponentMapsGroupsContainer.jsx
| | | | | |____ComponentsByTypeContainer.jsx
| | | | |____index.js
| | | | |____pages
| | | | | |____AppPage.jsx
| | | | | |____ComponentMapsPage.jsx
| | | | |____reducers
| | | | | |____componentInfoReducer.js
| | | | | |____componentMapsGroupsReducer.js
| | | | | |____componentMapsReducer.js
| | | | | |____componentsByTypeReducer.js
| | | | | |____index.js
| | | | |____routes.js
| | | | |____store
| | | | | |____configureStore.dev.js
| | | | | |____configureStore.js
| | | | | |____configureStore.pro.js
| | | |____templates
| | | | |____index.html
| |____rbac
| | |____RBACProvider.js
| | |____rules.json
| |____schemas //内部model
| | |____ComponentMap.js
| | |____ComponentRegistry.js
| | |____History.js
| | |____PluginMap.js
| | |____PluginRegistry.js
| | |____Transaction.js
| |____utils
| | |____dirWalker.js
| | |____extension.js
| | |____hotLoader.js
| | |____mongoose-rollbackable.js
| | |____PlugitError.js
| | |____router.js
|____readme.md
|____readme.zh.md
|____webpack.config.js

Github地址:https://github.com/miserylee/Plugit

如果非要联系我,可以:

加我QQ:753456997

发我Email:[email protected]

粉我知乎:https://www.zhihu.com/people/miserylee

Follow me on github:https://github.com/miserylee

2 回复

focus一下,就专注做好插件部分就好了。然后再加koa,mongoose之类的,不要都搞到一起,小而美才有足够的灵活性

非常好,希望后期可以 NPM 化

回到顶部