实战Spring Cloud、Vue构建基于微服务的SaaS低代码开发平台

  • 低代码开发平台不是快速开发平台
  • 低代码开发平台定义

最近,阿里巴巴发布了自己的低代码开发平台“宜搭”,网址是:https://www.aliwork.com ,关于低代码开发平台,我去年年底也写过两篇文章(https://www.toutiao.com/i6637188964732109315/),对低代码开发进行了初步探讨。关于低代码开发的定义,百度百科是这么写的:低代码开发平台是无需编码或通过少量代码就可以快速生成应用程序的开发平台。它的强大之处在于,允许终端用户使用易于理解的可视化工具开发自己的应用程序,而不是传统的编写代码方式。构建业务流程、逻辑和数据模型等所需的功能,必要时还可以添加自己的代码。完成业务逻辑、功能构建后,即可一键交付应用并进行更新,自动跟踪所有更改并处理数据库脚本和部署流程,实现在 IOS,Android,Web 等多个平台上的部署。

从该定义中我们也可以看到,低代码开发有这么几个核心词汇组成:

(1)面向终端用户,即低代码开发平台的使用者是最终用户或者是实施工程师,快速开发平台的使用者还是程序员;

(2)可视化工具,即要有面向终端应用的程序界面生成器(不是快速开发平台的应用生成器),如下图所示:

(图一,该图来自于excel4app.com)

(3)无需编码或通过少量代码

(4)在必要的时候,有添加自己的个性化代码,完成业务逻辑的机制。

  • 快速开发平台定义

百度百科上,快速开发平台是这么定义的:快速开发平台,就是可以使得开发更为快速的开发平台。当开发平台产生之后,虽然减少了编程人员大量的编程时间,但是很多开发平台的效果并不是很理想,比如说某些开发平台比较复杂、难以掌握;有的开发平台通用性比较差;有的开发平台在时间上并没有得到改善;还有的依然还是需要写很多代码等等。这些问题的存在促使开发者不断的摸索、不断的改进,到最后越做越成熟,以致于现在市面上出现的大部分开发平台效率都非常高,他们改善了以往的产品存在的缺陷,使得开发过程比以往更简洁、编写代码更少、开发效率越来越高。

从定义中也可以看出,快速开发平台是开发更为快速的开发平台。快速开发平台强调的是开发速度快,使用者还只能是程序员,而低代码开发平台的使用者是最终用户,目标不同,所以两者的定位也差异极大。

  • 低代码开发整体架构图

(图二)

低代码开发平台一般由以下几个部分组成:

  • 互动式界面生成器,如上图一所示,最终用户通过互动式界面生成器生成自己的应用,能够完成简单的增删改查等基本操作。
  • 界面渲染引擎,最终用户用互动式界面生成器生成界面后,一般为JSON格式,并保存到数据库或者XML文件中,然后在最终用户使用该功能时,再由JSON界面渲染引擎,把该界面实时渲染出来,无路是Vue、还是React,类似开源的JSON表单引擎有很多,阿里巴巴的宜搭,也是类似的思路。我为啥并不推荐快速开发平台呢,因为前台技术实在是变化太快了,每隔一两年,前台技术就会发生革命性变化,由传统的JSP,发展到Struts,开始引入模板和MVC的概念,再发展到HTML+JQuery,同期还有ExtJS,再发展到现在的所谓的MVVM,前端技术的每次变化,都是对以前技术的推倒重来,而快速开发平台是坐火箭+望远镜也赶不上前台技术发展的,所以快速开发平台往往只能是拿后台的用户、角色、权限、菜单来说事,而不能再像以前可以随意生成JSP页面那样,快速生成Vue、React页面了,因为Vue、React相比较起JSP,实在是太复杂了,JSP是会HTML语法就可以,而Vue、React则是一个技术栈,上下游能牵扯到十几种技术,而且这些技术之间,每个版本还需要仔细考量,最新的版本,往往还互相不兼容。
  • 业务代码编排引擎:虽然是低代码开发平台,但是稍微复杂的一些应用,比如,进销存,还是需要大量代码介入的,但是界面已经由最终用户生成,如何把代码插入到界面当中去?实际上,所有的BPM引擎或者OA工作流引擎,都是支持代码插入的,但是现在所有的BPM引擎,包括国内知名公司的产品,都不是基于微服务架构或者Spring MVC/Spring Boot机制的,所有的代码都用自己的方式藕合在一起,BPM就是一个无法拆分的单体应用,这还不是最可怕的,最可怕的是BPM的代码插入机制,BPM允许插入的代码,数据库连接,与它的工作流引擎,是隔离开的,不在一个事务中。不在一个事务中最大的问题并不是插入数据失败后不能同增同减这么简单,这只是一个已知的用户可接受的问题,最大的问题还是这种机制会造成数据库连接池的内存泄漏或者是数据库连接池很快就用完了,造成系统每隔一段时间,系统就会变得异常缓慢。所以,如何把第三方代码无缝的插入到界面当中去,不造成内存泄漏或者数据库连接池泄漏,也是一个考验架构师的技术活;
  • 流程引擎。关于流程引擎,现在一般都是基于Activiti 进行二次开发,不过国内的BPM流程引擎,由于跟审批绑定得太紧,所以都有挂表单的操作, BPM挂表单,是把表单、流程、存储三位一体,一个是这种方案,给以后微服务的拆分造成无法拆分的问题,自身又是一个单体应用,造成性能问题无法优化;其次,挂表单,刚才讲了,前端技术变化太快,所以表单改为Vue、React以后,也会造成原来的工作流引擎改动太大,最后就是不能改动。所以,如何用互联网的思维,改动Activiti,适应微服务拆库、拆表、前后端分离的改造,也是一个悬挂在架构师头上的一个问题。不知道阿里巴巴的宜搭是如何解决这个问题的,我看宜搭也是有自己的工作流引擎的
  • 报表生成器:国内做报表组件的公司也非常多,一般跟BI挂上钩,显示自己高大上,就跟国内一般不提自己是OA引擎,而说自己是BPM一样(实际我看国内BPM的使用就是快速开发和解决审批流程的,与标榜的业务流程优化一毛钱关系也没有)。国际知名BI厂商如TableU、国内也有FineReport等等,快速开发平台也需要搭建自己的查询、报表生成器,不过,这个与界面渲染引擎、业务代码编排引擎比较起来,还算是比较成熟的技术。
  • 与外界第三方系统的实时交互。使用低代码开发平台,一般不会开发ERP(当然SAP的ERP就是低代码开发平台的鼻祖和典范,但是他把实施搞的太复杂了,一点不比定制开发来的费用低)、MES等复杂应用,但是现在由于客户生存环境也是越来越复杂,一个系统往往不能独立存在,需要大量和其它第三方系统进行交互,所以,如何实时的与其它系统进行交互?这里推荐两种方式:

