浏览 1824 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-25
最后修改:2011-01-25
这个格式不好看,可以下载wps 文件格式来看
前言 ESB 和 SOA ,曾经,大约2年前,也了解过一点点,只能说是了解,而且只是一点点,因为除了使用过WebService ,任何SOA和ESB产品我都没有去用过,也没有研究过其实现方式。 所以,我的论调是很有不正确的可能性,这无关紧要的,错误的观点,可可能很有价值,也可能很有力量。 接下来, 我会先阐述一下,软件技术,或程序语言发展的缘由,再引申出 SOA 和 实现SOA的前提, ESB。 在取一个接口编程规范的例子, 这个例子我以前在JavaEye在发过,不过帖子里面和别人争论的太厉害,被和谐掉了。这个例子虽然和SOA没有什么瓜葛,却和SOA具有同样的胸怀。 翻页。。。 IT,从汇编语言谈起 这个时代写程序不是一般的艰巨任务,所有的功能都由非常细粒度的指令组成,一个循环,也要几10行代码,能完成排序的程序员都是高手。每一个功能的代码,都是高度依赖它前面的代码,和后面的代码,以及代码的组织方式的,依赖即耦合,所以这个时代的耦合度是最高的。 好了,现在到了 C的时代了,即使是现在,C这门高度严谨的程序语言都没有成为过去式。它的出现,绝对且巨大的改变了前面的情况,因为它,对常用的逻辑进行了封装,在很大程度是接除了耦合,因为你现在要写循环, 你只需要书写循环的语法就是了,你不需要去Copy以前的实现循环的代码。 更厉害的是,它有了函数这个牛逼的东西,你完成一项任务的的时候,只要调用这个函数就Ok了。 它又进一步的解除耦合了。 看到这里,你可能没有兴趣看下去了。这和SOA什么的能有什么关系呢?耐心一点,还真的非常的有关系,或者说是共同点。 好了,现在是面向对象的时代了,这比C封装的更厉害,它提出了类这种东西, 把 相互之间有关系,或者是联系的方法和数据 封装在一起(这就是面向对象的本质)了。以前面向的是过程,完成一个系统, 需要定义一大堆的全局变量,然后需要组织好之间的关系,函数的复用率很低下,因为,他们可能要依赖到全局变量,在缺失同样的全局变量的环境中,函数无法正常的执行,也就是说,耦合程度还是非常的高。 这样看来, 面向对象是一种石破天惊得编程策略。 而且,面向对象还不止这些,它能改变以前的思维方式,以现实世界的实物看思考软件中的虚拟事物。 到了这一步,我们才能说,软件都是一个虚拟世界,而它虚拟的是现实世界。 程序语言,最高级,就是面向对象的,但是, 这不是IT的终点。 我们开始思考,把不同系统中的共同功能,开发成为便于复用的模块, 然后以后无需再次开发,直接使用,这样很容易,于是又了中间件,有了面向组件的编程, 有了EJB等。但是可复用不是那么容易的,可以说世界上没有什么组件是无条件可复用的,而且要进行复杂的配置,花时间去学习,这注定了,这只能是走向灭亡的垃圾解决方案。EJB的臭名昭著说明的问题,他没有带来效率,而是降低的效率,用最大的代价,获得最微小的收获。所以,和人认为,中间件,大多是丑陋的。 接下来,IT重回正道, 这一次,将会和互联网的出现一样改变世界,当然,这是在若干年后。 这就是面向服务, 例如WEB Serive,功能以服务的形式来提供, 只要我们遵守共同的协议(SOAP). 这样,我在使用同样的功能的时候, 无需依赖特定的类库,和环境,我们不一定要用同样的编程语言, 无需去部署这样的功能,我们只要访问这个Service来调用这个功能就OK了。 这样系统开发,又从部署和,配置,包依赖,工具,调试的耦合中解脱出来, 它完成了面向对象以后的再一次强大解耦。 再一次飞跃。 好了,看到这里要SOA了,如果前面的,都不知道,也看不懂,那你没有办法SOA。 一般的面向服务,还不是终点。 SOA,即面向服务的架构,是方法而不是产品,SOA是超级面向服务。他要对一般的面向服务再次解耦和封装。 我们前面说过了, WEB Serive 这样的面向服务,我们要遵守SOAP协议才能工作,soap service的Client 无法访问 JMS 协议和RMI协议的Service, 而SOA 则要让这样的情况成为可能。SOA号称无论你使用什么样的协议,都能够正常的使用服务。 SOA: -1,功能是由服务的形式提供给你的。 0,算法是由服务的形式提供给你的。 1,软件是由服务的形式来提供给你的。(SAAS) 2,开发平台是由服务的形式提供给你的。(PAAS) 3,XXX,一切的一切,明天的明天的明天,都是以服务的形式 提供给你的。 4,无论你使用什么技术,都能调用Service。 5,无论你如何格式,都能使用Service。 6,无论你使用什么样的协议,都是使用Service. SOA 试图做到上面说的一些,ESB 是其中的一环。 当你访问一个服务的时候,你并不是直接调用服务, 因为,你的调用协议,可能和服务的协议不一致,那怎么办呢。这些杂七杂八的事情全部给ESB来解决, ESB就是企业级服务总线,你访问时直接访问ESB,ESB相当于网关,它这样工作: 1,它会分析你的协议,确定你要访问的服务 2,然后,将你的请求,用目标服务的协议来重新表达你的请求,然后调用服务, 3,服务的响应也响应给ESB, ESB确认调用端, 再把响应转换成调用端的协议数据,返回给调用端,这样就解耦了协议 我们还可以这样来看待 ESB, Client 是中国人,法国人, 而Servcie是美国人,俄罗斯人, 所以,client 和Servcie 无法沟通, 而ESB是 精通所有语言的大师, Client 将请Service 做事情告诉ESB,ESB向Service传达,并将结果反馈给Client. SOA 之道: SOA 解决这些事情,超越 web service,甚至一度成为最先进的理念和思想,方法非常简单。只有一个。 包容一切, 则超越一切。 接下来, 我用几个类, 描述接口的正确使用方式,诠释 因为包容一切,所以超越一切。 虽然不是SOA,却理念一致,殊途同归! 这是万能播放器, 暴风影音的实现方式,简单的难以置信,大道至简。 在远古时代,只有专用播放器, mp3文件只能由mp3Player 播放, mpg文件,只能由mpgplayer播放, wav文件 只能由wav播放器播放,但是后来出现了暴风影音,所有文件,它都可以播放,它是最强的播放器。 // 这个接口表示可播放文件,如mp3,avi,mpeg interface PlayableFile { public String getData();// 返回内容数据 } // 这是播放器接口 public interface Player { public void play(PlayableFile file);//播放文件 } 下面是播放文件具体实现 // 这是Mp3文件 class Mp3 implements PlayableFile{ public String getData() { return "我是MP3..."; } } //这是Avi文件 class Avi implements PlayableFile{ public String getData() { return "我是Avi..."; } } //这是Mpeg文件 class Mpeg implements PlayableFile{ public String getData() { return "我是Mpeg..."; } } 下面是播放器的具体实现 // 只能播放Mp3文件的Mp3播放器 class Mp3Player implements Player{ public void play(PlayableFile file) { if(file instanceof Mp3){ System.out.println("播放 > "+file.getData()); }else{ System.out.println("格式不支持"); } } } //只能播放Avi文件的Avi播放器 class AviPlayer implements Player{ public void play(PlayableFile file) { if(file instanceof Avi){ System.out.println("播放 > "+file.getData()); }else{ System.out.println("格式不支持"); } } } //只能播放Mpeg文件的Mpeg播放器 class MpegPlayer implements Player{ public void play(PlayableFile file) { if(file instanceof Mpeg){ System.out.println("播放 > "+file.getData()); }else{ System.out.println("格式不支持"); } } } 最后是暴风影音, AllPlayer的实现 // 实现暴风影音,完成播放器 class AllPlayer implements Player { // 保存所有播放器 private Map<Class<?>,Player> map=new HashMap<Class<?>,Player>(); public AllPlayer() { map.put(Mp3.class, new Mp3Player()); map.put(Mpeg.class, new MpegPlayer()); map.put(Avi.class, new AviPlayer()); } public void play(PlayableFile file) { map.get(file.getClass()).play(file); } } 代码调试 AllPlayer player=new AllPlayer(); player.play(new Mp3()); player.play(new Avi()); player.play(new Mpeg()); new Mp3Player().play(new Mpeg()); 结果: 播放 > 我是MP3... 播放 > 我是Avi... 播放 > 我是Mpeg... 格式不支持 结论:暴风影音如何做到超越其他的播放器, 只需要包容所有的播放器就是了, 包容一切,超越一切,我中有你,自然胜过你。 在这点上,和SOA的宏观架构方式是一样的,SOA就是包容所有的协议,技术来超越其他技术的。 但是一切只是理想。。。其实还没有真正的SOA。 这个格式不好看,可以下载wps 文件格式来看 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |