云计算与SOA之我见

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_1364/article/details/82061260

来源: infoq  发布时间: 2011-05-02 19:01  阅读: 228 次  原文链接   全屏阅读  [收藏]  

  InfoQ于4月23日在北京组织了主题为“企业架构在互联网环境下的挑战”的Oracle技术沙龙。“云计算与SOA有什么区别?”这是Oracle讲师做完企业私有云PaaS解决方案的讲演后,提问环节中观众提出的第一个问题。回答这样的问题是颇具挑战性的,不同背景的人会有不同的理解,也不是一两句话能够解释清楚的。我个人的职业经历正好和SOA、云计算有很大的关系,因此希望和大家分享下我个人对这两者及企业软件领域的一些看法和理解。

  过热(Hype)中的云计算

  云计算起源于大型互联网企业,成本和指数级的业务增长压力使他们非常关注于IT资源的利用率和应用的可扩展性。云计算动态的、可伸缩的、基于互联网的IT服务交付模式很快产生共鸣,得到政府、企业和IT软硬件厂商等的一致认同。大家一致认为云计算将是继PC革命、互联网革命之后的第三次IT革命。

  然而,在Gartner 2010 Hype Cycle(下图)上,云计算位于炒作期的顶峰,而SOA早在2009年就已经位于成熟期,更不在2010的图上。对于SOA来说,人们已经不再谈SOA是什么、能做什么、怎么落地,而是谈论SOA的最佳实践。对于经历过SOA潮流的人来说,应该会有非常深的体会。

  图片来源:Gartner 2010 Hype Cycle (如果看不懂Hype Cycle这个图,请看这篇文章)

  面向企业的云计算解决方案,特别面向企业的私有云PaaS产品和解决方案,仍处于创新(研发)和市场整固阶段,离进入主流应用阶段仍有相当的距离。Oracle的现有私有云PaaS解决方案本质上是对已有产品如Fusion中间件及Oracle数据库等的重新包装,宣传和抢占市场的意义更大一些。这一套东西同样也是构成Oracle SOA解决方案的根基。这就不难理解为什么人们听完讲演后会提出“Oracle的云计算和SOA有什么区别?”这样的问题。

  如果想更深入理解SOA和云计算的区别和共同点的话,需要深入分析企业IT问题的根源,以及SOA和云计算所要去解决的问题和所能带来的价值。

  企业IT架构面临的核心问题

  企业软件和互联网有很多差异,本质的区别在于企业必须直面其“遗留系统(Legacy Apps)”,企业必须保证其核心应用系统的稳定,导致其核心应用系统的生命周期会很长。所以,企业面临的核心问题如何解决长期以来形成的“烟囱式(Silo)的企业计算环境”,如下图所示:

  烟囱式的企业计算环境和IT建设存在如下问题:

  1. 不同的应用系统拥有不同的基础设施(硬件)和应用基础设施(中间件);
  2. 每个新应用都要建设一个新“烟囱”,建设周期长;
  3. 基于峰值规模设计,系统资源利用率低;
  4. 扩展困难;
  5. 没有统一的技术标准,运维成本高;

  在云计算概念普及之前,企业已经在尝试解决这个问题,解决的思路是:

  1. 在基础设施层:虚拟化。利用虚拟化的基础设施提高物理资源的利用率和供给速度。
  2. 在应用基础设施层:SOA化。
  3. 在应用层:集中化。比如原来是一个地市分公司建设一套OA系统,后来是整个省公司只建设一套OA系统;原来结算在每个省公司进行,后来全部集中在集团处理。

  我们来分析一下SOA化。SOA之前,企业应用集成的方式是EAI,但是由于EAI缺乏统一的标准,集成完后又产生了新的孤岛。我们来看看围绕SOA的一些关键字,就不难看出SOA与传统EAI的区别,这些关键字是SOAP、Web Service、服务、互操作、重用、ESB、服务编排、BPM、复合应用、业务敏捷等。因此SOA的目标是使IT基础架构更加灵活并且可重用,以最终实现业务敏捷性。

  我们再看看围绕云计算的一些关键字,这些关键字是多租户、共享的资源池、弹性、动态伸缩、自服务、按需使用、基于Internet、快速供应、IT资源利用率等。企业利用云计算进一步地去解决它所面临的核心问题,但主要目标是提升IT资源的利用率、降低IT成本,促进企业IT建设从粗旷型方式到集约型方式的转变。云计算出现后,企业解决烟囱式问题的思路是:

  1. 在基础设施层:从虚拟化进一步扩展到IaaS。相比于虚拟化,IaaS增加了共享的资源池、自服务及统一的管理、监控和计量。
  2. 在应用基础设施层:基于SOA架构风格上逐步将应用迁移到PaaS平台上。从技术上讲,SOA的核心Building Block如ESB、BPM中间件是位于应用基础设施这层,因此SOA与PaaS之间的对比或许更加合理。下面会对这两者之间的关系进行分析。
  3. 在应用层:企业会考虑更多地直接使用一些SaaS应用。

  PaaS就是云环境中的应用基础设施,也就是中间件,因此PaaS也可以说是中间件即服务,Middleware as a service。中间件的类型非常多,事务型中间件、消息中间件、远程过程/对象调用中间件、应用服务器、数据库服务器、ESB、BPM等等。在传统On-premise部署方式下用到的中间件在云部署下也是要用到的。Gartner把PaaS分成两类,APaaS(application platform as a service)和IPaaS(integration platform as a service)。APaaS主要为应用提供运行环境和数据存储,能够将On-premise下部署的简单三层架构的应用直接部署到APaaS;IPaaS主要用于集成和构建复合应用。

  鉴于企业现有IT的复杂性及目前PaaS平台的能力,是不可能将所有On-premise方式部署的应用一次性部署到云端的,因此On-premise、私有云、公有云将在很长时间内共存。在这种情况下,SOA架构风格能够非常好的支持On-premise、私有云、公有云的共存,如下图所示:

  企业IT架构的演进

  本文并不想直接去回答云计算、PaaS和SOA的关系和区别。我想用下面的这面这张企业架构演进图来作为这篇文章的总结,希望以此来给大家的一些启发,使得大家等够更多地从技术演进的历史来理解新事物。

  从图中我们可以清楚看到企业架构在大型机时代、客户机-服务器时代、互联网时代和云计算时代的演进过程,以及每次演进的业务驱动力和技术驱动力。

  从大型机时代物理上的集中,到云计算时代云端的集中,似乎是一个轮回……

  关于作者

  阮志敏,企业级PaaS平台CloudTao创始人,长期专注于企业软件领域,同时深受互联网技术影响,曾在CORDYS中国,摩托罗拉和惠普中国任职。他的个人博客是:http://www.cloudtao.org/external/blog/taoofcloud;新浪微博是:http://weibo.com/taoofcloud