第一种:通过监控数据库日志,数据的任何变化,都通过数据库日志实时同步到Kafaka之类的MQ上,其它第三方应用通过订阅的方式,并通过频道隔离开,监控自己感兴趣的数据,并实时做出反应就可以了;

第二种:通过编写通用的SQL 转API,最终用户也可以通过界面拖拽方式,生成SQL,并通过引擎,把该SQL最终转换为微服务的API,供第三方调用

使用EasyExcel的坑

阿里的EasyExcel也是基于POI的,为啥不直接使用POI呢,因为现在客户Excel的数据量都比较大,一个Excel文件轻松超过10万条,直接使用POI很容易内存溢出,而EasyExcel通过异步加载的方式,一次取1000条(有限的条数),异步读取,所以不会内存溢出,而且速度足够快。

但是EasyExcel得Bug也很多,其一:

(1)几个月前的版本不能正确读取科学记数法的数据,比如商品条形码,类似这种:6917751460226,是不能正确读出来的;升级到最新版本,可以读出来了,但是几个月之前的版本还读不出来;

(2)几个月前的版本,日期格式不能正确读出来,例如某列日期:2019/7/31,读成一个乱七八糟的数字,最新版本可以读出来了,但是格式自动加上了 00:00:00,即客户数据本来是年月日,自动转换成了  年月日时分分秒;

(3)最新版本,整型自动加了小数点。客户有的数据,例如商品编码,就是一个整型的字符型数据,EasyExcel读取的是狗,自动转为double类型了,所以自动加了小数点。

所以用EasyExcel读取Excel文件数据后,还需要再把数据清洗一下。

店铺经营中关于销售额的思考

这两天在看一本书《超市经营数据分析、管理指南》,是一个日本人纸谷佳伸写的。刚开始读了几页,就被吸引住了,这本书开篇就讲销售额,按照通常理解,销售额有什么好写的,不就是销售的产品数量X产品单价嘛。无论是线下超市、线上淘宝、京东,无不是这个公式。

看了这本书才明白,销售额=销售的产品数量X产品单价,是以产品为核心的,而《超市经营数据分析、管理指南》中的销售额则等于 顾客数量X客单价。虽然在2011年开始做淘宝TP,接触了好多淘宝卖家,听到最多的一个词就是客单价,我这么多年,其实一直没理解客单价的意思,我一致觉得客单价就是这次购物,购买的一个商品的价格,其实是大错特错,客单价(ATV: average transaction value)是指商场(超市)、淘宝、京东每一个顾客平均购买商品的金额,
客单价也即是平均交易金额。我被最后一个字“价”迷惑了很多年,潜意识里一直以为是价格,其实是交易额。

