Java企业级应用架构设计中的分布式结构 (java企业级应用开发期末考试)

教程大全 2025-07-15 05:15:37 浏览

Java企业级应用架构设计中的分布式结构

2009-08-25 13:25:00Java企业级应用架构设计是每个Java开发者不必学的知识,本文将对Java EE应用的架构与设计进行一些基础性的介绍,而这些内容构筑了整个Java EE应用开发的基础。

Java企业级应用架构设计中的分布式结构大致可以分为单级结构、2级结构、3级结构和N级结构。充分理解和应用分布式结构可以更好的理解当代网络计算的现状,设计出更优的企业级应用程序。

长久以来,Java企业级版本(Java EE)已经成为了众多产业领域(如银行业、保险业、零售业、酒店业、旅游业以及电信业等等)进行企业商务应用开发和部署的平台选择。Java EE之所以应用如此广泛,其原因在于,Java EE可以为构建健壮、高扩展性的分布式应用系统提供标准化的平台,而这些应用所支持的范围可以涵盖从银行核心业务运作,到航空公司订票引擎之间的广大区域。不过,开发成功的Java EE应用也可能成为一项艰巨的任务,Java企业级应用架构设计在其中起着重要作用。

首先Java EE平台自身所提供的丰富选择就足可以令人生畏。那些过剩的框架、实用程序类库、集成开发环境(IDE),以及可供选择的工具让一切都更加富有挑战性。因此,选择好合适的技术对于开发基于Java EE的软件来说至关重要。而那些拥有健壮架构与设计准则的技术,会对构建易于维护、重用以及扩展的应用系统大有裨益。我们将首先回顾一下分布式计算的进化史以及n级结构。之后我将展示Java EE平台是如何解决分布式应用开发中的难点的。同时你还会了解模型-视图-控制器(MVC)结构准则。然后我会结合MVC准则与Java EE平台,来讲解多层Java EE应用结构。在了解了应用系统架构之后,我将把注意力集中到基于面向对象原则的Java EE应用开发上。我同时还会讲解如何使用设计模式来简化设计过程,以及如何选择***的实践范例。此外我还会触及Sun公司的Java BluePrints所收录的设计模式目录,其内容在Deepak Alur et al的《核心J2EE设计模式》(Prentice Hall出版社,2003年)一书中有详细的介绍。在文章的***,我将介绍通用建模语言(UML)以及其在可视化Java EE文档设计与架构之中所扮演的的角色。 分布式计算进化史 在分布式计算中,一个应用会被划分为若干稍小的部件,并同时运行在不同的计算机上。这种计算方式又被称为“网络计算”,因为这些部件通常会通过建立在TCP/IP或者UDP协议之上的某些协议进行通讯。这些稍小的应用部件被称为“级”,每一级都可以向其他连接级独立提供一类服务。而“级”又可以被细化为若干“层”,以便降低功能的粒度。大多数Java企业级应用架构设计都应具有三个不同的层:

◆表现层负责用户接口。

◆业务层执行业务逻辑。在运行过程中,它还会与数据访问层进行交互。

◆数据访问层负责对存储在企业信息系统(EIS)中的数据进行存取等操作。通过分析分布式计算结构的跃迁史,我们可以更好的理解当代网络计算的现状。在接下来的几节中,我将用几个恰当的例子介绍分布式结构的变迁。 单级结构 单级结构的使用可以追溯到那些使用简易终端连接巨型主机的日子。在这种结构中,用户接口、业务逻辑以及数据等所有应用构成层都被配置在同一个物理主机中。用户通过终端机或控制台与系统进行交互,而这种方式只具有非常有限的文本处理能力(参见图1)

图1. 单层结构(图中文字:CONsole——“控制台”;Dumb Terminal——“简易终端”;Mainframe——主机)