展开阅读全文

SOA云计算有效相结合推动企业发展

12-20

云计算在很大一部分与SOA有交叉的地方。许多SOA厂商正在进入云计算领域。已经进入云计算领域的大多数厂商是传统的软件厂商。它们已经把自己的产品推向“...作为一项服务”的领域。rnrn  SOA与云计算趋势如何?rnrn  第一,随着企业从部门问题领域向整个企业推广,企业将把更多的重点集中在整个企业范围的SOA。因此,这个重点是在性能和伸缩性、共享的服务和各个领域之间的信息媒介方面。虽然项目级SOA正在成为现实,但是,那些推动企业架构的人们正在努力把SOA作为他们企业中的一个全面的概念。确实,SOA的普及越深,SOA的价值越大。rnrn  第二,SOA治理:它是什么?我们如何创建它?什么是正确的技术?这里有许多混淆概念。我确实要在这方面指责一些厂商,他们都在利用不同的信息向不同的方向发展。SOA治理对于SOA确实是非常重要的。然而,你确实需要把重点放在人员和流程方面,然后放在技术方面。没有一个策略,技术永远不能解决任何问题,特别是SOA治理等复杂的技术。rnrn  第三,现在的重点是放在节省资金的短期迅速获胜方面,而不是放在长期的战略优势方面。不能责备他们,因为所有的地方都在削减预算。你没有理由不把一个SOA项目与企业关键的取胜策略结合在一起。这将对企业的盈亏底线有明显的积极的影响。这些类型的项目要证明SOA的价值还有很长的路要走。rnrn  另一个观点是SOA与云计算的结合。Linthicum说,虽然我认为这个联系是很明显的,但是,大多数人对这个关系仍然不清楚。简单地说,SOA为接近企业架构提供一个框架,同时在SOA环境中使用云计算资源提供额外的价值。确实,SOA为IT基础设施提供了灵活性,并且通过创建必要的接口让企业准备好使用云计算。rnrn  这些概念之间共生的关系能够让企业达到这样一种状态,就是根据企业的需求在防火墙内部和外部运行服务和流程。实际上,这将在需要的时候和地方把你的SOA向外扩展到网络平台,以减少成本和利用互联网提供的资源。这些资源提供预制的流程和服务的访问以及访问以服务方式提供的平台。rnrn  把SOA与云计算分开,你将发现企业没有良好的设备把流程推向云计算。通过把两者结合起来,我们将能够利用使用服务等颗粒机制的计算资源创建一个把信息和流程放在企业防火墙内部和外部的架构。如果我们实现这个目标,这将是一个非常好的事情。 论坛

