分析分布式服务框架

出处:http://www.cnblogs.com/zhangs1986/ 

技术是为需求而服务的,分布式服务框架也同样如此,它不是凭空诞生的,也是因为有这样的需求才会有分布式服务框架这么样的东西诞生,在这篇blog中来详细的分析分布式服务框架诞生的原因(其实也是需要用分布式服务框架的应用场景,这里隐含的意思就是并不是什么应用都需要分布式服务框架的)、分布式服务框架需要提供的feature以及实现这些feature可选的技术方案。
其实这篇blog应该写在实现分布式服务框架系列blog之前,:),不废话了,来看为什么会需要分布式服务框架,在一个不断发展的大型应用中,系统的业务和功能不断的增加,同时技术在不断的发展、团队在不断的变化,很容易造成的现象就是:各个子系统、模块实现的技术五花八门,部署时各子系统的方式和要求不同,各个子系统之间的交互方式和方法不统一。这种现象带来的问题就是整个系统感觉很混乱,不过技术毕竟是不断的发展,因此各子系统、模块的具体实现技术要完全限制应该是不太可能的,也没必要,但会希望系统对外提供的功能能采用统一的部署以及交互方法,这样的话每个子系统能保持其黑盒的实现方式,其他子系统不想也不需要关心它的实现方式,只需要能够统一的方式调用到它们提供的功能就可以了,这是出现的第一个需求。
起初整个应用部署在一台机器上,但随着系统的功能越来越多,不得不不断的增加机器以减轻服务器的压力,但很快就出现瓶颈,不得不把应用分层部署,这样可以撑一段时间,在撑过一段时间后发现再度出现瓶颈,于是希望能够再度的把系统进行划分,这个时候就变成了希望能够以非常细的粒度来部署了,而不是把一堆的功能都部署在同一台机器上,这样带来的好处是系统的重用性能够再度的增强,服务器的压力能够有效的降低,使得系统可以以较低的成本继续保持Scable(就像google),其实这也是ebay的演变过程,大家可以去看看那个著名的ebay架构演变的PPT,还有一篇中文的ebay是怎样炼成的。
从上面的需求场景描述中可以看出,需要分布式服务框架的场景并不是很多,这里还有一种场景没去提及,那就是对于一个大型企业而言,由于需要用到的软件多种多样,其实也是有分布式服务框架的需求的,但还是有些不同,因为要去满足那种场景的方法可以更为简单。
分析下分布式服务框架的应用场景,可以得知,分布式服务框架的诞生目的主要有两个:
1、约束需要对外提供的功能,保证其以一个统一的方式来对外提供和获取;
2、分布式的部署细粒度的功能。
在确定了这两个目的后,来详细的分析下为了达到这两个目的,需要提供些什么feature。
要约束对外提供的功能,保证以统一的方式来对外提供和获取,首先需要制定的标准是功能到底以什么方式来对外提供,这里首先诞生了服务这个很好很形象的名词,对外提供的功能其实也就是为别人提供的服务了,那么服务里到底有些什么呢,面向接口自然是首选,所以服务都以接口方式来提供,另外可能就是会有一些服务的元信息了,如服务的名称、描述、依赖、所在机器等等;接着要完成的就是如何把各子系统对外提供的功能定义成服务呢,这里要求分布式服务框架能提供强大的集成能力,例如子系统是采用spring来实现,那么就需要支持能把spring的bean直接定义成服务;定义服务完成了,这个时候要解决的问题就是其他的子系统怎么知道有这些服务的存在呢,因此需要提供一个统一的服务的注册中心,同时相应的带来的问题就是各个服务应用端怎么来查找这些服务,怎么调用这些服务,这也是分布式服务框架需要解决的,在提供了上面的这些feature后,第一个需求就可以基本实现了。
分布式的部署细粒度的功能,这个在第一个需求达成的情况下,直接就可以实现了,因为分布式服务框架对服务应用端的粒度并没有要求,可粗可细,只是分布式的部署细粒度的功能其实潜在的带来了另外的需求,那就是怎么样把这些细粒度的服务直接组装来满足业务的需求,这也是分布式服务框架应该提供的功能;同时,还要注意的一点是,当变成细粒度的分布式部署的场景时,系统的稳定性和性能是会受到影响的,对于大型应用来讲这两点偏偏又是非常重要的,分布式服务框架需要对此进行考虑。