2级结构 在1980年代早期,个人电脑(PC)变得非常流行,它比大型主机便宜,处理能力又比简易终端之类的设备强。PC的出现为真正的分布式(客户端—— 服务器 ,C/S)计算铺平了道路。作为客户端的PC现在可以独立运行客户接口(UI)程序,同时它还支持图形化客户接口(GUI),允许用户输入数据,并与服务器主机进行交互,而服务器主机现在只负责业务逻辑和数据的部分。当用户在客户端完成数据录入后,GUI程序可以选择性的进行数据有效性校验,之后将数据发送给服务器进行业务逻辑处理。Oracle基于表单的应用就是2级结构的优秀范例。表单的GUI存储在客户端PC中,而业务逻辑(包括代码以及存储过程)以及数据仍然保留在Oracle的数据库服务器中。此后又出现了另外一种2级结构,在这种结构中,不只是用户接口(UI),连业务逻辑也被放到了客户端一级。这种应用的典型运行方式是直接连接数据库服务器进行各种数据库查询。这种客户端被称作“胖客户端”,因为这种结构将可执行代码的相当大一部分都放到了客户端一级(参见图2)。

Java企业级应用架构设计中的分布式结构loading="lazy"> 图2. 2级结构(Business Logic Layer——业务逻辑层;Optional——可选;User Interface Layer——用户接口层;Thick Client——胖客户端;Data Access Layer——数据访问层; Mainframe Server——服务器主机)

3级结构 尽管2级“胖客户端”应用的开发很简单,但是任何用户接口或者业务逻辑的改变所导致的软件升级都需要在所有客户端上进行。幸运的是,在上世纪90年代中期,硬件成本已经变得越来越低,而CPU的运算能力却得到了巨大提升。与此同时,互联网的发展非常迅速,互联网应用的发展趋势已经逐渐显现,两者的结合最终导致了3级结构的产生。在3级结构模型中,PC客户端只需要安装“瘦客户端”软件——比如浏览器——来显示服务器提供的展示内容,服务器负责准备展示内容、业务逻辑以及数据访问逻辑,应用程序的数据来自企业信息系统,例如关系数据库。在这样的系统中,业务逻辑可以通过远程访问,因此通过Java控制台应用程序支持一个独立的客户端就成为课程。业务层主要通过数据访问层与信息系统实现交互。因为整个应用都位于服务器之上,因此这样的服务器也被称作“应用程序服务器”或者“中间件”(参见图3)。