简单工厂模式之我见

07-31

先做个简单的自我介绍,我在国内一家知名的公司从事对日外包工作,目前日语一级,一年编程经验。rn一直想写一点东西,就针对初学者,探讨一下我对设计模式的学习过程中的感悟吧。这次要写的是简单工厂模式。rn最开始学习设计模式的时候,对抽象类和接口这两个概念很是头疼。抽象类和接口类中,往往什么也不实现,只是定义一下方法。既然什么也不做,为什么还要用它们?在最开始自己写一些程序的时候,几乎是不用抽象类和接口。但随着学习的进一步深入,逐渐体会到了这两个东东的好处。下面就结合生活中的一些常见的事情,来和大家探讨一下简单工厂模式,在此过程中,来说说抽象类和接口的作用。rn大家都很希望有自己的一套属于自己的房子,于是大家很努力的工作,终于挣到了能够买起一套房子的钱。当大家去看房子时,房地产开发商会拿出很多户型给大家看,让大家选择自己喜欢的设计户型。那么房地产商是如何设计房子呢?作为一个家,客厅,卧室,厨房,卫生间是必不可少的。不管是什么户型的房子,都必须满足这些条件,否则,开发出来的房子就不符合消费者的要求,就卖不出去。这里的“家”,指我们所居住的房子,具有所有户型房子的共同点。如果不满足这些条件,就不能称之为家。我们可以把这个家当作设计模式里面的抽象类来看待,房地产商告诉户型的设计人员,你们设计的房子,必须在满足这个框框(客厅,卧室,厨房,卫生间)的基础上来设计,在满足家的基础上,不同户型的房子,客厅该多大,厨房该多大,卧室该朝哪面,是你们该考虑的事情。但是,这个“家”可不能理解错了,不能按照自己的想法,在里面随便添东东。比如:如果在“家”的卧室里面规定了有两个窗户,那么按照所有的户型房子都必须符合“家”的范畴的规定,所有的户型房子的卧室就都得有两个窗户。但有些消费者就是不喜欢卧室有两个窗户,就喜欢一个窗户,怎么办?所以不能在“家”这个抽象的概念上,增加具体的东西,这样会限制要求满足它的具体事物的扩展性。rn rn //家.rn public abstract class Home rn //客厅.rn public abstract void Parlor();rn rn //卧室.rn public abstract void Bedroom();rn rn //厨房.rn public abstract void Kitchen();rn rn //卫生间.rn public abstract void Toilet();rnrn 在满足“家”的基础上,不同户型的房子,根据不同的消费者,可以设计不同类型的客厅,卧室,厨房,卫生间等等。比如A型住宅,建造好后有一个简单的装修,B型和C型的住宅不需要装修。rnrnrn//装修.rnpublic interface Fitment rn //客厅装修.rn public void ParlorFitment();rn rn //卧室装修.rn public void BedroomFitment();rn rn //厨房装修.rn public void KitchenFitment();rn rn //卫生间装修.rn public void ToiletFitment();rnrnrnrn//A型住宅.rnpublic class HouseA extends Home implements Fitment rn public void Parlor() rn System.out.println("This is parlor of House A.");rn ;rn rn public void Bedroom() rn System.out.println("This is bedroom of House A.");rn ;rn rn public void Kitchen() rn System.out.println("This is kitchen of House A.");rn ;rn rn public void Toilet() rn System.out.println("This is toilet of House A.");rn ;rnrn public void ParlorFitment() rn System.out.println("This is fitment of parlor.");rn rn rn public void BedroomFitment() rn System.out.println("This is fitment of bedroom.");rn rn rn public void KitchenFitment() rn System.out.println("This is fitment of kitchen.");rn rn rn public void ToiletFitment() rn System.out.println("This is fitment of toilet.");rn rnrnrn上面的A型住宅也许能够说明这个继承和接口,继承,就是“is-a”的关系,而接口则是“has-a”的关系。正如上面的A型住宅,它是一个“家”,并且有装修。而下面的B型和C型住宅,它们都是“家”,但没有装修,一样不影响居住。rnrn//B型住宅.rnpublic class HouseB extends Home rn public void Parlor() rn System.out.println("This is parlor of House B.");rn ;rn rn public void Bedroom() rn System.out.println("This is bedroom of House B.");rn ;rn rn public void Kitchen() rn System.out.println("This is kitchen of House B.");rn ;rn rn public void Toilet() rn System.out.println("This is toilet of House B.");rn ;rnrnrn//C型住宅.rnpublic class HouseC extends Home rn public void Parlor() rn System.out.println("This is parlor of House C.");rn ;rn rn public void Bedroom() rn System.out.println("This is bedroom of House C.");rn ;rn rn public void Kitchen() rn System.out.println("This is kitchen of House C.");rn ;rn rn public void Toilet() rn System.out.println("This is toilet of House C.");rn ;rnrnrn但大家在选房子的时候,一般来说是不关心盖房子的过程的(用的是什么水泥,请的是哪个施工队等等),只关心房子的质量。当大家选择好自己喜欢的户型时,跟房地产商洽谈好有关事宜,最后签订买卖合同,合同写明:XXX购买XXX房地产开发商的House X型住宅一套。房地产商觉得这个户型选择的人很多,于是开始建造该户型的房子。rnrn//消费者A. rnpublic class Buyer rn public static void main(String[] args) rnrn //找到房地产商,并告诉他,我要A型的房子。rn Landagent landagent = new Landagent();rn HouseA houseA = (HouseA)landagent.BuildHouse("House A");rn rn //房子盖好后,参观房内的卧室,客厅,厨房,卫生间。rn houseA.Bedroom();rn houseA.Kitchen();rn houseA.Parlor();rn houseA.Toilet();rn rn //察看房子的装修。rn houseA.BedroomFitment();rn houseA.KitchenFitment();rn houseA.ParlorFitment();rn houseA.ToiletFitment(); rnrnrn//消费者B.rnpublic class BuyerB rn public static void main(String[] args) rn //找到房地产商,并告诉他,我要B型的房子。rn Landagent landagent = new Landagent(); rn Home houseB = landagent.BuildHouse("House B");rnrn //房子盖好后,参观房内的卧室,客厅,厨房,卫生间。rn houseB.Bedroom();rn houseB.Kitchen();rn houseB.Parlor();rn houseB.Toilet();rn rnrnrn//rnpublic class BuyerC rn public static void main(String[] args) rn //找到房地产商,并告诉他,我要C型的房子。rn Landagent landagent = new Landagent(); rn Home houseC = landagent.BuildHouse("House C");rnrn //房子盖好后,参观房内的卧室,客厅,厨房,卫生间。rn houseC.Bedroom();rn houseC.Kitchen();rn houseC.Parlor();rn houseC.Toilet();rn rnrnrn//房地产开发商.rnpublic class Landagent rnrn //根据消费者的选择,建造不同的房子。rn public Home BuildHouse(String houseKind) rn if (houseKind.equals("House A")) rn //建造A型房子。rn return new HouseA(); rn else if (houseKind.equals("House B")) rn //建造B型房子。rn return new HouseB();rn else if (houseKind.equals("House C")) rn //建造C型房子。rn return new HouseC();rn else rn return null;rn rn rnrnrn简单工厂模式的特点:rn工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。rn但是,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。rn 论坛

