串讲Apache OFBiz技术架构

从决定读ApacheOFBiz源码到现在不知不觉一年就过去了。这一年因为各种原因,导致源码读得断断续续。其实最大的问题还是因为无法深刻得理解里面的一些东西,导致热情骤减。直到最近,公司在开发的一个“应用快速开发平台”引发了我的一些思考,所以决定再把源码拿出来重新阅读。到最近对其架构设计近乎迷恋。

个人认为对于ApacheOFBiz的剖析可以分成三大块来进行:技术、业务、数据库设计。这三块个个都是非常顶尖的水准,每个方向深入进去都可以学到很多东西。之前只是对OFBiz各个部分的单独解析,现在是时候写一篇文章来串讲它的各个部分。当然,这篇主要还是涉及到OFBiz的技术这一块。

框架简介

这张图是OFBiz的整体框架图。从图中可以看到OFBiz的所有app都构建在其framework之上。而其framework的核心就是ServiceEngine(服务引擎)以及EntityEngine(实体引擎)。其实体引擎对于数据库的种类以及拓扑结构的支持都非常健全。它支持本地数据库与远端数据库并存并且支持多达8种主流数据库。

OFBiz技术串讲

下面以一个客户端请求的处理过程来看OFBiz各个组件是如何交互以及衔接的。

(1)客户端浏览器向web服务器发出一个请求(http/https),请求会被web容器接收并作相应的处理(比如参数的封装等)。

(2)请求被路由到一个代理servlet中,该servlet会分析请求是发往哪个app的,然后再到该项目的下的controller.xml配置文件中去匹配request-map配置项,该配置项用于只是OFBiz如何处理这个请求。通常的处理过程是先进行安全检查以及权限确认,然后触发某个“事件”或者服务调用,最后会以一个view作为响应。如果是以一个view作为响应的话,OFBiz会去view-map中匹配该视图,每一个视图view都有它对应的handler。

(3)OFBiz会用配置的handler来处理该view。handler的作用主要用于渲染页面元素,并将需要展示的数据跟页面元素合并。

(4)数据准备。前端的请求归根到底还是请求对后端数据的操作。而ofbiz中用于获取数据的方式十分丰富。考虑到这里对业务逻辑而言,是代码量占比很大的地方,因此OFBiz尝试利用动态语言来编写这部分代码。主要是想利用动态语言的简洁、代码量少、快速开发的优势。随着java语言的发展,OFBiz选择并且替代了多种不同的JVM脚本语言,比如:beanshell,Groovy。采用脚本语言来编写跟操作实体相关的业务逻辑代码,可谓有利有弊:

弊端:动态语言(弱类型语言)固有的类型安全性的缺失以及纯解释执行性能跟Java这种解释+编译型语言还是无法比拟。

优势:大量传统行业,不需要那么高的性能要求;即便需要也可以用提升硬件来改善;脚本语言在编程效率、逻辑简洁性都是Java冗长的代码所望其项背的;脚本语言更贴近人类语言的表达,更适合实现DSL,来表述业务逻辑(而且OFBiz的下一步目标也将增强对Groovy实现DSL的支持)。

(5)OFBiz的viewhandler通过模板引擎绑定页面元素与数据后,渲染出最终的输出流,通过http响应给客户端浏览器。

页面渲染

Apache OFBiz使用XML+Widget的布局,来将页面切分成一个个Widget以增强各个widget的灵活性以及复用性。

这些widget可以互相嵌套形成一个decorator-widget产生模板,在widget可以直接编写html标签,或者引用各种服务端模板引擎支持的模板文件(比如freemaker)。

前端的内容通常是HTML+数据。widget并没有忽略数据这部分。只是一种布局技术,它最终会由webcontainer转化为html,只不过数据的处理(CRUD)通常位于服务器端。而这些动作都被抽象成为了widget中的“action”。一个screen通常包含各种其他组件widget的引用,这些组件widget可以是:form,screen,menu等。

权限检查

OFBiz中采用的是角色+安全组的授权模型。

