1 背景
为满足国家互联互通评测标准要求,各医院正在竞相搭建一体化信息平台。例如在某医院建设的HRP平台。
医院的各业务系统需要通过WebService的方式集成到一体化平台,例如LIS、CIS、PACS、电子病历等,均需要调用HRP的数据集成接口(WebService)进行接入。
医院需要定时将数据上报给相关机构。数据上报通常是采用WebService方式实现。
SOA 模型(面向消息,已很少有人在使用)
RPC 模型(面向方法,大多数医院在用)
REST 模型(面向资源,针对互联网应用,也常见于存储监控接口(如EMC XtremIO)、虚拟化或超融合API等)
其中 RPC 模型,又分成三类:
XML-RPC(已很少有人在使用)
JSON-RPC(新的标准,正在逐步推广)
SOAP + WSDL (老的标准,由微软推出,目前大多数医院及厂商在用)
在集成方调用WebService的时候,需要遵从特定的协议进行数据封包。SOAP是一种协议(简单对象访问协议),它定义了一种基于XML的标准格式。
SOAP协议所定义的XML格式包括几个必须的标记:
(1)SOAP Envelope
SOAP信封,用来包裹SOAP内容主体。
(2)SOAP Header
SOAP头,用来帮助WebService端对调用方的数据进行数据检查(如安全检查、数据有效性检查等)。
(3)SOAP Body
SOAP体,用来描述请求调用的函数名、参数等信息。
WSDL有两个含义,第一个含义为SOAP WebService的调用地址(Endpoint),第二个含义为SOAP WebService的描述语言。
在数据集成方调用WebService的时候,需要四个要素:
(1)调用方地址
通常为http(s)://xxx.xxx.xxx.xxx:xxx/xxx?wsdl
(2)Soap头
需要按照WebService提供方的约束,填入Soap头信息。
(3)函数名
通常,一个调用地址会对外暴露多个函数,调用方在调用WebService的时候,需要提供函数名。
(4)参数
进行WebService函数调用时,需要给出函数的必要参数。
通常情况下,如果按照Post方式请求wsdl地址,则意味着进行WebService函数调用。如果按照Get方式请求wsdl地址,则意味着要获取WebService的描述信息。该WebService描述信息描述了该wsdl地址对外暴露的函数名、函数相关参数以及Soap头规定等信息。
获取WebService描述信息,是为了帮助开发人员了解如何对WebService进行调用。某些开发语言框架支持通过WebService描述信息生成本地的WebService调用代理,从而简化WebService调用程序的代码量。诸葛运帷监控系统运用WSDL信息帮助用户进行WebService的监控配置。
对WebService的监控,包含两个监控级别:
(1)监控WSDL地址的可用性
(2)监控每个WebService函数调用的结果是否符合预期
通过定期请求各WebService的WSDL对WebService的可用性进行监控。此类监控可以反映的问题包括:
(1)部署WebService的服务器宕机。
(2)WebService服务进程终止。
(3)WebService服务进程无法对外服务。
(4)WebService程序存在服务级错误(500)或编译错误。
监控流程
(1)配置WSDL地址、相关IP、相关业务。
(2)系统定期通过GET方式请求WSDL地址,根据HTTP的返回码判断状态,并记录请求时间。
2.4.2 监控每个WebService函数调用的结果是否符合预期
通过录入事先准备好的参数,调用WebService的各个函数,并判断WebService函数的返回值是否符合预期。此类监控可以反映的问题包括:
(1)部署WebService的服务器宕机。
(2)WebService服务进程终止。
(3)WebService服务进程无法对外服务。
(4)WebService程序存在服务级错误(500)或编译错误。
(5)WebService函数执行是否正常。(如是否存在逻辑错误、调用阻塞等情况)。
监控流程
(1)配置WSDL地址,相关IP、相关业务。
(2)配置要调用的函数、SOAP头、参数、预期的返回值、预期调用时间。
(3)系统定期通过POST方式根据配置进行WebService调用,传入预先配置好的SOAP头、函数名和参数。当WebService产生返回值时,根据返回值及调用时间进行判断。当返回值不符合预期或调用时间超过预期时,则进行报警。
JSON-RPC是由JSON-RPC Working Group发布的一种RPC通信标准。不同于Soap Webservice的XML,JSON-RPC的数据格式为JSON。这里采用JSON为数据格式,则意味着数据包的整体为JSON格式,而非Soap WebService中包裹了一段JSON。很多医院的HIS厂商宣称他们数据传输的格式为JSON,然而事实是,他们的WebService函数,参数为JSON格式,其实质仍然是基于Soap。这种运用方式,不属于JSON-RPC的范畴。
JSON-RPC协议的提出方有一句口号:为简单而生。所以在JSON-RPC协议中,并没有显式的规定JSON-RPC WebService必须有某种标准化的类似于WSDL的函数定义或声明文档的存在。它的文档应该是类似于API说明书之类的手册,没有统一的要求。需要开发人员阅读API接口文档,然后按照接口文档进行程序开发。因此,诸葛运帷在实现对JSON-RPC WebService监控的时候,无法根据定义帮助用户进行监控配置。用户必须手动录入相关参数。
JSON-RPC格式
当发起一个rpc调用时,除通知之外,服务端都必须回复响应。响应表示为一个JSON对象,使用以下成员:
jsonrpc
指定JSON-RPC协议版本的字符串,必须准确写为“2.0”
result
该成员在成功时必须包含。
当调用方法引起错误时必须不包含该成员。
服务端中的被调用方法决定了该成员的值。
error
该成员在失败时必须包含。
当没有引起错误时必须不包含该成员。
该成员参数值必须为5.1中定义的对象。
id
该成员必须包含。
该成员值必须于请求对象中的id成员值一致。
若在检查请求对象id时错误(例如参数错误或无效请求),则该值必须为空值。
响应对象必须包含result或error成员,但两个成员必须不能同时包含。
示例
JSON-RPC是由JSON-RPC Working Group出台的标准。这个标准之所以有名,是因为广大比特币交易平台都采用这个协议。但是不见得所有厂商都愿意使用这个协议。因此,也有不少厂商采用更为简单(或随意)的JSON格式封装自己的通信协议。例如,showdoc官方给出的API接口模板,就定义了一种JSON-RPC数据格式。
对JSON-RPC WebService的监控,由于灵活性太大,因此留给系统辅助用户进行监控配置的空间较小。基本来说,需要用户手动录入以下四项基本信息:
(1)调用地址
如http://xx.com/api/user/register
(2)请求头(Body)
与SOAP WebService不同,JSON-RPC的请求头通常放在HTTP Header里面。
(3)请求体(Body)
请求体是JSON格式的文本。不同的标准定义的请求体格式不同,用户需要根据相关API文档中的要求填入。
(4)预期返回值
请求发往目标地址后,预期的返回数据。
(5)预期的响应时间
从请求开始到WebService返回结果,最大容忍时间。
监控流程
(1)配置JSON-RPC WebService地址,相关IP、相关业务。
(2)配置要调用的请求体、预期的返回值、预期调用时间。
(3)系统定期通过POST方式根据配置进行WebService调用,传入预先配置好请求头、请求体。当WebService产生返回值时,根据返回值及调用时间进行判断。当返回值不符合预期或调用时间超过预期时,则进行报警。
对调用方或WebService的日志进行监控,通过关键字识别其中的错误信息,遇到严重度较高的错误,通过监控系统进行报警。
WebService 的分类管理、WebService 的批量导入、WebService 入参及出参的配置(更多的输入空间,而非简单输入框)。
WSDL地址的请求,根据响应时间、HTTP状态码判断调用是否成功。
与Soap WebService共享列表页,弹出页输入请求头、请求体,支持模拟调用。
监控脚本的实现。
读取WebService日志,分析系统报错。
展示WebService报表,包括基本信息与监控状态。