.......................................................咖啡一杯,休息一下.......................................................

继续,上面分析完毕后产生了分布式服务框架的基本Feature,来总结看看,并同时对其进行可选的实现技术的分析:
1、服务模型
      在服务模型中需要详细定义服务模型包含了哪些信息,而这些信息也就决定了服务在发布时需要提供的信息,同时也是为服务查找和调用提供的信息。
2、服务的注册中心
      服务的注册中心在分布式服务框架中充当的就是服务信息的存储场所的作用,同时它还需要提供的一个重要的功能就是查找服务,这两个最重要功能最重要的就是稳定、高效以及支持Cluster。
      存储服务信息上可采用数据库存储、分布式文件系统存储等,查找服务需要的就是支持高效的查找,这个要根据服务的查找方法等来建立相应的缓存和索引,这里需要注意的是在cluster情况下的处理,选用数据库存储或分布式文件系统存储自然是不会有cluster的问题的。
      另外一个需要确定的就是服务应用端怎么调用服务注册中心提供的管理接口,可采用的技术有JNDI、JMS、WebService等等N多种实现方式,可以根据具体的性能要求、实现方法、需求等来进行选择。
      从扩展方面去看,服务的注册中心应该提供多种服务应用端和注册中心的交互协议的选择、扩展。
3、发布服务的方式,支持Spring、EJB3等等
      支持直接的把服务应用端的功能发布为服务,发布的方式更多的是xml、annotation等方式,就是一种很不错的设计,所以要根据服务应用端采用的技术而定,常见的如spring、EJB,这个完全根据分布式服务框架所面对的应用场景而定,如果你的服务应用端都是基于Spring的,那么就可以暂时只提供Spring的方式了。
      注册服务方面的技术基本也不用选择,因为它其实是根据服务应用端采用的技术而决定的,相当于提供一个集成的接口而已,由此接口去完成和服务中心的交互。
      但这里有个关键的实现技术需要选择,就是把服务以什么方式对外提供,例如有JNDI、Webservice、JMS等等,就像Spring中的HessianServiceExporter,这里需要的是服务框架本身支持好这些协议,至于到底要实现多少种也是根据需求来看了,而各种协议的实现可以选用协议对应的成熟产品,如jndi有jboss jnp,也可以自己根据需求实现。
      也许在spring中我们可以这么来发布service:
      <hsf:service>
              <ref bean="Spring Bean"/>              
              <metainfo:jndi server="" interface="服务接口名" name="简要名称" desc="服务功能描述"/>
              <!--以jndi的方式对外提供-->
              <publish:jndi server="">
                        <property name=""></property>
              </publish:jndi>
              <!--以hessianservice的方式对外提供-->
              <publish:hessian server=""/>
              <!--以jms的方式对外提供-->
              <publish:jms server="" queue=""/>
      </hsf:export>
4、查找服务和调用服务的方式,支持Spring、EJB3等等
      查找服务和调用服务方面,需要做到的就是能够让服务应用端透明的使用远程的服务,所以其实也是和服务应用端采用的技术相关的。
      当然,它本身需要提供以各种协议和服务中心通讯,以各种协议调用远端服务的支持,另外就是同步、异步的支持等,还需要从高效性去考虑。
      对于使用者来说则比较简单,也许在Spring中我们可以这么来调用远端的service:
      <bean id="loginService" class="HSFObjectFactoryBean">
              <hsf:service>
                      <import:jndi server="" interface="">
                              <!--可用于过滤查找的服务-->
                              <property name=""></property>
                      </import:jndi>
              </hsf:service>
      </bean>
5、服务的组装
      服务的组装需要提供的就是将服务中心的服务进行组装,以实现复杂的业务需求,这里面需要包括容错等等的支持,同样,高效性也是这里面的重点。
      可选用的技术有采用事件框架、jbpm等。
6、稳定性和性能
      通常来讲,需要用到分布式服务框架的应用在稳定性和性能方面都会有很高的要求,当然,稳定性更多的是通过避免Single Point的方式来提供,但同时软件层面也应该尽量避免无谓的错误,从技术角度上来讲可以采取fail-fast的思想来实现。
      性能方面,需要根据使用时的压力情况来决定,如查找服务时太慢,需要考虑提升服务中心查找服务的效率,增加索引,使用分布式存储等等都是可采用的方式,提升性能的方面其实可采用的方案是非常多的,但每种技术几乎都是需要非常专业的人才去实现的。

    上面分析的feature只是分布式服务框架的基本feature了,一个强大的分布式服务框架的话实现的东西会比这个多很多(例如提供服务管理端、监控端、IDE等),不过主要会是细节上,在具备了这些基础feature的情况下,细节就决定了高低了,:)。
