发明内容
本发明要解决的技术问题在于针对现有技术中的缺陷,提供一种云服务起源数据的捕获方法和装置,该方法关注服务状态和依赖的监控,通过捕获服务的执行状态和路径为云服务运维和管理提供技术支撑。
本发明解决其技术问题所采用的技术方案是:一种云服务起源数据的捕获方法,包括以下步骤:
1)根据服务框架和调用协议设计服务调用拦截器;
2)将服务调用拦截器内置在服务调用协议中;
3)当服务调用发生时,服务调用拦截器拦截服务调用请求,获得服务动态调用依赖关系,并标识每个任务的服务组合;
4)服务调用拦截器按照服务起源数据规范,根据获得的服务动态调用依赖关系和经过标识的每个任务的服务组合生成并输出起源日志文件;其中服务起源数据规范为一个9元组:
BasicProv(token,InvokingService,ServiceInvoked,location, elapsed time, timestamp, input, output, status);其中Token为一个32位的字符串,用于标识一个动态的组合任务;
InvokingService为服务调用者,也称为服务消费者,其数据格式为一个32位的字符串;
ServiceInvoked为服务被调用者,也称为服务提供者,其数据格式为一个32位的字符串;
Location为服务调用发生的位置,在云服务环境,为IP地址。
Elapsed time为服务调用的耗时,该耗时为从服务调用者的视角看,完成一次服务调用所需要的时间,包含了被调用服务的嵌套执行时间,其数据格式为一个8位的整型;
Timestamp为服务调用事件发生的时间戳;
Input为服务调用的输入参数,数据存储格式为32位的字符串;
Output为服务调用的输出数据文件,为一个XML对象,或者一个json数据对象;
Status为服务执行的状态,数据格式为一个布尔值,1表示成功,0表示失败。
5)将起源日志文件进行数据处理后,存储在云数据库中。
按上述方案,所述服务调用拦截器的设计方法包括以下步骤:
1.1)创建用于存储服务起源信息的文件;
1.2)服务调用者产生一个唯一的token值,作为识别服务动态依赖的标志;
1.3)创建用于读取并存储服务调用开始时间的参量;
1.4)创建用于读取和存储当前的IP地址的参量;
1.5) 创建用于存储所调用的服务名称的参量;
1.6)创建用于存储所调用的服务的入口参数的参量;
1.7)上述参量、文件和token值共同构成服务调用拦截器。
按上述方案,所述唯一token值根据时间和网卡产生。
按上述方案,在收集拦截器的信息过程中,采用拦截器和拦截器管理分离的方式,管理模块负责所有拦截的注册、日志收集和处理。
按上述方案,所述步骤3)中,通过服务调用请求获得服务动态调用依赖关系的具体步骤为:
3.1)解析服务调用协议的头部信息;
3.2)获取头部信息中的token值,并存储到本地线程变量中;
3.3)根据token值获得服务动态调用依赖关系。
按上述方案,所述步骤3)中,标识每个任务的服务组合的具体步骤包括:
3.4)选取具有相同数值的token的服务,该服务组合共同完成某个任务;
3.5) 根据任务形成的动态服务组合过程,可以通过token进行查询后,进行迭代运算得到每个任务的服务组合.
按上述方案,所述步骤5)中对起源日志文件进行数据处理包括: 读取服务起源日志记录,检查是否符合当前的服务起源数据规范。
按上述方案,所述步骤5)中对起源日志文件进行数据处理包括:
检查起源数据信息的完整性,丢弃不符合要求的数据,然后把符合要求的服务起源数据规范化,然后插入数据库;将起源日志汇聚和存储于云数据库。这种结构实现了采集的可扩展性。
按上述方案,所述步骤3)中服务调用拦截器拦截服务调用请求时,根据不同的服务调用频率,确定服务调用拦截器的拦截频率。
一种云服务起源数据的捕获装置,包括:
拦截器生成模块,用于根据服务框架和调用协议生成服务调用拦截器;
拦截器内置模块,用于将服务调用拦截器内置在服务调用协议中;
数据收集模块,用于当服务调用发生时,服务调用拦截器拦截服务调用请求,获得服务动态调用依赖关系,并标识每个任务的服务组合;
起源日志模块,用于服务调用拦截器按照服务起源数据规范,根据获得的服务动态调用依赖关系和经过标识的每个任务的服务组合生成并输出起源日志文件;
数据存储模块,用于对起源日志文件进行数据处理后,存储在云数据库中。
本发明产生的有益效果是:
1. 通过服务状态和依赖的监控,捕获服务的执行状态和路径为云服务运维和管理提供有效的技术支撑;
2. 根据不同的服务调用频率,设计不同的抽样方法,降低系统开销;
3. 通过服务起源数据规范化,实现异构系统服务起源的支持。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
如图1所示,一种云服务起源数据的捕获方法,包括以下步骤:
1)根据服务框架和调用协议设计服务调用拦截器;
服务调用拦截器的设计方法包括以下步骤:
1.1)创建用于存储服务起源信息的文件;
1.2)服务调用者产生一个唯一的token值,作为识别服务动态依赖的标志;
1.3)创建用于读取并存储服务调用开始时间的参量;
1.4)创建用于读取和存储当前的IP地址的参量;
1.5) 创建用于存储所调用的服务名称的参量;
1.6)创建用于存储所调用的服务的入口参数的参量;
1.7)上述参量、文件和token值共同构成服务调用拦截器。
服务调用者在生成全局唯一的token值,作为识别服务动态依赖的标志,该token值和IP地址、时间等服务起源信息植入调用协议消息的头部,以开源的服务框架CXF为例,具体的实现流程如图2所示。
2)将服务调用拦截器内置在服务调用协议中;
透明性和自动化捕获程度取决于拦截器的部署位置,一种形式是:Dapper方法把拦截器部署在库函数,所有的通过核心库函数的调用将自动被拦截,具有高透明性,但由于不同平台的库函数差异很大,且不易修改,所以难以支持异构平台。另一种形式是使用基于应用程序标记方法,拦截器部署在应用程序,具有很好的灵活性,但是不支持自动捕获。
3)当服务调用发生时,服务调用拦截器拦截服务调用请求,获得服务动态调用依赖关系,并标识每个任务的服务组合;
3.1)解析SOAP消息头部信息;
3.2)获取消息头部信息中的token值,并存储到本地线程变量中;
3.3)根据token值获得服务动态调用依赖关系;
3.4)选取具有相同数值的token的服务,该服务组合共同完成某个任务;
3.5) 根据任务形成的动态服务组合过程,可以通过token进行查询后,进行迭代运算得到每个任务的服务组合。
在收集拦截器的信息过程中,为了提供对异构系统的支持,采用拦截器和拦截器管理分离的方式,管理模块负责所有拦截的注册、日志收集和处理,拦截器负责捕获服务起源并按照规范输出日志,可以根据不同的服务协议设计不同的拦截器,拦截器和管理模块是松耦合关系,拦截器运行的策略和方式通过读取一个XML配置文件实现,该文件由管理模块进行管理和维护,通过更新和修改该文件,拦截器实施不同的抽样策略和执行方式。所有拦截器采用公共标准的数据规范和传输协议。
以开源的服务框架CXF为例,服务调用请求获得服务动态调用依赖关系的流程图如图3所示。
服务调用拦截器拦截服务调用请求时,根据不同的服务调用频率,确定服务调用拦截器的拦截频率。
在云平台中,热门的服务往往调用的频率很高,在很短的时间内容,往往会被调用成千上万次,如果拦截每一次的调用,即使单次拦截的时间很短,例如,单次拦截耗时2ms,但是如果在1秒拦截100次服务调用,则需要耗时2ms*100=200ms=0.2s,这将给系统带来较大的开销。所以需要设计合适的抽样策略,降低服务起源捕获代价。
另外一个问题是,服务之间的调用频率差异巨大,有些非常用服务调用频率很低,如果采用统一的调用抽样策略,要么将丢掉服务调用模式特征,要么将带来较高的拦截代价。
本实施例中采用了一种分层的抽样策略,具体为
调用频率大于100次/秒,抽样频率为:向下取整(调用频率/100) 每秒;
调用频率小于100次/秒,且大于1次/秒,抽样频率为:1次 每秒;
调用频率小于1次/秒,抽样频率为:根据调用次数抽样
我们可以根据服务调用频率的实际情况,修改抽样策略,使之在降低采集代价的同时,保持服务起源的模式特征。
4)服务调用拦截器按照服务起源数据规范,根据获得的服务动态调用依赖关系和经过标识的每个任务的服务组合生成并输出起源日志文件;其中服务起源数据规范为一个9元组:
BasicProv(token,InvokingService,ServiceInvoked,location, elapsed time, timestamp, input, output, status);服务起源的数据规范参数含义如下:
Token:一个32位的字符串,用于标识一个动态的组合任务
InvokingService:服务调用者,也可以称为服务消费者。数据格式为一个32位的字符串
ServiceInvoked:服务被调用者,也可以称为服务提供者。数据格式为一个32位的字符串。
Location:服务调用发生的位置,在云服务环境,主要是IP地址。
Elapsed time:服务调用的耗时,该耗时为从服务调用者的视角看,完成一次服务调用所需要的时间,包含了被调用服务的嵌套执行时间。数据格式为一个8位的整型,单位为毫秒。
Timestamp:服务调用事件发生的时间戳,格式为年/月/日 小时/分钟/秒/毫秒
Input:服务调用的输入参数,数据存储格式为32位的字符串。
Output:服务调用的输出数据文件,一般为一个XML对象,或者一个json数据对象。
Status:服务执行的状态,数据格式为一个布尔值,1表示成功,0表示失败。
5)将起源日志文件进行数据处理后,存储在云数据库中。
读取服务起源日志记录,检查是否符合当前的服务起源数据规范,用户可以根据需要设置服务起源数据的规范要求,例如,当不需要分布式debug的时候,可以不拦截服务的输入和输出,在进行格式检查的时候不检查相关信息。
对于不符合要求的数据(包括信息不完整、超出位数长度等)进行丢弃,不插入远端数据库;
对于符合要求的数据,调用插入数据库模块,把信息插入到远程数据库中;
对系统支持异构的服务起源数据,如果当前数据标签和名称不符合数据规范,则采用数据映射的方式实现语义转换,具体的方式为,建立待转化数据信息字段名称和服务起源数据格式字段名称的映射关系,在插入数据之前,进行映射,然后根据匹配的信息插入到数据库中;
将服务起源日志存储到服务所在的本地服务器上,通过日志采集工具,实现数据的读取、传输和插入数据库。
一种云服务起源数据的捕获装置,包括:
拦截器生成模块,用于根据服务框架和调用协议生成服务调用拦截器;
拦截器内置模块,用于将服务调用拦截器内置在服务调用协议中;
数据收集模块,用于当服务调用发生时,服务调用拦截器拦截服务调用请求,获得服务动态调用依赖关系,并标识每个任务的服务组合;
起源日志模块,用于服务调用拦截器按照服务起源数据规范,根据获得的服务动态调用依赖关系和经过标识的每个任务的服务组合生成并输出起源日志文件;
数据存储模块,用于对起源日志文件进行数据处理后,存储在云数据库中。
以下使用一个简单的捕获实例对本捕获方法的有效性进行说明:
一个简单的捕获实例:
某学校的教务系统中的选课业务,由以下服务组合而成,如图4所示,该服务运行于开源的webservice框架CXF,具体的拦截步骤为:
(1)在服务框架CXF中部署拦截器模块
(2)在服务发布的时候,引用服务拦截器模块
(3)当服务调用发生时候,自动产生如下的服务起源数据,如下表所示:
token |
Invoking |
Invoked |
ElapsedTime |
status |
T1 |
S1 |
S2 |
35ms |
true |
T1 |
S2 |
S5 |
20ms |
true |
T2 |
S1 |
S3 |
50ms |
true |
T2 |
S3 |
S5 |
30ms |
true |
T3 |
S5 |
S8 |
12ms |
true |
T3 |
S3 |
S5 |
--- |
false |
(4)将该数据进行数据格式检查,符合要求后插入云端数据库
(5)本方法对拦截器的代价做了详细的测试,验证了拦截器的低功耗和扩展性,具体为:
拦截服务输出的数据集大小对拦截器的影响,如图5所示,拦截的数据集大小为100,200,1000条记录,每条记录为2个字段(用户名和密码),当结果集小于800条数据的时候,拦截耗时小于1ms,大于800时,处于服务器的瓶颈,将显著增加耗时。
针对高频率服务,测试了不同调用频率,每秒从10次到1000次情况下,拦截器的耗时,进行了共40次试验,拦截器平均耗时在0.8ms左右,拦截器的耗时如图6所示。
测试了服务起源日志采集对资源的占用情况,测试了每秒采集了32,61,121,231,388,452个服务起源日志,结果如图7所示,结果表明内存的占用量为5%,CPU的占用量在低于121时候约为10%。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。