图3. 3级结构(图中文字:Presentation Layer——表现层;Business Logic Layer——业务逻辑层;Data Access Layer——数据访问层;Thin Client——瘦客户端;Application Server——应用程序服务器;Enterprise>


OSS网管主要是用来做什么的?

OSS网管全称是综合业务支撑平台(移动是BOSS,联通是UNICSS)。 目前主要采用爱立信的设备。 综合业务支撑平台主要是针对移动通讯行业开发的支撑平台,综合营运商各个方面的业务管理,整合各方面的资源,使资源得以充分共享。 1、平台总体介绍:综合业务支撑平台主要应用于电信行业,帮助运营商实现灵活多变的营销策略,支撑营运商“以客户为中心”的管理理念,是一个有机的企业核心级支撑系统。 2、系统介绍:综合业务支撑平台由专业计费、综合营业、综合帐务、综合结算、客户资料统一管理、统一支付、系统监控等子系统组成:1、各专业计费子系统完成各种业务数据的采集与计费;2、综合帐务子系统实现各业务优惠、出帐、多业务合帐、帐单级优惠、交叉优惠、实时信用度控制等多功能、多业务的“一单清”;3、综合营业子系统实现多业务统一的营业受理、帐务支付和综合查询等“一台清”业务受理功能;4、综合结算子系统实现各业务国内、国际结算及各业务间结算;5、客户资料统一管理子系统提供统一的客户数据管理接口,实现多业务的客户资料共享,综合营业子系统是客户信息的初始唯一入口;6、客户支付子系统实现多业务的统一收费,并基于多服务渠道的接入扩展用户支付途径和支付手段(现金、托收、预付款、语音交费、网上交费等);7、监控子系统通过实时采集网络上各个监控节点的信息,实现对系统中运行的各个部分、各个层次的监控告警功能。 可基于J2EE架构并采用JAVA总线式结构开发,内部各子系统模块化、标准化设计,各个子系统和其他子系统间的接口实现规范化、统一化,为其他子系统提供标准的数据接口和通讯接口,增加系统的灵活性和易扩展性。 J2EE体系架构是当前成熟、稳定的企业级应用平台,可提供多层的分布式应用模型、组件重用、一致化的安全模型、连接管理、性能优化以及灵活的事务控制,平台独立的、基于组件的J2EE解决方案不依赖于任何一个厂商的产品和API,便于系统的移植与分布。 支撑平台总体特点如下:1、分布式技术,扩展能力强,根据实际情况,结合硬件实时进行负载均衡;2、数据实体封装技术;3、系统整体设计:表现层、应用层、数据管理层、数据层相对独立实现;4、业务数据支持大容量数据库并提供与第三方数据库互连接口;5、与现有通信网相接,提供开放的标准接口;

PHP.JSP.ASP的区别

ASP全名Active Server Pages,是一个WEB服务器端的开发环境,利用它可以产生和执行动态的、互动的、高性能的WEB服务应用程序。 ASP采用脚本语言VBScript(Java script)作为自己的开发语言。 PHP是一种跨平台的服务器端的嵌入式脚本语言。 它大量地借用C,Java和Perl语言的语法, 并耦合PHP自己的特性,使WEB开发者能够快速地写出动态产生页面。 它支持目前绝大多数数据库。 还有一点,PHP是完全免费的,不用花钱,你可以从PHP官方站点(http: //)自由下载。 而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。 JSP是Sun公司推出的新一代网站开发语言,Sun公司借助自己在Java上的不凡造诣,将Java从Java应用程序和Java Applet之外,又有新的硕果,就是JSP,Java Server Page。 JSP可以在Serverlet和JavaBean的支持下,完成功能强大的站点程序。 三者都提供在 HTML代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。 但JSP代码被编译成 Servlet并由Java虚拟机解释执行,这种编译操作仅在对JSP页面的第一次请求时发生。 在ASP 、PHP、JSP环境下,HTML代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。 普通的 HTML页面只依赖于Web服务器,而ASP 、PHP、JSP页面需要附加的语言引擎分析和执行程序代码。 程序代码的执行结果被重新嵌入到HTML代码中,然后一起发送给浏览器。 ASP 、PHP、JSP三者都是面向Web服务器的技术,客户端浏览器不需要任何附加的软件支持。 技术特点ASP:1. 使用VBScript 、 JScript等简单易懂的脚本语言,结合HTML代码,即可快速地完成网站的应用程序。 2. 无须compile编译,容易编写,可在服务器端直接执行。 3. 使用普通的文本编辑器,如Windows的记事本,即可进行编辑设计。 4. 与浏览器无关(Browser Independence), 客户端只要使用可执行HTML码的浏览器,即可浏览Active Server Pages所设计的网页内容。 Active ServerPages 所使用的脚本语言(VBScript 、 Jscript)均在WEB服务器端执行,客户端的浏览器不需要能够执行这些脚本语言。 Server Pages能与任何ActiveX scripting语言兼容。 除了可使用VB Script或JScript语言来设计外,还通过plug-in的方式,使用由第三方所提供的其它脚本语言,譬如REXX 、Perl 、Tcl等。 脚本引擎是处理脚本程序的COM(Component Object Model) 对象。 6. 可使用服务器端的脚本来产生客户端的脚本。 7. ActiveX Server Components(ActiveX 服务器组件 )具有无限可扩充性。 可以使用Visual Basic 、Java 、Visual C++ 、COBOL等程序设计语言来编写你所需要的ActiveX Server Component 。 PHP:1?数据库连接PHP可以编译成具有与许多数据库相连接的函数。 PHP与MySQL是现在绝佳的群组合。 你还可以自己编写外围的函数去间接存取数据库。 通过这样的途径当你更换使用的数据库时,可以轻松地修改编码以适应这样的变化。 PHPLIB就是最常用的可以提供一般事务需要的一系列基库。 但PHP提供的数据库接口支持彼此不统一,比如对Oracle, MySQL,Sybase的接口,彼此都不一样。 这也是PHP的一个弱点。 JSP:1?将内容的产生和显示进行分离使用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面。 使用JSP标识或者小脚本来产生页面上的动态内容。 产生内容的逻辑被封装在标识和JavaBeans群组件中,并且捆绑在小脚本中,所有的脚本在服务器端执行。 如果核心逻辑被封装在标识和Beans中,那么其它人,如Web管理人员和页面设计者,能够编辑和使用JSP页面,而不影响内容的产生。 在服务器端,JSP引擎解释JSP标识,产生所请求的内容(例如,通过存取JavaBeans群组件,使用JDBC技术存取数据库),并且将结果以HTML(或者XML)页面的形式发送回浏览器。 这有助于作者保护自己的代码,而又保证任何基于HTML的Web浏览器的完全可用性。 2?强调可重用的群组件绝大多数JSP页面依赖于可重用且跨平台的组件(如:JavaBeans或者Enterprise JavaBeans)来执行应用程序所要求的更为复杂的处理。 开发人员能够共享和交换执行普通操作的组件,或者使得这些组件为更多的使用者或者用户团体所使用。 基于组件的方法加速了总体开发过程,并且使得各种群组织在他们现有的技能和优化结果的开发努力中得到平衡。 3?采用标识简化页面开发Web页面开发人员不会都是熟悉脚本语言的程序设计人员。 JavaServer Page技术封装了许多功能,这些功能是在易用的、与JSP相关的XML标识中进行动态内容产生所需要的。 标准的JSP标识能够存取和实例化 JavaBeans组件,设定或者检索群组件属性,下载Applet,以及执行用其它方法更难于编码和耗时的功能。 通过开发定制化标识库,JSP技术是可以扩展的。 今后,第三方开发人员和其它人员可以为常用功能建立自己的标识库。 这使得Web页面开发人员能够使用熟悉的工具和如同标识一样的执行特定功能的构件来工作。 JSP技术很容易整合到多种应用体系结构中,以利用现存的工具和技巧,并且扩展到能够支持企业级的分布式应用。 作为采用Java技术家族的一部分,以及Java 2EE的一个成员,JSP技术能够支持高度复杂的基于Web的应用。 由于JSP页面的内置脚本语言是基于Java程序设计语言的,而且所有的JSP页面都被编译成为Java Servlet,JSP页面就具有Java技术的所有好处,包括健壮的存储管理和安全性。 作为Java平台的一部分,JSP拥有Java程序设计语言“一次编写,各处执行”的特点。 随着越来越多的供货商将JSP支持加入到他们的产品中,您可以使用自己所选择的服务器和工具,修改工具或服务器并不影响目前的应用。 应用范围ASP是Microsoft开发的动态网页语言,也继承了微软产品的一贯传统,只能执行于微软的服务器产品,IIS(Internet Information Server) (windows NT)和PWS(Personal Web Server)(windows 98)上。 Unix下也有ChiliSoft的组件来支持ASP,但是ASP本身的功能有限,必须通过ASP+COM的群组合来扩充,Unix下的COM实现起来非常困难。 PHP3可在Windows,Unix,Linux的Web服务器上正常执行,还支持IIS,Apache等一般的Web服务器,用户更换平台时,无需变换PHP3代码,可即拿即用。 JSP同PHP3类似,几乎可以执行于所有平台。 如Win NT,Linux,Unix。 在NT下IIS通过一个外加服务器,例如JRUN或者ServletExec,就能支持JSP。 知名的Web服务器Apache已经能够支持JSP。 由于Apache广泛应用在NT、Unix和Linux上,因此JSP有更广泛的执行平台。 虽然现在NT操作系统占了很大的市场份额,但是在服务器方面Unix的优势仍然很大,而新崛起的Linux更是来势不小。 从一个平台移植到另外一个平台,JSP和JavaBean甚至不用重新编译,因为Java字节码都是标准的与平台无关的。 性能比较有人做过试验,对这三种语言分别做回圈性能测试及存取Oracle数据库测试。 在循环性能测试中,JSP只用了令人吃惊的四秒钟就结束了*的回圈。 而ASP、PHP测试的是2000*2000循环(少一个数量级),却分别用了63秒和84秒。 (参考PHPLIB)。 数据库测试中,三者分别对 Oracle 8 进行 1000 次 Insert,Update,Select和Delete: JSP 需要 13 秒,PHP 需要 69 秒,ASP则 需要 73 秒。 前景分析目前在国内PHP与ASP应用最为广泛。 而JSP由于是一种较新的技术,国内采用的较少。 但在国外,JSP已经是比较流行的一种技术,尤其是电子商务类的网站,多采用JSP。 采用PHP的网站如新浪网(sina)、中国人(Chinaren)等,但由于PHP本身存在的一些缺点,使得它不适合应用于大型电子商务站点,而更适合一些小型的商业站点。 首先,PHP缺乏规模支持。 其次,缺乏多层结构支持。 对于大负荷站点,解决方法只有一个:分布计算。 数据库、应用逻辑层、表示逻辑层彼此分开,而且同层也可以根据流量分开,群组成二维数组。 而PHP则缺乏这种支持。 还有上面提到过的一点,PHP提供的数据库接口支持不统一,这就使得它不适合运用在电子商务中。 ASP和JSP则没有以上缺陷,ASP可以通过Microsoft Windowsd的COM/DCOM获得ActiveX规模支持,通过DCOM和Transcation Server获得结构支持;JSP可以通过SUN Java的Java Class和EJB获得规模支持,通过EJB/CORBA以及众多厂商的Application Server获得结构支持。 三者中,JSP应该是未来发展的趋势。 世界上一些大的电子商务解决方案提供商都采用JSP/Servlet。 比较出名的如IBM的E-business,它的核心是采用JSP/Servlet的Web Sphere。 它们都是通过CGI来提供支持的。 但去年10月后它推出了Enfinity,一个采用JSP/Servlet的电子商务Application Server,而且声言不再开发传统软件。 总之,ASP,PHP,JSP三者都有相当数量的支持者,由此也可以看出三者各有所长。 正在学习或使用动态页面的朋友可根据三者的特点选择一种适合自己的语言。

Spark RDD,DataFrame和DataSet的区别

RDD、DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同。 RDD和DataFrameRDD-DataFrame上图直观地体现了DataFrame和RDD的区别。 左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。 而右侧的DataFrame却提供了详细的结构信息,使得SparkSQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。 DataFrame多了数据的结构信息,即schema。 RDD是分布式的Java对象的集合。 DataFrame是分布式的Row对象的集合。 DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化,比如filter下推、裁剪等。 提升执行效率RDDAPI是函数式的,强调不变性,在大部分场景下倾向于创建新对象而不是修改老对象。 这一特点虽然带来了干净整洁的API,却也使得Spark应用程序在运行期倾向于创建大量临时对象,对GC造成压力。 在现有RDDAPI的基础之上,我们固然可以利用mapPartitions方法来重载RDD单个分片内的数据创建方式,用复用可变对象的方式来减小对象分配和GC的开销,但这牺牲了代码的可读性,而且要求开发者对Spark运行时机制有一定的了解,门槛较高。 另一方面,SparkSQL在框架内部已经在各种可能的情况下尽量重用对象,这样做虽然在内部会打破了不变性,但在将数据返回给用户时,还会重新转为不可变数据。 利用 DataFrameAPI进行开发,可以免费地享受到这些优化效果。 减少数据读取分析大数据,最快的方法就是 ——忽略它。 这里的“忽略”并不是熟视无睹,而是根据查询条件进行恰当的剪枝。 上文讨论分区表时提到的分区剪枝便是其中一种——当查询的过滤条件中涉及到分区列时,我们可以根据查询条件剪掉肯定不包含目标数据的分区目录,从而减少IO。 对于一些“智能”数据格 式,SparkSQL还可以根据数据文件中附带的统计信息来进行剪枝。 简单来说,在这类数据格式中,数据是分段保存的,每段数据都带有最大值、最小值、null值数量等一些基本的统计信息。 当统计信息表名某一数据段肯定不包括符合查询条件的目标数据时,该数据段就可以直接跳过(例如某整数列a某段的最大值为100,而查询条件要求a> 200)。 此外,Spark SQL也可以充分利用RCFile、ORC、Parquet等列式存储格式的优势,仅扫描查询真正涉及的列,忽略其余列的数据。 执行优化人口数据分析示例为了说明查询优化,我们来看上图展示的人口数据分析的示例。 图中构造了两个DataFrame,将它们join之后又做了一次filter操作。 如果原封不动地执行这个执行计划,最终的执行效率是不高的。 因为join是一个代价较大的操作,也可能会产生一个较大的数据集。 如果我们能将filter 下推到 join下方,先对DataFrame进行过滤,再join过滤后的较小的结果集,便可以有效缩短执行时间。 而SparkSQL的查询优化器正是这样做的。 简而言之,逻辑查询计划优化就是一个利用基于关系代数的等价变换,将高成本的操作替换为低成本操作的过程。 得到的优化执行计划在转换成物理执行计划的过程中,还可以根据具体的数据源的特性将过滤条件下推至数据源内。 最右侧的物理执行计划中Filter之所以消失不见,就是因为溶入了用于执行最终的读取操作的表扫描节点内。 对于普通开发者而言,查询优化 器的意义在于,即便是经验并不丰富的程序员写出的次优的查询,也可以被尽量转换为高效的形式予以执行。 RDD和DataSetDataSet以Catalyst逻辑执行计划表示,并且数据以编码的二进制形式被存储,不需要反序列化就可以执行sorting、shuffle等操作。 DataSet创立需要一个显式的Encoder,把对象序列化为二进制,可以把对象的scheme映射为SparkSQl类型,然而RDD依赖于运行时反射机制。 通过上面两点,DataSet的性能比RDD的要好很多。 DataFrame和DataSetDataset可以认为是DataFrame的一个特例,主要区别是Dataset每一个record存储的是一个强类型值而不是一个Row。 因此具有如下三个特点:DataSet可以在编译时检查类型并且是面向对象的编程接口。 用wordcount举例://DataFrame// Load a text file and interpret each line as a ds = (/home/spark/1.6/lines)[String]val result = (_( )) // Split on (_ != ) // Filter empty ()// Convert to DataFrame to perform aggregation / ($value) // Count number of occurences of each (count(*) as numOccurances)($numOccurances desc)// Show most common words first后面版本DataFrame会继承DataSet,DataFrame是面向Spark SQL的接口。 //DataSet,完全使用scala编程,不要切换到DataFrameval wordCount = (_( ))(_ != )(_()) // Instead of grouping on a column expression (i.e. $value) we pass a lambda ()DataFrame和DataSet可以相互转化, [ElementType] 这样可以把DataFrame转化为DataSet,() 这样可以把DataSet转化为DataFrame。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