@mircode
2016-11-26T01:42:17.000000Z
字数 5248
阅读 848
OSGI
模块化
分布式
柔性软件
随着科技的发展,计算机深入到人们日常生活,工作,学习各个方面。社会信息化程度在不断提高,然而复杂多变的需求,对软件的设计和架构都提出了前所未有的要求。那么一个软件设计才能解决复杂多变的需求呢?针对这个问题,业内也建立起了一整套的软件设计、开发和维护的规范。但是针对于复杂多变的需求,存不存一个自始至终的设计原则呢?本文通过对计算机操作系统以及计算机网络的研究,总结出一个通用软件开发模式。
操作系统应该是软件史中,最浓厚的一笔。无论人们的需求如何变化,计算机操作系统,始终能够为人们提供服务。之所以能够适应人们的需求变化,一方面与操作系统良好的分层体系以及无限的软件拓展能力有关。在软件设计中,为了能应付用户复杂多变的需求,就需要软件本身能够支持拓展,即为我们的软件提供插件的机制。对于操作系统来说,应用程序就是系统的插件。操作系统为软件提供了运行环境,而软件满足了用户多变的需求。同样的,要使我们的软件能够动态的满足用户需求,在设计软件的过程中。我们就需要分两方面设计,一个是软件的内核,一个是基于内核之上运行的各种插件,也可以叫做模块。内核为软件的各个模块提供了运行环境。通过抽离出软件的内核部分,就使的软件中的模块,可以在相同内核环境下,自由复制运行。极大提高了软件的复用性。针对于软件模块化,已经有了很好的规范,其中OSGI模块化标准,能够支持模块的安装,卸载,运行等操作。当用户需求发生变化时,我们只需要编写新的模块或者更新原有模块,然后在软件内核上安装运行即可。不会对已运行模块造成影响,实现了滚动升级的特性。
如果说操作系统是最好的软件的话,那么计算机网络无疑为软件打开了无限的空间。计算机软件,也经历了单机软件,C/S架构的软件,到现在广泛的应用的B/S架构。这时候就需要我们的软件,能够在多台计算机上运行,模块之间能够分布式调用。一个软件,如何拓展到多台计算机上,协同运行呢?OSGI最初的提出是针对移动和嵌入式开发的,OSGI虽然提出了软件模块化的的标准,但是并没有对模块分布式环境下,如何调用制定很多标准。将OSGI应用于Web开发,仍然面临着很多问题。
本文诣在解决两个问题,一方面如何通过OSGI最大化软件柔性,另一方面,OSGI如何在Web分布式环境下运行。
1、软件危机依旧存在,用户需求依旧多变,可是现有软件很难满足用户多变的需求。通过采用内核和模块隔离的做法,因为模块可以动态安装运行到内核上,就为满足用户多变的需求,提供了可能。因为采用统一的内核标准,可以很方便的安装和移值第三方的开发的模块到自己系统,就像为操作系统安装软件一样简单。
2、随着计算机网络发展,对软件的设计与开发也提出了新的考验。现有软件设计体系中,很少有涉及网络环境下一个软件所面临的问题,以及软件如何设计。本文探索了OSGI软件模型,在分布式环境下的所需要考虑的问题。
总体来说,软件发展至今,软件危机仍然存在,虽然各种软件设计理论很多,但是始终没有一个最优的解决方案。通过抽象操作系统以及计算机网络,提出软件开发所遵循的模式。能够最大程度上,为软件设计提供一种通用的模式。
目前国内外针对OSGI实现Web软件模块化研究,主要停留在如何改善单机环境,如何模块化一个软件。但是Web软件,不同于传统桌面软件。Web软件往往由于庞大的用户访问量,需要多节点部署,各个节点需要协同工作。而OSGI针对于此,并没有提供太多标准。而模块化软件,是开发和维护一个软件很重要的手段,研究软件的各个模块,如何在分布式环境下运行,对OSGI在Web开发中的应用具有积极意义。
现有OSGI在Web环境下的应用,只是提供了模块之间的通讯和负载的能力。但是对于Web软件,需要更多策略来支撑一个稳健的服务。比如,故障恢复,滚动升级,并发控制等。所以本文重点讨论了OSGI的各个模块,如何最大限度的提升Web软件的柔性度。
抽离软件的资源和基础模块作为软件的内核,如:日志模块、存储模块(数据库)、缓存模块、网络模块(路由)等。其他业务模块,如权限模块,用户模块,业务模块等都依赖于内核模块。不同节点的模块,通过各自的网络模块进行通讯。
[系统图和软件图]
1、内核和模块分离
将基础模块封装成内核,为业务模块提供一个统一的运行平台。这样可以将模块平滑的迁移到其他节点。
2、分布式环境下模块路由
在现实环境中,我们通常需要借助路由器,来完成不同计算机的通讯。在分布式环境下,我们同样需要构造出一个路由模块,来完成分布在不同的节点的模块之间的通讯。同时,会实现一个类似DNS服务器的模块,来实现模块之间基于命名的调用,屏蔽掉IP变动的问题。
3、分布式环境下模块如何动态扩容
在分布式环境下,一个模块往往有多个实例,运行在不同节点。当增加计算机点时,我们可以动态的将模块运行在新的节点,而不影响其他模块。
4、分布式环境下模块负载均衡
分布式环境下,一个模块拥有多个实例,在调用各个模块时,可以提供不同的负载策略,来均衡模块的访问压力。
6、分布式环境下模块并发控制
每个系统都有自己的承载能力,当访问量到达一定程度之后,我们需要提供一种机制,能够控制模块的调用量,来防止系统瘫痪。
7、分布式环境下模块故障恢复
分布式环境中,节点可能存在故障,造成某个节点上的模块,暂时无法访问。这时候,我们需要将对应节点上的模块,迁移到其他节点上。实现,故障恢复。
8、分布式环境下模块滚动升级
因为用户需求的多变,软件的迭代周期很短,上线频繁。这就需要我们针对软件的模块,能够做到平滑升级,并且当发生错误时,能够自动回退到上一版本。
1、模块在分布式环境下如何路由
对于一个分布式软件来说,首要解决的问题,就是通讯问题。对于OSGI来说,软件被切分为各个模块,那么模块之间的如何路由就成了首要解决的问题。在路由的基础之上,可以实现模块的负载均衡和并发控制,以及动态扩容问题。
2、模块在分布式环境下如何故障恢复
因为软件的各个模块分布在网络的各个节点中,那么就会存在网络中某个节点不可用的情况,在这种情况下如何能将故障的节点上的模块,转移到故障节点是对一个软件持续运行能力的重要考验。
3、模块在分布式环境下如何滚动升级
面对用户多变需求,软件如何平滑的进行模块的升级。以及如果模块升级失败,软件如何做到自动回滚。
1、采用路由表的方式,存储模块在分布式环境中的信息。并通过DNS的方式,屏蔽掉节点IP。基于路由表,实现对模块的负载策略。同时路由表也维护着模块的实例数和最大并发。
2、通过心跳检测的方式,检测模块是否存在故障。如果一段时间内,没有收到节点的上报信息,那么就会通过请求控制模块,创建新的实例。
3、版本升级,采用逐个替换,渐进升级的方式。
1、模块路由
通过 Map<String,List>
保存模块命名空间和模块配置信息。
其中模块配置信息,主要包含:
模块名称:DNS功能
节点IP:IP1,IP2,IP3
负载策略:轮询|权重
实例数量 : 3
最大并发 : 100
模块版本:v1
模块启动时,向路由模块,发送模块信息,如当前主机IP,模块名称等。同时路由模块,会向调度模块发送请求。调度模块,会在集群其他节点启动对应的实例数目的模块。
其他模块访问目标模块的时候,会得到模块的节点IP以及负载策略,如果是轮询的策略的话,就依次轮询调用IP1,IP2,IP3进行模块的访问。若是节点IP配置了权重,则通过权重计算之后,调用目标模块。
当一个模块被访问时,改模块会检测当前的调用数,如果调用数大于并发量了,则抛弃本次请求。
模块版本号,用于控制模块的滚动升级操作。
2、模块故障恢复
因为模块所在的节点,可能会发生宕机,或网络中断等,造成模块不可访问。此时,就需要一种机制,能够在其他节点,创建并运行对应的模块。
为了能即使检测到模块所在的节点发生宕机或者网络不可达,就需要各个模块,向路由模块发送心跳检测。如果路由模块,一段时间内没有收到路由模块的心跳信息。那么路由模块,就会向调度模块发送请求。调度模块,会在集群其他节点启动该模块的新的实例。从而保证模块实例数目不变。
这里可以通过NFS方式创建模块的仓库,供各个节点共享。这样,控制节点就可以直接在目标机器上,启动新的节点。
3、模块滚动升级
当模块版本发生改变时,系统不会停掉所有对应模块的实例,而是会逐个替换,然后经过delay时间段,再次替换下一个节点。如果在delay时间段内,检测到系统异常,说明模块新版本存在问题。此时,系统能够自动回退到之前版本,从而做到系统平稳升级。
本课题的理论、方法和技术可行性体现在如下几个方面。
1、理论可行性
模块化,开发由来已久。而今针对于模块化,有很多成型的规范。如OSGI等,并且针对各种规范,各大软件厂商都有对应的实现。本文只是在模块化的基础之上,做了对软件内核和模块的划分。
虽然,模块化分布式式应用,还没有完善的理论依据。但是,解决分布式问题的方案却已经存在,只是没有应用于模块化的级别而已。所以,对于模块分布式所遇到的问题的解决方案,完全具有代表性。
2、技术可行性
针对于模块化,Java可以通过ClassLoader方便,实现模块的加载。并且模块和模块之间是隔离的,所以同时执行多个模块。
针对于模块的分布式部署和通讯,Java也有提供了很好基础规范,比如RMI等,可以很方便的完成Java类的远程调用。虽然,不是调用模块,但是模块却可以基于此,来实现和构建自己的远程调用方案。同样的,虽然没有现成的路由、容错、滚动升级的代码,但是机制本身并不复杂。所以,技术实习上,完全具有可行性。
1、提出软件内核和模块分离的构想
将软件开发过程中,公共的部分封装成内核。因为这一部分是最少变动的,同时为各个业务模块提供统一的接口。模块可以安装,卸载。像在操作系统中,安装和卸载软件一样。通过开发或者直接安装第三方的模块,达到系统能力的无限拓展,从而达到应对用户多变的需求。
2、提出分布式模块的构想
针对于模块分布式环境运行做了深入探讨,解决了诸如,模块之间如何路由,模块之间如何负载,已经模块的容错,升级等问题。
1、课程学习方面 经过研究生第一年的课程学习后,使自己的理论基础打的更加扎实,进一步开拓了自己看待问题的深度和广度。
2、文献资料查阅方面 确定研究方向的近一年来,老师和刘宣彤师姐提供了很多资料和想法,下载许多核心的期刊论文,通过认真研读国内外高级期刊文献,使本人对OSGI系统的相关技术和待解决问题有了深刻的认识和理解。
1、通过图书馆提供的期刊网、借书室、Internet等可以进行信息与资料的查询与检索。有一个学习氛围良好,互相帮助的课题组,提供了良好的学习环境。研究方向出自于课题组的国家自然基金,李晖师姐在移动端的内存研究方面奠定了基础。
1、模块之间调用通讯,需要大量通过路由模块。路由模块,可能发展为系统的一个瓶颈。需要一种合适的策略,能够减少路由模块的依赖程度。
1、在每个模块类内部,缓存一张路由表。如果路由信息发生变化,就通过路由模块将最新的路由信息,推送给每个模块。从而实现减少对路由模块访问的压力。
2016.3-2016.6
初始阶段:材料收集,吸收国内外相关领域的研究方法进展及相关缺陷。
认真研读相关文献,分析研究领域待解决的问题并进行深入研究,确定研究内容与目的。
2016.7-2016.10
深入研究阶段:设计模块路由和DNS查询模型、设计模块故障恢复模型、以及模块平滑升级模型
2016.11-2016.12
论文整理阶段:改写论文不合理部分,为答辩准备材料。
论文的最终撰写完成,参与答辩。