从图中可以看出常用的几个权限有:_ADMIN(管理员权限),_VIEW(浏览权限,为最小权限),_CREATE(创建权限),_UPDATE(编辑权限),_DELETE(删除权限)。因此如果controller.xml中配置了授权检查时,将会进行上图的权限检查流程。一个请求在处理之前,会检查其是否需要先进行登录。如果登录验证通过,会获取该会员的security group。而security group又是security permission的集合。进而可以判断用户是否有某个操作的权限。

请求事件

因为OFBiz使用了公共代理的servlet,因此对每个请求而言,其处理逻辑就没有独享的servlet了。这里OFBiz引入了Event的机制来处理每个请求需要执行的特定的操作逻辑。

每收到一个请求,如果有特殊的处理,就触发一个event。上图是event的触发机制。它的配置在controller.xml文件下的request-map配置项内。

服务引擎

OFBiz执行服务基于其自身实现的服务引擎框架。该服务引擎借鉴了《CoreJ2EE Pattern》里的“BusinessDelegate”模式。

调用程序通过服务引擎框架调用服务后,服务引擎首先将调用服务的参数提取并构建服务调用的上下文。然后选择合适的dispatcher,它其实就是businessdelegate。由他选择合适的引擎来执行服务。OFBiz会先判断服务有没有“特殊性”,比如它是否是异步的?是否是递归执行的。如果是,那么会选择它内置的JobScheduler来执行。还有它是否是带SECA(ServiceEvent Control Action)的?如果是SECA,那么会先执行SECA然后选择已配置的特定引擎来执行真正的目标服务,而在这个过程中会有一个Map来充当执行的上下文,用于存储中间结果、错误信息以及最终结果。执行完成之后,上下文对象会在调用栈中层层回退,并将最终的执行结果返回给调用端。

服务事件控制响应器

所谓SECA是Service Event Control Action的单词首字母的缩写形式。可以简单得理解成“服务编排”(可能会执行多个服务,但是某些服务需要满足特定的执行条件)。

比如上面一个带SECA的服务X,在服务引擎执行之前,会先处理其ECA(这里先调用一个action,它需要执行服务B)。当ECA处理完成之后,会将控制权返回给执行引擎。执行引擎会根据服务B的执行结果来判断是否会调用真正的服务X。SECA被用于在OFBiz中替代了其原有的规则引擎以及工作流引擎,可见其灵活性是足以满足复杂业务支撑的。

写在最后

更多的技术分析,请看之前的系列文章以及后续的持续更新。

时间: 2024-09-30 14:36:05

串讲Apache OFBiz技术架构的相关文章

Kafka基础系列第2讲:Kafka技术架构剖析

使用过 Kafka 框架的朋友都知道,启动 Kafka 框架只需要两个关联的组件,分别是:Zookeeper 和 Kafka.如果你还没使用过 Kafka 框架,建议先阅读<Kafka 快速入门教程>把玩一下,对 Kafka 有一个感性的认识. 当我们熟悉了 Kafka 的使用之后,我们自然有一些疑惑:Kafka 到底是如何工作的?消息从生产者到 Kafka Server 这中间到底做了什么事情?而 Zookeeper Server 在这过程中有起到什么作用?带着这些疑问,今天我们来深入了解一

大型站点技术架构(六)--站点的伸缩性架构

大型站点技术架构(一)--大型站点架构演化 大型站点技术架构(二)--架构模式 大型站点技术架构(三)--架构核心要素 大型站点技术架构(四)--站点的高性能架构 大型站点技术架构(五)--站点高可用架构 站点系统的伸缩性架构最重要的技术手段就是使用server集群功能.通过不断地向集群中加入server来增强整个集群的处理能力. "伸"即站点的规模和server的规模总是在不断扩大. 1.站点架构的伸缩性设计 站点的伸缩性设计能够分成两类,一类是依据功能进行物理分离实现伸缩.一类是单

大型互联网技术架构4-分布式存储-II Google

The largest single database on earth - Google Spanner. 我们继续互联网技术架构-分布式存储. 上文大篇幅介绍了一些分布式存储的理论,偏重理论.可别小看这些理论,Google的各个神器都是建立在这些理论之上,甚至整个Apache的大数据3剑客项目都是受惠于这些理论.难怪@Tiger大牛讲Google靠的是一大批世界顶尖数据,物理,计算领域的Ph.D.,这些大神以及他们的Paper是Google为什么是Google的原因,以及Google没有开源