分布式服务框架的引入也许会降低些性能,但应用的适当的话,则能充分发挥服务器性能,并且很大程度的降低系统Scable的成本,至于开发效率的话我不觉得是分布式服务框架需要解决的问题。
服务框架其实对于所有应用而言几乎都是需要的,而且非分布式的服务框架可选的是有很多的,但分布式服务框架可选的目前基本是没有,所以如果不是应用真的需要,没有必要去实现分布式服务框架(就像在企业应用模式里Martin Fowler讲的一样,尽量不要分布式,:)),因为分布式服务框架对于技术层面还是有挺高的要求的,说简单点呢,就是高效的存储、查找策略+高效的通讯策略+满足需求的服务模型+强大的集成能力构成了分布式服务框架的核心技术实现。

ps:在写完这篇blog后,发现自己在基于OSGi实现分布式服务框架(四)里面写OSGi不适合其实是个不准确的词,因为在服务的应用端其实是可以采用OSGi的,不过以分布式服务框架而言,OSGi是没有什么适用的场景,除了服务模型可参考外,但在服务应用端而言,OSGi仍然是个很好的选择。

原文引自 http://www.blogjava.net/BlueDavy/archive/2008/01/24/177533.html

转载于:https://www.cnblogs.com/firejava/p/6424494.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PL/SQL注册码

code:j6stndb9tk72xfbhbqczcdqnjd8lyj466n number:882851 ps&#xff1a;xs374ca转载于:https://www.cnblogs.com/myblogslh/p/4203173.html

递归--基于回溯和递归的八皇后问题解法

八皇后问题是在8*8的棋盘上放置8枚皇后&#xff0c;使得棋盘中每个纵向、横向、左上至右下斜向、右上至左下斜向均只有一枚皇后。八皇后的一个可行解如图所示&#xff1a; 思路 对于八皇后的求解可采用回溯算法&#xff0c;从上至下依次在每一行放置皇后&#xff0c;进行搜索&a…

matlab emf 读取,20140219-Emf_Demo EMF 矢量图 可以读取和保存EMF 的封闭类 非常实用 matlab 238万源代码下载- www.pudn.com...

文件名称: 20140219-Emf_Demo下载收藏√ [5 4 3 2 1 ]开发工具: Visual C文件大小: 6312 KB上传时间: 2014-07-10下载次数: 2详细说明&#xff1a;EMF 矢量图 可以读取和保存EMF矢量图的封闭类非常实用-EMF EMF vector can read and save the class very useful vector cl…

orcale 之 集合操作

集合操作就是将两个或者多个 sql 查询的结果合并成复合查询。常见的集合操作有UNION(并运算)、UNION ALL、INTERSECT(交运算)和MINUS(差运算)。 UNION UNION 运算可以将多个查询结果集相加,形成一个结果集, 其结果相当于集合运算的并运算. UNION 可以将第一个查询结果的所有行与…

PDFMate PDF Converter Pro

http://www.pdfmate.com转载于:https://www.cnblogs.com/scgw/p/4203999.html

linux 广播

广播是一台主机向局域网内的所有主机发送数据。这时&#xff0c;同一网段的所有主机都能接收到数据。发送广播包的步骤大致如下: (1)确定一个发送广播的接口&#xff0c;如eth0 (2)确定广播的地址&#xff0c;通过ioctl函数&#xff0c;请求码设置为SIOCGIFBRDADDR得到广播的地…

thinkphp5.1 php7,空白目录 · 细数ThinkPHP5.1.7版本新特性 · 看云

>[danger] 官方已经在前不久发布了ThinkPHP5.1.7版本&#xff0c;5.1版本相较于5.0版本而言&#xff0c;本身更加严谨和规范&#xff0c;更接近主流设计思想。近半年来&#xff0c;5.1版本更新频繁&#xff0c;此次最新版本更是带来了很多的新特性。正在或者打算使用5.1版本…

JS中popup.js