《“垃圾回收”之我见

04-21

http://www.visual-graph.comrnrn我一直搞不懂为什么会出现垃圾回收这种技术。直到最近。rnrn以前我以为自己用标准的ActiveX接口编写的控件一定能够适应不同的编程语言,结果在不同的语言中却发生各种奇怪的现象。rnrn首先,为了让vb能够识别我的类库对象,我的属性类型不能是IDispatch的派生类,而必须是IDispatch,vb才能识别,这样我知道,vb原来是后期绑定,它只对Variant这种变体操作,在运行中解释执行!rnrn这样就让某些使用其它工具的程序员有点小小的不爽,因为必须对对象做一个强制转换才行。但这是一种宿命,没办法,组件开发商必须这么做才能通用,因此,使用组件的程序员就只好将就一下了,好在这也不是什么繁琐的事情,仅仅是有一点点小小的繁琐而已。rnrn有些标准接口,如BSTR(宽字符串)是一定要在ActiveX中创建的(SysAllocString),但你不能释放它,释放是调用者做的事情。所有的编程语言都懂得要用SysFreeString这个函数用来释放你分配的BSTR字符串。所以我们不用担心自己分配的内存会不会造成内存垃圾。rnrn但是,对象就没有这么幸运了!我在ActiveX中建立的对象接口,当它被其他编程语言引用的时候,各种编程语言就开始乱来了!rnrnVC和VB要简单一点,只要在它应用你的对象时,增加这个对象的引用计数(AddRef)就可以了,VC和VB会自动释放它,通过减少一个引用计数(Release)来完成匹配。rnrnDelphi呢?基本上也是这样的,之所以说基本上,是因为在某些特殊的地方它却不会自动减少一个引用计数。这种情况在你引出的对象是一个属性的时候有时候会发生,但我目前还没发现究竟是哪些特殊的情形!(vc里面没有属性的概念)rnrnC++Builder最糟,靠,它绝对不会在引用你的对象之后减少一个引用计数!所以,使用这种语言,引用ActiveX对象的时候,就会出现内存垃圾!rnrn我这里强烈建议使用C++Builder的程序员,当你使用别人的ActiveX控件访问它的对象的时候,你一定要看看内存有没有泄漏!我真的很怀疑!rnrn我的产品是一个ActiveX控件,它要被应用在不同的编程语言中,可是却在C++Builder和Delphi中出现了内存的麻烦,怎么办?rnrn为了对付这个头疼的问题,我决定迁就Microsoft,让我的ActiveX控件在VC和VB中间自如地使用,而不出现内存问题。虽然我的程序是用C++Builder开发的,但我还是觉得Microsoft的产品虽然比较笨,但它确实够标准。Borland为了让程序员高兴,接口中有很多实用化的简单的东西,但却不够标准,只有Borland自己的开发工具能够充分利用这种“非标准化”带来的特殊好处。rnrn于是,我只好在ActiveX编写中添加了自己的“垃圾回收”机制。rnC++Builder和Delphi不是不能自如地释放某些对象内存吗?rn我便把那些没有释放的内存管理起来(我的程序当然知道哪些对象还没释放),在某些时刻清理一遍。rnrn所幸运的是,由于我的对象特别特别小(每个对象最多只有8字节),这种清理工作,我放到了程序退出的时候进行,应该没有问题了。作为一个程序员,我真的无法容忍任何内存泄漏,哪怕只有几个字节!rnrn呜呼!Microsoft 的.net技术就是为了兼容各种不同的编程语言,所以我怀疑垃圾回收技术的出现就是因为不同公司的编程语言在接口方面出现不兼容问题,欲寻求解决办法而出现的!rnrn是不是这样?我也不敢肯定!rnrn其它内容,请登陆http://www.visual-graph.comrnrn 论坛

没有更多推荐了,返回首页