去年差不多时间写了一篇CUBA平台使用感想 - 架构师角度 ,CUBA 这又发展一年了,从去年的版本 6 进化到全新的版本 7,其中有了不少的变化,而且经过近一年的熟悉、使用和思考,不得不说,CUBA 平台确实是企业级应用开发这个领域不可忽视的一个竞争力量。
全面的架构
CUBA 中文站在最新的一次改版中,在首页推出了 CUBA 7 的架构图,但不是下面这个版本,而是稍作裁剪省去了左边的前端展示部分。不过不影响需要表达的内容。
下图中蓝色部分为 CUBA 默认带的功能,橙黄色部分是需要开发者自己实现的部分。
架构解析
从架构上看,新版本的 CUBA 7 依然采用了 module 的方式,GLOBAL、CORE、WEB、PORTAL 四大模块将核心架构做了很好的松耦合处理,开发上仍然很好的支持团队合作。
由下自上看看这些模块如何服务于企业级应用开发的:
存储部分
数据库方面,除了应用本身的主数据存储之外,支持附加数据存储(外部数据库),可以正向生成数据库脚本后者通过数据库反向生成 Java 对象。
企业开发中面临的一个常见问题就是需要集成或者访问企业现有的数据库,亦或者与现有的系统共享数据。CUBA 的附加数据存储能很好的解决这个问题,只需要将现有的数据库作为附加存储,那么运行于主数据存储上的应用程序便可无缝对现有数据库进行 CRUD 操作了。
文件存储方面,CUBA 默认提供了方便的文件存储服务以及基于 AWS S3 文件存储的服务,一般来讲够用了。如果需要扩展的话,CUBA 也提供了 FileStorage 接口,由于使用 Spring 技术,因此可以通过实现该接口来自定义文件存储的方式。这个是个中规中矩的设计。文件访问在企业应用中,也是非常常见的功能。
GLOBAL module
顾名思义,全局模块,这个模块中定义的内容可以在各个模块使用。这是松耦合中各个模块的连接器。这里有服务 API 的接口定义、数据模型的 Entity 类、系统的配置接口、以及其他共享的工具类。
企业级应用开发中,独立出这一层是很有必要的,以便更好的支持团队开发。比如,开发者 A 负责后台服务开发,开发者 B 负责 web 模块开发,那 A 可以先写好服务接口,B 就可以利用接口进行前端界面开发了,而不需要等 A 做完后台具体的逻辑。这里甚至可以采用 mock 技术,先模拟一些假数据通过接口 API 提供给 B 做界面开发。
CORE module
CORE 模块是 CUBA 应用程序的“后台”,负责实现服务并与数据库通信。CUBA 提供了强大的 DataManager 和 EntityManager 用来与数据库交互,并使用 EclipseLink 作为 ORM 层提供基于视图的关联表数据加载机制,从而能有效避免使用 Hibernate 获取关联数据的 1+N 问题。
框架既支持以 Java 代码的形式组织 JPQL 查询语句,也支持通过 xml 的方式直接配置查询语句实现类似 MyBatis 的功能。
在企业级开发来说,性能是个很重要的指标,由于使用视图技术,避免了冗余的数据库查询,提高了应用程序的性能。
WEB module
WEB 模块是 CUBA 平台实现后台管理系统的地方(CUBA 一直称之为 backoffice system,其实如果用户量不大,直接使用 WEB 模块开发系统也是没问题的)。
界面开发使用的是 Vaadin 框架,Vaadin 是基于 Java 语言的界面技术,由于跟后台开发语言的一致性以及 Vaadin 的稳定性,基本在这个领域是不二的选择。也就是说如果你的团队只有 Java 开发人员,也可以做界面开发。另外,Vaadin 的界面与后台之间使用的是 WebSocket 方式通信,保证了信息传递的安全性并且能有效的避免从前端发起的恶意攻击。
CUBA 框架默认提供了一套系统的管理界面(ADMIN UI),包括用户、权限、实体、日志、会话等等界面。 这对企业级应用的开发来说,省了很多事了。
PORTAL module
PORTAL 是面向门户、面向终端用户开发的模块,主要使用的 REST API 技术,并且 CUBA 提供了自己 REST API TypeScript 组件,方便与 JS 前端进行集成。
据悉,CUBA 团队正在研发基于 React 库的代码生成工具,这将是一个意义重大的突破。另外,团队也会继续开发为 Angular 框架生成脚手架代码的工具,毕竟 Angular 是企业级前端开发框架的首选,特别是伴随 v9 中 Ivy 的诞生,Angular 的性能将会是一个飞跃。
CUBA 框架一直以来,前端 JS 框架部分的支持不是特别好,以前版本用的 Google Polymer,可惜 Google 并没有把重心放在这个小而精的前端库上。这次的改进,将 CUBA 的前端短板进行弥补,从而使得框架更加无懈可击了。
平台瘦身
很多框架或者平台会越做越大,因为要实现的功能越来越多,而且平台也必须越来越完善。但是这个似乎非常正确的理论,放到 CUBA 框架反而不合适了。
首先希望读者了解下 CUBA 独特的扩展方式,通过这个特殊的扩展方式,使得平台能够“越来越瘦”。相对于平台的 v6 版本,v7 和 v7.1 逐渐对平台进行了减负,分别将平台中特定场景下才会用到的 SSO 和 REST API 作为单独的扩展插件提炼了出来。使得平台更专注于提供基础的应用程序功能,而在确实需要这些模块的时候开发者可以选择自行添加。
企业级应用开发中,特别是对于做 2B 软件开发的企业来说,有很多功能可能是类似的,比如说字典、任务管理、填报等,甚至一些共用的数据库表,都可以做成组件,以组件的形式进行管理,同样的思路,可以将核心产品和客户定制化产品进行区分,对核心产品的功能进行瘦身。
强大的 Studio
今年 CUBA 的另一个重大变化是 Studio,通过与 IntelliJ IDEA 社区版的集成(也提供 IDEA 终极版的插件),从独立的Studio(只包含设计和部署)摇身一变成为强大的全生命周期开发工具。这个是什么意思呢,比方说以前,Studio 写文件,文件再在 IDEA 中加载,IDEA 要刷新。现在通过集成 IDEA,可以直接在 IDEA 中修改代码了,开发体验提高了不少。很多新的代码级别的自动完成,也可以更方便实现了。
现在的 Studio,除了能完成界面设计和日常的部署开发工作之外,更是写代码的贴心小助手和自动机器人了。
最新推出的 Studio 12,更是重写了 UI 设计器,使用了 IDEA 的集成界面技术,效率上有了更大的提升。另外,将来也会在 Studio 中集成基于 React 的前端界面开发和设计,又是一个强大的功能。
在费用方面,CUBA 平台一直都只是 Studio 收费,开发出来的应用不收取任何费用。这次 Studio 改版之后,CUBA 更是厚道,只有可视化设计器部分收费了。也就是说如果你能直接通过 xml 写界面或者通过 Java 直接写实体的话,可以完全使用免费的Studio(跟收费版一样,只不过不需要提供订阅信息),并能获得 Studio 中订阅消息、依赖注入等方便的功能。而且收费折扣方面,给了个人开发者相当大的折扣,公司用户也一样,不但有三年期免一年的优惠,而且还有总价的优惠,具体可以看这里。
总结
所以,纵观下来,CUBA平台的思路是基于免费的 CUBA 开源框架,加上 CUBA 插件市场 为核心功能赋能,再通过软件开发全生命周期管理的 Studio 实现快速开发降低开发成本。在技术支持方面,CUBA 也提供了免费的论坛服务。这些都是强大的核心竞争力啊,同学们。
从软件架构上,CUBA 提供了一种松耦合的设计模式,对于团队协作和项目的架构设计很有帮助。技术栈的更新方面,CUBA 在下一个版本中将可能会集成 Spring boot,以及前端技术 React,这两个时髦的技术是 CUBA 社区希望看到的。CUBA 一直以来有个诟病就是使用了大量的 xml,v7 以前的版本中,Studio 依赖 xml 对项目进行解析和分析,从而能帮助项目进行自动代码生成和管理。但是 v7 之后的 Studio 集成了 IDEA,似乎不再需要复杂的 xml 对项目进行配置了,完全可以使用 IDEA 直接访问代码解析 Spring boot 的配置注解来帮助 Studio 理解项目。另外,Vaadin 也会升级到新的版本 14,并通过 Studio 提供自动的项目升级,这个改进会大大提高 backoffice 系统的性能,迁移的兼容性会由 Studio 来完成。
长期来看,CUBA 从去年进入中国之后,一直在加大中国方面的投入和支持,并且框架在继续进化中。其独特的扩展方式和高效稳定低成本的开发输出,正是企业级应用开发必备的能力。
所以,我们会继续使用 CUBA 平台,并且为了保持技术的先进性,我们下一个目标是把活跃的开发项目从 CUBA v6.10 升级到 v7.1,然后等着继续升级更新的 CUBA 版本。祝我们顺利!