销售额=顾客数量X客单价

无论是线上,还是线下商场、超市,则是以人为核心来看到销售额的。那么以人为核心,肯定就会牵扯到流量(进店人数),转化率等等。

关于帝国CMS

我搞了一个域名:www.excel4app.com ,就是做Excel(模板)解析,并根据Excel内容直接生成应用的。虽然是一个SaaS工具类网站,但是首页还是想有点内容的。

用了WordPress很多年,但是一直没有下力气研究它,从内心,个人不愿意学习PHP,所以,对于Wordpress一直没搞懂。

但是 excel4app.com也不能慌着啊,所以从网上到处找模板,打算自己做一个CMS网站,还花了100块钱,从淘宝上找了一个美工,做了一个 Logo,Logo做好了,模板 一致没着落。找啊找,找啊找,无意中搜索到了一个叫杨青青的成都的一个女前端程序员做的Blog模板,相中后花了300元钱买了她的CMS模板,付钱收到后,却发现该模板是配合帝国CMS的,依附于帝国CMS,而帝国CMS也是PHP做的,心中有点上了贼船的感觉。不过依然已经买了,既买之,则安之吧,再说弄了那么多年Wordpress也没弄明白,换个国产的说不定就好了。所以又顺手在服务器上安装了 PHP环境,安装了帝国CMS。

安装好帝国CMS,才发现帝国CMS居然生成了几百张表,而Wordpress才十几个表而已,换成 杨青青 模版后,便开始首页和生成也得改造,达到符合自己想要的结果,自此噩梦就开始了。Wordpress虽然弄成适合自己意思的模版比较难,但是安装后从来不出错。而帝国CMS按照菜单提示,生成自己的栏目,然后刷新生成静态页面,我觉得先用动态的比较好,可以立即看到效果,我这里一个流量也没有,也没必要每次更新都要生成静态HTML页面,所以,也不知道设置成啥了,发布栏目,设置根目录,本栏目目录,屡屡出错,发布文章,一会静态页面,一会动态页面,不知道帝国CMS是不是来碰瓷的,搞得我要死要活的,哎,先这样吧

React与Vue的选择

React断断续续用了两年多,最近在用Vue,为啥用Vue呢?倒不是技术上的决策,而是我关心的一些国内开源项目,例如微信小程序、商城等应用,绝大部分是用Vue开发的,也就是说国内,Vue的生态远比React好,所以转向了 Vue。

Vue使用了一个月了左右,感觉Vue在语法糖上,确实比React简单多了,例如:v-for,可用于各种场合,例如el-select的Option、Menu的SubMenu等等,而React就只能老老实实写循环,但是Vue在Model与View绑定上,确实坑比较多,而且常常还需要奇门绝技,不是纯粹的双向绑定。例如:Tree的Select选择,React的check 只要selected或者Model变化了,View立即就会变化,而Vue上,只能用

this.$refs.menutree.setCheckedKeys([]);

这一句来清空,所以说Vue的数据绑定,并不是像React那样来的纯粹。

php-fpm 无故停掉了

昨天发现 ,不知道为何,我在Godaddy 购买的Centos服务器,php-fpm无缘无故停掉了,所以我的个人域名访问不了了,今天重启了 php-fpm ,然后我的个人域名又可以访问了。我还以为还墙了。

React+Antd中关于fieldset边框样式无效解决方案

1、设置fieldset和legend样式表

.fieldset {
padding: .35em .625em .75em;
margin: 0 2px;
border: 1px solid silver;
}

.legend {
padding: .5em;
border: 0;
width: auto;
}

2、在React文件中引用该样式表

<div>

<fieldset className=”fieldset” >

<legend className=”legend”>用户登录</legend>

<div>
<label>用户名:</label><input />

</div>

</fieldset>

SaaS 企业软件在国内为啥 一直不能规模化

SaaS企业软件这种模式引入国内也有很多年了,一直没有火起来,今年这个话题又热了起来。不过,根据我的观察,SaaS这种模式,由于国情与美国差异比较大,永远也不会出现Salesforce那样的大平台。

无论是to B企业软件,还是to C互联网公司,在欧美,都是中心化的,ERP无外乎Oracle、SAP,CRM也就那几家公司,创新的压力也肯定是有的,但是客户都会购买或订购那几家公司。但是在国内生态完全不一样,to B的市场,完全是去中心化的。SAP、Oracle、北用友、南金蝶的ERP即使在国内中大型企业已经形成垄断地位,但是,我们依然我可以随处看到,国内还有近千家ERP商场,服务于各类企业,国内生态完全不一样,to B的市场,完全是去中心化的。