为什么80%的码农都做不了架构师&#xff1f;>>> //popup class 显示弹出窗口&#xff0c;。/*以下为使用popup对象&#xff0c;传入相应的配置参数&#xff0c;弹出不同类型的窗口 function ShowIframe() //显示iframe { var popnew P…

图像连通域标记算法研究

搬以前写的博客【2014-03-01 08:09】 图像连通域标记算法研究 ConnectedComponent Labeling 最近在研究一篇复杂下背景文字检测的论文。 “Detecting Text in Natural Scenes with Stroke Width Transform ” CPVR 2010的文章&#xff0c;它主要探讨利用文字内…

lightoj 1214

lightoj 1214 Large Division &#xff08;大数除法&#xff09; 链接&#xff1a;http://www.lightoj.com/volume_showproblem.php?problem1214 题意&#xff1a;给定 a&#xff0c; b 两个数&#xff0c;判断 a 是否整除 b 。&#xff08;a 为 大数&#xff09; 思路&#…

二阶振荡衰减 matlab,基于Matlab/Simulink的二阶控制系统仿真研究

1 二阶控制系统模型本文引用地址&#xff1a;http://www.eepw.com.cn/article/201612/328597.htm能够用二阶微分方程描述的系统称为二阶控制系统。在控制工程实践中&#xff0c;二阶控制系统十分常见&#xff0c;例如&#xff0c;电枢控制的直流电动机&#xff0c;RLC网络和弹簧…

CCF201409-5 拼图(30分)

试题编号&#xff1a; 201409-5 试题名称&#xff1a; 拼图 时间限制&#xff1a; 3.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述给出一个nm的方格图&#xff0c;现在要用如下L型的积木拼到这个图中&#xff0c;使得方格图正好被拼满&#xff0c;请问总共有…

欧几里得算法(即辗转相除法)的时间复杂度

本文是参考新浪博客而写。 欧几里得算法, 又称辗转相除法, 用于求两个自然数的最大公约数. 算法的思想很简单, 基于下面的数论等式 gcd(a, b) gcd(b, a mod b) 其中gcd(a, b)表示a和b的最大公约数, mod是模运算, 即求a除以b的余数. 代码如下: #include <iostream> #i…

UIImageJPEGRepresentation和UIImagePNGRepresentation

在Iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需要图片引用作为参数.通过在实际使用过程中,比较发现: UIImagePNGRepresenta…

C++ 0x

转载于:https://www.cnblogs.com/iiiDragon/p/3230006.html

系列文章----.Net程序员学用Oracle系列

.Net程序员学用Oracle系列(18)&#xff1a;PLSQL Developer 攻略.Net程序员学用Oracle系列(17)&#xff1a;数据库管理工具(SQL Plus).Net程序员学用Oracle系列(16)&#xff1a;访问数据库(ODP.NET).Net程序员学用Oracle系列(15)&#xff1a;DUAL、ROWID、NULL.Net程序员学用Or…

Github for Windows使用介绍

Git已经变得非常流行&#xff0c;连Codeplex现在也已经主推Git。Github上更是充斥着各种高质量的开源项目&#xff0c;比如ruby on rails&#xff0c;cocos2d等等。对于习惯Windows图形界面的程序员来讲&#xff0c;Github的使用是需要点时间和耐心的&#xff0c;然而最近Githu…

matlab中udt函数,《MATLAB信号处理超级学习手册》——2.5 离散时间信号中的运算...

本节书摘来自异步社区《MATLAB信号处理超级学习手册》一书中的第2章&#xff0c;第2.5节&#xff0c;作者&#xff1a;MATLAB技术联盟 , 史洁玉著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看2.5 离散时间信号中的运算MATLAB信号处理超级学习手册2.5.1 离散…

iOS 将16进制颜色转换成UIColor

很多地方我们都使用16进制颜色&#xff0c;但iPhone使用的是UIColor对象&#xff0c;不直接支持16进制颜色&#xff0c;为此&#xff0c;需要我们手动将16进制颜色转换为UIColor - (UIColor *) hexStringToColor: (NSString *) stringToConvert {NSString *cString [[stringTo…

OBJ 文件格式

OBJ文件是一种标准的3D模型文件格式&#xff0c;很适合用于3D软件模型之间的互导。比如在3dsMax或LightWave中建了一个模型&#xff0c;想把它调到Maya里面渲染或动画&#xff0c;导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写&#xff0c;不过…