发明内容
有鉴于此,本发明提供一种实现计算的方法和系统以及服务器装置,有助于提高计算的正确性。本发明的其他目的和效果可以从具体实施方式中得出。
为实现上述目的,根据本发明的一个方面,提供了一种实现计算的方法。
本发明的实现计算的方法包括:终端装置根据人机界面对应的表达式生成方式和通过该人机界面接收的计算因素配置信息生成运算逻辑表达式;所述解析服务器更新自身保存的多个运算逻辑表达式中与所述终端装置生成的运算逻辑表达式具有相同标识的运算逻辑表达式;所述解析服务器根据业务系统指定的运算逻辑表达式获得该运算逻辑表达式对应的计算类;所述解析服务器根据所述计算类和所述业务系统提供的参数进行计算然后输出计算结果。
可选地,所述解析服务器更新自身保存的多个运算逻辑表达式中与所述终端装置生成的运算逻辑表达式具有相同标识的运算逻辑表达式的步骤之前,还包括:所述终端装置将生成的运算逻辑表达式发送给协调系统中的第一服务器,该第一服务器将该运算逻辑表达式保存在该协调系统的节点服务器中;所述第一服务器监听指定的多个节点服务器的数据状态并且在监听到节点服务器保存的运算逻辑表达式发生改变的情况下将该节点服务器保存的运算逻辑表达式发送给所述解析服务器;所述解析服务器更新自身保存的多个运算逻辑表达式中与所述终端装置生成的运算逻辑表达式具有相同标识的运算逻辑表达式的步骤包括:所述解析服务器接收所述第一服务器发送的运算逻辑表达式,并且该运算逻辑表达式替换自身保存的与该运算逻辑表达式具有相同标识的运算逻辑表达式。
可选地,所述协调系统为zookeeper系统,所述第一服务器为zookeeper系统的领导者服务器。
可选地,所述解析服务器根据业务系统指定的运算逻辑表达式获得该运算逻辑表达式对应的计算类的步骤包括:所述解析服务器根据业务系统指定的运算逻辑表达式的标识,判断从缓存系统中是否能够查询到该运算逻辑表达式对应的表达式对象;若是,则从所述缓存系统中读取查询到的表达式对象并进行反序列化,然后根据反序列化之后的表达式对象生成所述计算类;否则将该运算逻辑表达式解析为表达式对象,再根据该表达式对象生成所述计算类。
根据本发明的另一方面,提供了一种实现计算的服务器装置。
本发明的实现计算的服务器装置包括:保存模块,用于保存多个运算逻辑表达式,所述运算逻辑表达式是由一个或多个终端装置根据人机界面对应的表达式生成方式和通过该人机界面接收的计算因素配置信息而生成;更新模块,用于更新所述保存模块保存的多个运算逻辑表达式中与所述终端装置生成的运算逻辑表达式具有相同标识的运算逻辑表达式;解析模块,用于根据业务系统指定的运算逻辑表达式获得该运算逻辑表达式对应的计算类;计算模块,用于根据所述计算类和所述业务系统提供的参数进行计算然后输出计算结果。
可选地,所述解析模块还用于:根据业务系统指定的运算逻辑表达式的标识,判断从缓存系统中是否能够查询到该运算逻辑表达式对应的表达式对象;若是,则从所述缓存系统中读取查询到的表达式对象并进行反序列化,然后根据反序列化之后的表达式对象生成所述计算类;否则将该运算逻辑表达式解析为表达式对象,再根据该表达式对象生成所述计算类。
根据本发明的又一方面,提供了一种实现计算的系统。
本发明的实现计算的系统包括:一个或多个终端装置,所述终端装置用于根据人机界面对应的表达式生成方式和通过该人机界面接收的计算因素配置信息生成多个运算逻辑表达式;解析服务器,用于:保存所述多个运算逻辑表达式;更新所述多个运算逻辑表达式中与所述终端装置生成的运算逻辑表达式具有相同标识的运算逻辑表达式;根据业务系统指定的运算逻辑表达式获得该运算逻辑表达式对应的计算类;根据所述计算类和所述业务系统提供的参数进行计算然后输出计算结果;协调系统,包括第一服务器和多个节点服务器,其中所述第一服务器用于将该运算逻辑表达式保存在所述节点服务器中,以及监听指定的多个节点服务器的数据状态并且在监听到节点服务器保存的运算逻辑表达式发生改变的情况下将该节点服务器保存的运算逻辑表达式发送给所述解析服务器;所述解析服务器还用于接收所述第一服务器发送的运算逻辑表达式,并且该运算逻辑表达式替换自身保存的与该运算逻辑表达式具有相同标识的运算逻辑表达式。
可选地,所述协调系统为zookeeper系统,所述第一服务器为zookeeper系统的领导者服务器。
可选地,还包括缓存系统,用于缓存运算逻辑表达式对应的表达式对象;所述解析服务器还用于:根据业务系统指定的运算逻辑表达式的标识,判断从缓存系统中是否能够查询到该运算逻辑表达式对应的表达式对象;若是,则从所述缓存系统中读取查询到的表达式对象并进行反序列化,然后根据反序列化之后的表达式对象生成所述计算类;否则将该运算逻辑表达式解析为表达式对象,再根据该表达式对象生成所述计算类。
根据本发明的技术方案,提供人机界面并且由计算逻辑的设计人员使用该人机界面提供计算逻辑,然后生成运算逻辑表达式;在需要计算时按照运算逻辑表达式得到计算类并且计算。这种方式一方面使计算逻辑的设计变得可视化,便于人员设计以及其他人员的阅读,另一方面使计算逻辑能够准确地被转换为运算代码,保证计算的可靠性,此外还实现了对重复使用的计算逻辑封装为运算逻辑表达式,无需每次单独设计,并且在需要修改运算逻辑的情况下可以由计算逻辑的设计人员修改后快速地转换为运算代码,提高了工作效率。
具体实施方式
以下结合附图对本发明的示范性实施方式做出说明,其中包括本发明实施方式的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施方式做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
图1是根据本发明实施方式的实现计算的系统的优选结构的示意图。如图1所示,实现计算的系统10可以被多个业务系统121、122、……12N调用并且进行计算。实现计算的系统10主要包括解析服务器101,多个终端装置112、113、……11N,zookeeper系统102,缓存系统103。由上述的终端装置提供人机界面,该人机界面主要供计算逻辑的设计人员使用。以下对各部分的功能进行说明。
上述的各终端装置提供类似的计算逻辑定义界面,在计算逻辑定义界面中,针对不同的要计算的内容和逻辑,通过人机界面接收计算因素配置信息。并且每个计算逻辑定义界面对应一个表达式生成引擎,该表达式生成引擎是预先定义的一套类似于自定义语法的表达式生成方式,可采用现有的各种自定义语法的方式和结构来实现。例如需要计算一些订单的指定支付类型的金额,同时考虑是否对明细进行过滤以及需要排除的业务编号,则在人机界面上选择计算因素,包括订单号、支付类型、明细过滤、业务编号这四种计算因素,其中订单号在表达式中采用预定义的字符串“orderId”,可由人员输入该字符串或者在人机界面提供的字符串选择工具中选择;支付类型在表达式中采用预定义的字符串“paydetails”,例如包括11至19,可以在人机界面中设计成下拉框供用户选择,例如用户选择了11,12,13。类似地,明细过滤和业务编号这两种计算因素在表达式中分别采用预定义的字符串“DetailsFilter”和“businessNo”,对“明细过滤”这一计算因素,在人机界面中提供选项“all”(表示全部过滤)和“none”(表示不过滤)。对“业务编号”这一计算因素,在人机界面中提供选项“no”和“yes”。最终形成如下运算逻辑表达式:
{orderId:$orderId,paydetails:[11,12,13],DetailsFilter:all,businessNo:!$businessNo}
该运算逻辑表达式表达的逻辑为:计算订单号为orderId,支付类型为11,12,13,所有明细过滤,并且业务编号不是businessNo的金额。
运算逻辑表达式中包含终结元素和非终结元素,终结元素主要是指能够采用自定义语法解释的最小语法单元,一般是具有特定含义的符号,例如算式表达式、逻辑表达式、自定义的表达式等,在人机界面上可以呈现直白的解释,例如“求平均”等。例如上述运算逻辑表达式中,paydetails之后的方括号内的内容即表示以逗号连接的“和”的逻辑关系,是一种终结元素。非终结元素主要是没有实际含义的替换符,一般是自定义的常量或者变量,可以采用键-值的方式来定义表达式中的非终结元素和要将其替换成的内容。例如上述表达式中,非终结元素orderId即为自定义的变量,在计算时它的值替换为$之后的变量的传入值。
终端装置在得出运算逻辑表达式之后可以先发送给zookeeper系统,zookeeper系统将运算逻辑表达式保存在节点中,可以按如下的树状结构来保存:/计算类别/使用系统代码/版本号/计算公式。zookeeper系统中的任一节点的改变,都会产生事件从而将最新的运算逻辑表达式发送给解析服务器。当然也可以采用其他类似功能的协调系统来使得解析服务器得到的是最新的运算逻辑表达式。
解析服务器的一个功能是对运算逻辑表达式进行解析以获得运算逻辑表达式对应的计算类。业务系统在进行计算时会调用指定的运算逻辑表达式,并提供该运算逻辑表达式中的参数类型及其值。解析服务器根据参数类型对运算逻辑表达式进行解析,可以根据自定义语法的语法树来解析。对于运算逻辑表达式中的非终结元素,调用预设的接口,按上述的键-值的关系来进行替换,另外业务系统可能指定有自定义的接口,则优先采用业务系统的接口。运算逻辑表达式可以选择支持json格式和xml格式,可进行多层嵌套。在解析时,首先将整个运算逻辑表达式加载到内存中,然后通过正则表达式匹配'${xx}'的格式,找到所有的非终结字符的起始字符下标和结束下标,再逐个字符加载到一个有限长度的栈中,实现字符的先进后出,当字符是非终结因素的时候,一直对字符做出栈处理,当字符是终结因素的时候,对终结因素的左右表达式进行映射处理,每个最小语法单元处理的过程抽象成接口,从而得到运算逻辑表达式对应的表达式对象,再根据该表达式对象采用jdk动态代理生成运算逻辑表达式对应的计算类。
缓存系统的功能是对解析服务器得到的表达式对象进行序列化之后再缓存。解析服务器在确定业务系统所指定的运算逻辑表达式后,可以首先在缓存系统中查询该运算逻辑表达式对应的表达式对象,若查询到表达式对象,则可以直接对该表达式对象进行反序列化然后得到该运算逻辑表达式对应的计算类,否则再按上文的方式对该运算逻辑表达式进行解析以得到对应的表达式对象。这种做法有助于提高处理的效率。可以采用Redis缓存系统或者其他缓存系统来实现。
在得到运算逻辑表达式对应的计算类之后,即对该计算类进行计算。计算类对象时采用的参数的数量和类型是生成计算类的时候决定的,当计算逻辑的设计人员修改了计算因素配置信息时,解析服务器即重新计算类对象,使得计算逻辑能够在线实时更新。所以可以理解为,在解析时对于不同的参数都解析为不同的计算对象,从而一个运算逻辑表达式可对应多个计算类,这样有助于避免类膨胀。每个表达式包含的因素可以很多,但是解析服务器可以在解析过程中对运算逻辑表达式按照预先设置的规则对参数进行逻辑校验,只对使用的因素对应的树结构进行解析,从而加快处理效率。这是因为计算逻辑的设计人员在提供计算因素配置信息时,有可能因考虑不周或者客观原因,提供的逻辑存在互相冲突或者冗余,即存在逻辑不可达的情况。例如对于以逻辑“或”连接的包含多个逻辑值的表达式,其中一个逻辑值为1时显然整个表达式为1,则此时可按逻辑“或”连接的包含多个逻辑值的表达式的校验规则,无需判断其他逻辑值。对于存在错误的逻辑则应舍弃,并且可以反馈至终端装置。可以看出钍对不同的参数都解析为不同的计算对象可以在该参数无法通过逻辑校验时只舍弃该参数对应的计算类,不影响其他参数对应的计算类。
计算类对象可以是java动态生成一个计算类的过程,是根据表达式动态生成的,属于非预编译类。生成的过程就是动态递归处理,简单的逻辑类图如图2所示,图2是根据本发明实施方式的生成计算类时的逻辑类图。图中21是运算逻辑表达式,22是符号表达式,处理时只关注非终结元素左右的值之间的运算关系,24是处理时采用的具体解析实现类,每个非终结元素都有自己对应的具体实现类。23是变量表达式。
图3是根据本发明实施方式的实现计算的基本步骤的示意图。如图3所示,主要有如下的步骤S31至步骤S34。
步骤S31:终端装置根据人机界面对应的表达式生成方式和通过该人机界面接收的计算因素配置信息生成运算逻辑表达式。
步骤S32:解析服务器更新自身保存的多个运算逻辑表达式中与终端装置生成的运算逻辑表达式具有相同标识的运算逻辑表达式。
步骤S33:解析服务器根据业务系统指定的运算逻辑表达式获得该运算逻辑表达式对应的计算类。
步骤S34:解析服务器根据上述计算类和上述业务系统提供的参数进行计算然后输出计算结果。
图4是根据本发明实施方式的实现计算的优选具体流程的示意图。如图4所示,该流程主要包括如下的步骤S01至步骤S23。
步骤S01:输出计算逻辑界面。在界面模板生成器上,人员选择要生成的表达式编辑界面模板。
步骤S02:选择相关终结元素。
步骤S03:在动态输入完成非终结元素后,整个计算过程的定义就算完成,生成相应的计算逻辑表达式。
步骤S04:计算过程定义完后,会显示出生成的计算表达式。确认后,即可以继续执行。
步骤S05:提交到zookeeper服务器后,计算表达式就能够推送到远端服务器上,直接进行同步和保存。
步骤S06:zookeeper服务器会自动对当前提交的表达式进行更新。以树节点的形式保存(表达式Id+版本号)。
步骤S07:线上服务器是基于监听者模式,所有的服务器会监听指定的树节点,当树节点改变触发change事件,调用watch方法。
步骤S08:解析服务器通过比对版本号,发现当前版本低的话会进行更新到内存。到此整个表达式就更新完成。
步骤S09:上层业务系统传入相应参数,通过计算表达式,期望计算出金额。
步骤S10:封装key与参数对象,通过key-value进行参数映射到计算表表达式上。上层业务系统可以基于key-value来计算表达式映射响应的参数。Key的格式可以是由表达式标识、上层业务系统应用程序标识以及参数名称来组成,即:表达式ID_上层业务系统appID_参数名称。value是参数的真实值,可采用任意数据类型。
步骤S11:通过表达式id获取对应的解析器。
步骤S12:参数解析和基本校验。
步骤S13:从内存中直接获取对应表达式。
步骤S14:将表达式id作为key到redis中进行查询。
步骤S15:调用redis,做read操作进行查询。这样可避免每次都进行表达式解析的初始化,有助于提高性能。
步骤S16:判断返回值是否为空,即原来表达式是否缓存到redis上。
步骤S17:如果不为空,直接将字符串反序列化成相应的java解析后的表达式对象。
步骤S18:如果为空,说明redis中未缓存相应的表达式,将原来字符串的表达式解析成java解析表达式对象。
步骤S19:根据表达式对象,通过递归的方式,生成计算类。
步骤S20:将java表达式对象反序列后存入redis服务器中。
步骤S21:对计算类的计算对外计算方法中传入上层业务系统的参数。
步骤S22:参数对应完成后,直接进行相应的解析、运算逻辑。
步骤S23:将最终结果返回到上级业务系统。
图5是根据本发明实施方式的解析服务器的一种结构的示意图。如图5所示,实现计算的服务器装置50作为软件可以设置在解析服务器中,主要包括保存模块51、更新模块52、解析模块53、以及计算模块54。保存模块51用于保存多个运算逻辑表达式,所述运算逻辑表达式是由一个或多个终端装置根据人机界面对应的表达式生成方式和通过该人机界面接收的计算因素配置信息而生成;更新模块52用于更新所述保存模块保存的多个运算逻辑表达式中与所述终端装置生成的运算逻辑表达式具有相同标识的运算逻辑表达式;解析模块53用于根据业务系统指定的运算逻辑表达式获得该运算逻辑表达式对应的计算类;计算模块54用于根据所述计算类和所述业务系统提供的参数进行计算然后输出计算结果。
根据本发明实施方式,提供人机界面并且由计算逻辑的设计人员使用该人机界面提供计算逻辑,然后生成运算逻辑表达式;在需要计算时按照运算逻辑表达式得到计算类并且计算。这种方式一方面使计算逻辑的设计变得可视化,便于人员设计以及其他人员的阅读,另一方面使计算逻辑能够准确地被转换为运算代码,保证计算的正确性,此外还实现了对重复使用的计算逻辑封装为运算逻辑表达式,无需每次单独设计,并且在需要修改运算逻辑的情况下可以由计算逻辑的设计人员修改后快速地转换为运算代码,提高了工作效率。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。