JavaWeb网站技术架构

JavaWeb网站技术架构总结 题记 工作也有几多年了,无论是身边遇到的还是耳间闻到的,多多少少也积攒了自己的一些经验和思考,当然,博主并没有太多接触高大上的分布式架构实践,相对比较零碎,随时补充(附带架构装逼词汇). 俗话说的好,冰冻三尺非一日之寒,滴水穿石非一日之功,罗马也不是一天就建成的,当然对于我们开发人员来说,一个好的架构也不是一蹴而就的. 初始搭建 开始的开始,就是各种框架一搭,然后扔到Tomcat容器中跑就是了,这时候我们的文件,数据库,应用都在一个服务器上. 服务分离 随着系统的

《大型网站技术架构》读书笔记之六:永无止境之网站的伸缩性架构

此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. 首先,所谓网站的伸缩性,指不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就可以扩大或者缩小网站的服务处理能力.在整个互联网行业的发展渐进演化中,最重要的技术就是服务器集群,通过不断地向集群中添加服务器来增强整个集群的处理能力. 一.网站架构的伸缩性设计 1.1 不同功能进行物理分离实现伸缩 (1)纵向分离:将业务处理流程上得不同部分分离部署,实现系统的伸缩性: (2)横向分离:将不同的业务模块分离部署

从技术架构的角度去丰富你的大数据知识

对于大数据的学习,很长一段时间,都觉得非常迷茫.不知道具体该学习什么!进而导致知识的知识点挺多,而自己所会的内容都不能够形成很好的体系,进而为自己的职场加分.而最近一直在学习相关大数的架构知识,进而具体到一个厂商.这样反而自己学的很快,总结一下前段时间的学习,温故而知新!!! 首先,大数据开始做为概念开始进入公众并在实际业务中落地是在13年.从一项技术的发展来看,这项技术会在18年形成一个很好的闭环.而在此期间,不管你是不是大数据的项目,在这五年内,只要冠以大数据名称都可以获益. 所以,大数据第

大型网站技术架构(一):大型网站架构演化

第一章:大型网站架构演化 九层之台,始于垒土:千里之行,始于足下. 对于网站的发展,亦是如此,从上世纪90年代开始,互联网经历了20多年的发展,发生了翻天覆地的变化,今天,全球有一半的人使用互联网,从信息检索到实时通信,从电子购物到文化娱乐,互联网渗透到了生活的每一个角落.但是,构建一个高性能的网站,绝非一朝一夕可以完成,我们来看下,作为一个大型网站系统应有的特点: 1.大型网站系统应有的特点 高并发,大流量:需要面对高并发用户,大流量访问.举个例子,去往迪拜的飞机有200张票,但是有100w人

微博首席架构师杨卫华:新浪微博技术架构分析

作为国内微博市场的绝对领军者,新浪微博公布一系列针对开发者的扶持政策,以期与第三方开发者联手推动微博行业的整体发展. 以下为演讲实录: 大家下午好,在座的大部分都是技术开发者,技术开发者往往对微博这个产品非常关心.最晚的一次,是12点多收到一个邮件说想了解一下微博底层是怎么构架的.很多技术人员对微博的构架非常感兴趣,就是一个明星他有300万粉丝,这个技术怎么来实现?今天在这里跟大家分享一下微博的底层机构,让大家对微博的底层技术有更好的了解.另外不管是做客户端.Web 1.0.Web 2.0.论坛

《大型网站技术架构-核心原理与案例分析》之一: 大型网站架构演化

最近刚刚读完李智慧的<大型网站技术架构-核心原理与案例分析>,对每章重点内容作了一些笔记,以便加深印象及日后查阅. 一.大型网站软件系统的特点 高并发,大流量:需要面对高并发用户,大流量访问. 高可用:系统7X24小时不间断服务. 海量数据:需要存储.管理海量数据,需要使用大量服务器. 用户分布广泛,网络情况复杂:许多大型互联网都是为全球用户提供服务的,用户分布范围广,各地网络情况千差万别. 安全环境恶劣:由于互联网的开放性,使得互联网站更容易受到攻击,大型网站几乎每天都会被黑客攻击. 需求快