自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 一个浏览器搞定前后端开发的低代码框架正式开放源码啦!

  本来想尽量做完美一点再开放,但个人能力实在有限,无法专注于实现内置分布式数据库,所以想借助社区的力量来验证与推进。一、框架设计目标:简单:能有更多的时间专注于业务领域;灵活:不能有任何限制,能够灵活扩展;快速:能够尽可能快的开发应用系统;二、框架整体结构:  左图为整体结构,右图为每个应用节点的组件结构:目前关系数据库支持Postgresql, NoSql支持Cassandr...

2020-03-06 16:51:32 1215

原创 拖拽方式生成Vue用户界面

  前一阵子拜访了一些小伙伴,大家都表示苦前端太久了,需要花费不少时间在前端开发上。本着在不损失灵活性的前提下尽可能提高开发效率的原则,作者尝试在框架内集成了拖拽方式生成Vue用户界面的功能作为补充,以方便快速生成增删改查界面,也可以用于大屏展示及简单的网页制作。一、技术原理1.1 布局  目前仅实现了基于vue-grid-layout的网格布局,设计画布上的每个组件动态加载至对应的GridItem内,同时根据组件配置绑定相应的prop及事件。<!--src/components/Design

2021-03-29 15:17:22 4618 4

原创 终于可以愉快的撸Java异步代码了!

  异步响应式编程可以极大的提高系统的并发呑吐量,但由于Java没有类似于其他语言的Async/Await机制,所以只能通过CompletableFuture.thenXXX()来串联各个异步任务,这给习惯了写同步增删改查的小伙伴们带来了些小麻烦。如果说C#基于状态机在编译时实现了await转换,那么Java肯定也可以基于相同的原理实现await,作者上网一搜果然找到了ea-async,使用与C#相同的方式实现了await异步方法,这回终于可以愉快的撸Java异步代码了。一、 示例代码  举个扣减库存并

2021-01-18 14:10:57 387