2周前,我去一个朋友的公司,调研RFID、物联网是否有应用前景。朋友的公司,是国内市场充分激烈竞争环境下,一个非常典型的加工制造企业,RFID每个标签,5毛钱或者1毛钱的成本,对其成本,不像1块钱一瓶的矿泉水,构不成任何压力,聊了很久,发现对于90%的这类中型企业来讲,引入更先进的管理,老板内心都是有需求的,谁不想做老大呢,谁没有一统江湖做皇帝的心呢,但是,这些企业老板,不是靠先进或者落后的管理模式发展起来的,而是靠低成本,前些年民工的红利发展起来的,管理模式的先进也好,落后也好,萝卜快了不洗泥,没太大意义。当然,1%-10%有国际眼光的老板,靠着国家最近几十年发展的东风,做大做强的也有,但是绝大部分十几年下来,销售额依然在1亿-10亿元规模以下。 

这些老板,习惯了低成本,如果引入了SaaS企业软件,也希望是免费或者低成本,但是人员也是低成本招聘过来的,几个低成本下来,企业管理水平肯定是提高不上去的,至于说SaaS软件提高效率,减员增效,这些老板都是老江湖,成本是否合适,早就明镜似的,根本不需要管理软件去教他如何提高效率,公司从创办开始,这些老板就从江湖上或者社会上学到了如何降低成本。

所以,面向中小型企业的企业软件,是一个面向民工的市场,市场绝对规模很大,但是是去中心化的,而且绝大部分老板的预算是50元或者500元,却希望做一个淘宝那样功能强大的网站,这是一个双输的市场。

SpringBoot Controller接收参数的几种常用方式

第一类:请求路径参数
1、@PathVariable
获取路径参数。即url/{id}这种形式。

2、@RequestParam
获取查询参数。即url?name=这种形式

例子
GET
http://localhost:8080/demo/123?name=suki_rong
对应的java代码:

@GetMapping(“/demo/{id}”)
public void demo(@PathVariable(name = “id”) String id, @RequestParam(name = “name”) String name) {
System.out.println(“id=”+id);
System.out.println(“name=”+name);
}
1
2
3
4
5
输出结果:
id=123
name=suki_rong

第二类:Body参数
因为是POST请求,这里用Postman的截图结合代码说明

1、@RequestBody
例子

demo1

对应的java代码:

@PostMapping(path = “/demo1”)
public void demo1(@RequestBody Person person) {
System.out.println(person.toString());
}
1
2
3
4
输出结果:
name:suki_rong;age=18;hobby:programing

也可以是这样

@PostMapping(path = “/demo1”)
public void demo1(@RequestBody Map person) {
System.out.println(person.get(“name”));
}
1
2
3
4
输出结果:
suki_rong

2、无注解
例子

demo2

对应的java代码:

@PostMapping(path = “/demo2”)
public void demo2(Person person) {
System.out.println(person.toString());
}
1
2
3
4
输出结果:
name:suki_rong;age=18;hobby:programing

Person类
public class Person {

private long id;
private String name;
private int age;
private String hobby;

@Override
public String toString(){
    return "name:"+name+";age="+age+";hobby:"+hobby;
}

// getters and setters

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
第三类:请求头参数以及Cookie
1、@RequestHeader
2、@CookieValue
例子
java代码:

@GetMapping(“/demo3”)
public void demo3(@RequestHeader(name = “myHeader”) String myHeader,
@CookieValue(name = “myCookie”) String myCookie) {
System.out.println(“myHeader=” + myHeader);
System.out.println(“myCookie=” + myCookie);
}
1
2
3
4
5
6
也可以这样

@GetMapping(“/demo3”)
public void demo3(HttpServletRequest request) {
System.out.println(request.getHeader(“myHeader”));
for (Cookie cookie : request.getCookies()) {
if (“myCookie”.equals(cookie.getName())) {
System.out.println(cookie.getValue());
}
}

}

作者:suki_rong
来源:CSDN
原文:https://blog.csdn.net/suki_rong/article/details/80445880
版权声明:本文为博主原创文章,转载请附上博文链接!

最近2周我把市面上 快速开发平台又看了一遍

最近2周我把市面上 快速开发平台又看了一遍,真的太复杂了,不实用,不仅不能快速开发,如果你真的在他们上面开发:

1)不是一个人能搞定的,光是前后端分离,无论是Vue还是 React,都得2-3个前端才能搞定了;后端Spring Cloud系列+JWT+权限+Nacos/Consul,也不是1个人能轻松搞定的,也得需要3-4个人

2)先得学习很多新东西

3)不见得能紧贴自己项目,所以这是一个轮子又一个轮子造出来的原因

。。。