串讲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中替代了其原有的规则引擎以及工作流引擎,可见其灵活性是足以满足复杂业务支撑的。

写在最后

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

原文发布时间为:2015-02-17

本文作者:vinoYang

本文来自合作伙伴CSDN博客,了解相关信息可以关注CSDN博客。

时间: 2024-09-15 21:08:44

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

Apache Kylin权威指南1.4 Apache Kylin的技术架构

1.4 Apache Kylin的技术架构 Apache Kylin系统可以分为在线查询和离线构建两部分,技术架构如图1-4所示,在线查询的模块主要处于上半区,而离线构建则处于下半区.   图1-4 Kylin的技术架构 我们首先来看看离线构建的部分.从图1-4可以看出,数据源在左侧,目前主要是Hadoop Hive,保存着待分析的用户数据.根据元数据的定义,下方构建引擎从数据源抽取数据,并构建Cube.数据以关系表的形式输入,且必须符合星形模型(Star Schema)(更复杂的雪花模型在成文

Apache OFBiz源码解读之MVC模型

这篇文章我们来共同探讨一下Apache OFBiz的MVC模型的实现机制. 简介 对于Model-View-Controller的概念此处就不做过多介绍了.如果有想了解的请移步:维基百科.这里我只引用维基百科上关于该item的一张图片,来简单展示一下,这三个component之间的交互机制: OFBiz实现MVC是通过XML来串联这三者之间的依赖关系.这里牵扯到几个关键的XML元素:<request-map />,<view-map />,<handler />.这三个

京东技术架构(二)构建需求响应式亿级商品详情页

该文章是根据velocity 2015技术大会的演讲<京东网站单品页618实战>细化而来,希望对大家有用. 商品详情页是什么 商品详情页是展示商品详细信息的一个页面,承载在网站的大部分流量和订单的入口.京东商城目前有通用版.全球购.闪购.易车.惠买车.服装.拼购.今日抄底等许多套模板.各套模板的元数据是一样的,只是展示方式不一样.目前商品详情页个性化需求非常多,数据来源也是非常多的,而且许多基础服务做不了的都放我们这,因此我们需要一种架构能快速响应和优雅的解决这些需求问题.因此我们重新设计了商

MySQL技术架构介绍

金璞:各位网友大家好!我是赛迪网技术应用编辑金璞,今天本来要来的David Axmark先生和周总现在正在路上,预计可能和迟一点跟网友们见面现在我们请陈慧女士做一个自我介绍. 陈慧:我是万里开源的系统工程师陈慧,很高兴作客赛迪网. 金璞:因为David Axmark和周总还没有来,前天的时候MySQL在中国研发中心成立的时候,我当时听到您做了一个演讲,也讲了MySQL技术上的架构包括以后的发展方向之类的.今天先跟网友们讲一讲吧. 陈慧:我们万里开源是MySQL在中国唯一的代理,我们是基于Linu

MySQL的技术架构简介

金璞:各位网友大家好!我是赛迪网技术应用编辑金璞,今天本来要来的David Axmark先生和周总现在正在路上,预计可能和迟一点跟网友们见面现在我们请陈慧女士做一个自我介绍. 陈慧:我是万里开源的系统工程师陈慧,很高兴作客赛迪网. 金璞:因为David Axmark和周总还没有来,前天的时候MySQL在中国研发中心成立的时候,我当时听到您做了一个演讲,也讲了MySQL技术上的架构包括以后的发展方向之类的.今天先跟网友们讲一讲吧. 陈慧:我们万里开源是MySQL在中国唯一的代理,我们是基于Linu

Apache OFbiz entity engine源码解读

简介 最近一直在看Apache OFbiz entity engine的源码.为了能够更透彻得理解,也因为之前没有看人别人写过分析它的文章,所以决定自己来写一篇. 首先,我提出一个问题,如果你有兴趣可以想一下它的答案: JDBC真的给数据访问提供了足够的抽象,以至于你可以在多个支持jdbc访问的数据库之间任意切换而完全不需要担心你的数据访问代码吗? 我曾经在微博上有过关于该问题的思考: 其实这个感慨正是来自于我之前在看的一篇关于jdbc的文章,里面提到了jdbc中的一些设计模式(工厂方法),提供

解读数据传输DTS技术架构及最佳实践

摘要:8月24日,阿里云数据库技术峰会到来,本次技术峰会邀请到了阿里集团和阿里云数据库老司机们,为大家分享了一线数据库实践经验和技术干货.在本次峰会上,阿里巴巴高级技术专家付大超(千震)针对于云计算时代最好的数据传输产品阿里云DTS的架构设计.基本原理以及相关的应用场景进行了精彩分享.帮助大家了解了阿里是如何实现异地多活和异构多活的,以及通过DTS轻松实现迁移.双同同步.容灾.订阅的真实案例. 以下内容根据演讲嘉宾现场视频以及PPT整理而成. 本次分享的内容主要围绕以下四个部分: 一.DTS技术

OceanBase 1.0 分布式技术架构

OceanBase 1.0项目从2013年初开始做总体设计,2014年开始编码.测试,2015年底正式上线并无缝迁移部分集团MySQL业务,直到2016年中才正式上线蚂蚁核心业务,包括会员视图.花呗.账务,等等,最后"丝般柔顺"地通过了2016年双十一大考. 从技术架构的角度看,一个分布式数据库主要就是两个部分:一个部分是怎么做存储,怎么做事务:另外一个部分是怎么做查询.首先我们看第一个部分,主要是三个关键点:可扩展.高可用以及低成本,它们代表了OceanBase的核心技术优势. 分布

从小站到大站的技术架构优化之路-网站架构与前端服务性能优化

一.课程目的 2015年,5月的某天,正在上班,突然看线公司群里开始发出携程网访问500的信息,于是乎,大家小扯的一下,大家并没有想到后来发生的事情的事情会如此震惊,开始官方的微博确认问题为,正遭受攻击,但后来内部的技术人员泄漏出"数据库被物理删除!" 这个对于技术的人员来说,可以说是非常惊讶的消息,大家开始了各种疑问,怎么确定是数据库引起,作为一个大公司怎么会有这种问题产生,数据库作为底层核心,为什么恢复机制是那么薄弱. 陆续消息中,最后传出,由于运维人员的类似于自动化系统操作不当,