原创 这么优雅的Java ORM没见过吧!

  Java的ORM框架有很多,但由于Java语言的限制大部分都不够优雅也不够简单,所以作者只能另辟蹊径造轮子了。照旧先看示例代码了解个大概,然后再解释实现原理。一、ORM示例1. Insertpublic CompletableFuture<Void> insert() { var obj = new sys.entities.Demo("MyName"); //构造参数为主键 obj.Age = 100; //设置实体属性的值 return obj.saveAs

2021-01-13 16:38:50 360 3

原创 Java“微服务”还能这么玩!

  "微服务"加个引号是因为这不是传统定义的微服务架构,顶多算是"小服务"架构,因为服务实例由集群节点统一加载,非独立部署。下面以图说明一下服务调用流程。一、服务调用流程节点主进程:类似于Istio的SideCar,负责对外网络及集群内节点间的通信,另外提供内置分布式的存储引擎(目前元数据均存储于此);节点子进程:负责加载服务实例与服务调用,支持服务实例的热更新。1.2. 客户端调用服务请求经由负载均衡转发至主进程的WebHost内;3.4. 主进程根据服务标识将请求通过共享内存队列发给子进

2020-12-24 20:08:45 165 3

原创 AppBoxFuture: Web在线报表设计与PDF生成

  企业应用需要打印各类单证及报表,为了方便开发此类应用作者在框架内集成了报表引擎,并且实现了基于Canvas的Web在线报表设计及基于PDFJS的报表查看与打印。一、原理浅析报表模型:由Xml描述各类报表元素组成(表格、图形、条码等),通过报表设计器生成;数据源:通过推(Push)或拉(Pull)的方式填充报表所需数据,其中Pull模式直接调用框架内服务生成数据源。报表生成:报表引擎解...

2020-04-24 11:47:40 223

原创 AppBoxFuture实战: 如何同步开发与生产环境的模型

  框架是用抽象模型驱动的方式来生成应用系统的,这样可以将这些模型序列化为相应的模型包文件,通过反序列化导入至其他部署环境内,从而实现开发环境与生产环境的同步,包括对应的数据库结构的同步。下面通过示例来演示如何操作:一、准备测试应用通过New->Application创建一个新应用,名称如:erp;选择新建的应用的Entities目录,通过New->Entity新建一个实体模型...

2020-03-12 13:31:34 247

原创 AppBoxFuture实战: 如何实现一对多表单的增删改查

  本篇通过完整示例介绍如何实现一对多关系表单的相应服务及视图。一、准备数据结构  示例所采用的数据结构为“物资需求”一对多“物资清单”,通过IDE的实体设计器如下所示:1. 物资(DonateItem)  主键为Id(Guid)2. 物资需求(Requirement)  主键为Id(Guid)3. 物资清单(RequireItem)  主键为Req(Requirement)+...

2020-02-18 18:30:15 427

原创 AppBoxFuture: Sql存储的ORM查询示例

  上篇介绍集成第三方Sql数据库时未实现如导航属性、子查询等功能,经过大半个月的努力作者初步实现了这些功能,基本上能满足80%-90%查询需求,特别复杂的查询可以用原生sql来处理,下面分别示例介绍。Like/In/NotInpublic async Task<object> Query(){ var codes = new string[] { "001", "003...

2019-12-26 13:22:42 127

原创 AppBoxFuture: 集成第三方Sql数据库

  框架设计之初是不准备支持第三方数据库的,但最近几个朋友都提到需要将旧的基于传统Sql数据库的应用迁移到框架内,主要是考虑到一方面目前框架内置的分布式数据库尚未完善,另一方面是希望能逐步迭代旧应用替换传统数据库。因此作者还是决定支持第三方数据库,下面介绍如何集成第三方数据库,并将实体模型映射存储至其中。一、创建DataStore  DataStore主要保存数据库的配置(连接)信息,通过ID...

2019-11-28 19:48:56 172

原创 AppBoxFuture: 服务模型的在线调试与性能监测

  框架内的服务模型(ServiceModel)用于处理各类业务逻辑(如最简单的CRUD操作),在设计时以类似于伪代码的形式存在,发布时后端会通过Roslyn转换并编译为运行时代码。为了方便开发者更简单的调试服务模型,作者利用开源的netcoredbg初步实现了在线调试功能。一、实现原理  原本想参照VSCode实现调试功能,但VSCode使用的vsdbg调试器有许可限制,无法用于第三方IDE...

2019-10-22 21:42:49 219

原创 AppBoxFuture: Raft快照及日志截断回收

  AppBoxFuture的存储引擎依赖Raft一致性协议来保证各个分区副本的一致性,如果不处理Raft日志将不断增长,因此需要特定的机制(定期或每处理一定数量的日志)来回收那些无用的日志数据。通过学习Raft协议内的Log Compaction,并参考TiKV等实现,作者初步实现了分区快照与日志截断回收功能。一、快照流程:  每个分区对应一个Raft组,由不同的Raft节点分布在集群的不同...

2019-09-30 13:26:47 392

原创 告别单体架构,迎接分布式时代!

  随着互联网+、智能制造等大数据应用的发展,传统的企业信息化单体架构必定绕不过以下两个坎:单机资源瓶劲造成系统响应慢,需要高成本升级硬件来解决;单机故障造成系统不可用,需要较长的时间来恢复故障。  所以将来的企业信息化基础架构必定是分布式的,AppBoxFuture设计之初就确立了必须满足简单、低成本的分布式架构原则,能够利用普通硬件构建具备横向扩展能力的集群。作者最近在设计与实现集群...

2019-09-11 13:07:06 144

原创 AppBoxFuture: 123挨个站-数据按序存储

  最近几天在优化存储的编码规则,顺带把之前设计了但未实现的倒排序一并实现了。由于所有数据(元数据、实体、索引等)都映射至RocksDB的Key-Value存储,所以必须扩展RocksDB的自定义比较器(Comparator)来实现自定义Key的排序规则。存储层涉及到需要自定义排序的主要是分区元数据、实体数据以及索引,下面分别说明:一、分区排序  在大表分区设置分区键及其规则时,可以根据需要设...

2019-09-10 20:19:32 117

原创 用ECharts绘制Prometheus图表,实现类似Grafana的自定义Dashboard

  大家一般都是用Grafana自定义Dashboard来监控Prometheus数据的,作者这次尝试用ECharts来绘制Prometheus数据图表,一方面可以减少依赖,另一方面可以将监控界面灵活的集成进应用系统。至于如何在被监测机器上安装NodeExporter以及如何部署Prometheus作者就不描述了,园子里有很多文章介绍。一、数据查询及转换  Prometheus提供了Http ...

2019-09-06 20:52:49 3383 1

原创 我造了个好大的"轮子",居然还不是"圆"的!

  我造的这个"轮子"指的是集低代码开发与运维为一体的平台,为什么说它不是"圆"的,因为它有些与众不同,甚至可以说是有些另类。至于为什么造这个"轮子",以及另类在什么地方且听我慢慢道来。一、痛苦的编码岁月  我是一个70后码农,开发过不计其数的系统,小到进销存大到电商、物联网甚至是省级平台。每次项目开始都要经历从技术选型、架构设计、开发、测试及最终生产环境部署运维等多个步骤。小项目还好随便一个...

2019-08-09 08:56:55 165

原创 AppBoxFuture: 二级索引及索引扫描查询数据

  数据库索引对于数据查询的重要性不可言喻,因此作者在存储层实现了二级索引,以及利用索引进行扫描的功能。目前仅实现了分区表与非分区表的本地索引(数据与索引共用一个Raft组管理),全局索引及反向索引待以后再实现。一、存储结构:  在介绍索引前先了解一下数据与索引是以何种结构存储于RocksDB内的,每个节点的RocksDB实例都包含以下两个ColumnFamily,每个列簇的存储结构如下:1...

2019-07-30 14:16:29 151

原创 我是如何基于二阶段递交及悲观锁实现分布式事务的

  由于框架一开始的定位就是需要支持强一致性分布式存储,所以如何实现分布式事务成为一个大挑战。作者学习了CockroachDB及TiDB等数据库的实现方式后,决定参考TiDB的实现方式,但不同于使用乐观方式而是采用悲观锁方式,遇到事务冲突采用排队的方式而不是重启事务。一、二阶段(2PC)递交流程:参考下图举例说明一下流程:业务服务开始事务,其所在的节点作为事务协调者新建一个事务实例(使用...

2019-07-27 10:53:02 119

原创 AppBoxFuture: 大数据表分区的3种策略

  之前的文章“分而治之”在介绍大表分区时,作者尚未实现不同的分区策略,即只能按指定的分区键进行分区。这次作者完善了一下分区策略,在规划大表分区时可以按Hash或者时间范围进行分区,所以本篇介绍不同的分区策略适用的场景,同时介绍一下表扫描时如何指定从特定分区查询数据。一、分区策略及其适用场景:  在新建实体模型时,根据数据是否动态增长以及预估数据规模后确...

2019-07-01 09:46:48 271

原创 AppBoxFuture(九).组织结构与权限体系

  权限体系是用于约束用户访问或操作资源的权利,这里的“资源”可以指数据,也可以指特定的功能(如审核订单)。通常的权限体系设计是基于角色的访问控制方式,用户通过角色与权限进行关联。作者的实现方式稍微有些不同,通过组织结构树与权限进行关联,这样可以实现子级节点继承上级节点设置的权限。一、数据结构组织单元(OrgUnit):根据上级标识自引用的表结构,另通过EntityRef引用组织或工作组或...

2019-06-12 07:35:52 170

原创 AppBoxFuture(八). 另类的ORM实现

  通常的ORM实现基于配置或注释,由反射或Emit生成相应的Sql语句,然后将Sql发送给数据库解析Sql字符串生成AST再交给优化器处理后执行,返回的数据再经由反射或Emit转换为相应的实体实例。作者认为上述方式主要存在以下两个问题:实体类代码是硬编码的,如果实体类定义变更必须重新编译应用再部署,不利于实现运行时动态变更实体定义;CRUD操作转换为Sql的实现复杂,且需要针对不同的数据库...

2019-05-31 08:20:51 98

原创 AppBoxFuture(七). 分布式外键约束

  关系数据库与NoSql其中的一个主要区别是具备完整的外键约束,虽说现在一些大厂在设计数据存储结构时禁止使用外键约束,靠业务逻辑来保证数据完整性,但考虑到是人就会犯错,为了保证关键业务数据的完整性,所以作者还是决定在存储引擎层面实现外键约束功能。一、实现思路  由于存储引擎是分布式的,所以引用者与被引用者可能存在不同的节点上(如订单数据在节点1上,订单引用的产品数据在节点2上),这样实现外键...

2019-05-22 14:14:37 131

原创 AppBoxFuture(六). 前端组件化开发

  前面几篇都是在介绍结构化与非结构化的数据存储,本篇换换口味介绍一下框架是如何实现前端组件化开发的。首先得感谢Vue、ElementUI等优秀的前端开源项目,这些项目帮助作者快速实现了框架的两个前端工程(IDE及Web应用)的开发。  当初框架的设计目标是:前端、后端、存储端统统一锅端,为什么这么设计,一方面是想减少开发人员对于开发环境及各类工具的安装配置时间,另一方面是想消除各端之间的集成调...

2019-03-05 16:34:47 316

原创 AppBoxFuture(五). 分布式文件存储-Store Everything

  本来本篇是想介绍前端组件化开发用户界面,发现框架还未实现文件存储,原本计划是后续设计开发的,索性把计划提前,所以本篇将介绍基于Raft实现分布式的文件存储引擎。一. 实现思路  既然是分布式存储,就需要解决以下几个关键问题:如何将文件以多副本的形式存储在集群的节点上,且保证副本间的一致性?这个问题可基于Raft协议实现相应的状态机来解决;如何将大量的文件分组,即如何划分多个Raft组...

2019-02-21 22:05:26 309

原创 AppBoxFuture(四). 随需而变-Online Schema Change

  需求变更是信息化过程中的家常便饭,而在变更过程中如何尽可能小的影响在线业务是比较头疼的事情。举个车联网监控的例子:原终端设备上传车辆的经纬度数据,新的终端设备支持同时上传速度数据,而旧的车辆状态表数据量超过亿级,此时如果Alter table add column将会造成数据表上锁,导致上传或查询车辆状态数据等待。AppBoxFuture的存储引擎在设计之初也是采用锁表的方案,后来考虑到上述应...

2019-01-17 21:13:45 264

原创 AppBoxFuture(三). 分而治之

系统数据量达到一定程度后必将采用分库分表的方式来提高系统性能,但传统的分库分表方式也必将带来更高的开发复杂程度。新一代的NewSql及NoSql数据库由于天生的分布式存储基因,既保证了能够横向扩展,又可以避免较高的开发复杂程度。AppBoxFuture框架的存储引擎借鉴了新一代分布式数据库分而治之的思想,在设计实体模型时可以指定分区键,存储引擎会根据分区键创建相应的RaftGroup(多个副本)。

2019-01-14 09:43:41 505

原创 AppBoxFuture(二). Say goodbye to sql

  信息管理类应用系统离不开关系数据存储,目前大家基本都使用的是传统的数据库如MySql、Postgres等。作者从事信息化建设十多年,个人认为传统的数据库存在以下的问题:扩展问题:  系统数据的不断增长是个绕不过去的坎,传统数据库的存储结构一般都基于B+tree,单表数据在一定范围内没有问题,但数据量增大到一定程度后性能便会不断下降,只能通过分库分表的方式或升级硬件来解决,...

2019-01-14 09:20:22 205

原创 AppBoxFuture(一). Hello Future!

  AppBoxFuture是一个快速应用框架(Rapid Application Framework),是作者十几年从事信息化建设的经验结晶。框架具备以下一些特色:极简的分布式系统架构根据需要可单节点或集群部署,如下图所示:模型驱动开发(MDD):框架将应用系统所涉及的数据结构、业务逻辑、用户界面、工作流、报表、权限等抽象为各类型的模型,通过组合模型以形成完整的应用系统,通过调...

2019-01-14 08:59:42 2126 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除