分布式架构下实现动态可配置的服务参数校验处理系统及其方法与流程

文档序号:20767427发布日期:2020-05-15 19:09阅读:499来源:国知局
分布式架构下实现动态可配置的服务参数校验处理系统及其方法与流程
本发明涉及计算机领域,尤其涉及分布式架构领域,具体是指一种分布式架构下实现动态可配置的服务参数校验处理系统及其方法。
背景技术
:随着数字化转型的需求,企业it应用架构已经由传统单体架构转向分布式架构的应用,分布式架构的应用由于天然的扩展性,更容易支撑大规模用户请求,满足用户日益增长的诉求。通过将应用和服务分解成更小的、松散耦合的组件,它们可以更加容易升级和扩展,不同的组件之间通过相互调用、访问来实现业务场景。在进行分布式调用过程中,为了保障业务逻辑的正确性、合规性,需要对分布式的服务参数进行数据校验,来确保输入来的数据从业务语义上是正确的;并且随着业务的发展,对服务参数的校验规则也在不停的变化,需要分布式架构系统提供一种动态调整服务参数校验规则的能力,来满足企业it业务变化的诉求。针对参数校验,通用的做法是在javabean对象上通过java注解的方式来实现;在java体系中针对参数验证定义了jsr303:beanvalidation规范,为javabean的属性验证定义了相应的元数据模型和api。支持对javabean的属性、方法参数、返回值进行验证,缺省的元数据使用javaannotations(java注解)。例如通过在javabean的属性或者操作上增加注解声明@notnull表示不允许为空、@size(max=30)(设置最大值),来定义参数校验规则;beanvalidation是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。针对属性addressline1定义了不允许为空,同时最大长度是30;针对属性addressline2定了了最大长度为30;针对操作getcity()的返回值定义了返回值city不允许为空,同时最大长度是30;根据以上示例,根据java注解的方式实现了对服务参数的校验。以下针对上面的技术实现方式分析对应的不足:不足1:校验规则与业务代码耦合度高:校验规则通过注解的方式直接编码在代码中,导致校验规则与业务代码的耦合度高,对业务代码具有强侵入性。不足2:运行期无法动态配置与热更新:在业务运行期,如果因为业务的调整,需要对校验规则调整时,需要重新修改业务代码并重新打包、编译、部署,导致业务系统停机发布。不足3:校验规则无法集中管理:由于校验规则分布在不同的业务代码中,无法做到统一的集中化管理,不利于维护。技术实现要素:本发明的目的是克服了上述现有技术的缺点,提供了一种满足复杂度低、可读性高、操作简便的分布式架构下实现动态可配置的服务参数校验处理系统及其方法。为了实现上述目的,本发明的分布式架构下实现动态可配置的服务参数校验处理系统及其方法如下:该分布式架构下实现动态可配置的服务参数校验处理系统,其主要特点是,所述的系统包括:服务收集管理模块,用于收集分布式架构应用系统所有的服务列表;服务参数校验信息定义模块,与所述的服务收集管理模块相连接,用于定义服务参数检验规则模型,管理具体服务的参数校验规则定义,通知后续模块进行参数校验规则变更;服务参数校验信息管理模块,与所述的服务参数校验信息定义模块相连接,用于负责持久化服务参数校验规则以及相关操作;服务参数校验代理模块,与所述的服务参数校验信息管理模块相连接,用于根据具体的服务请求数据和对应的服务参数校验规则,通过代理动态校验服务参数的有效性;服务参数校验信息代理模块,与所述的服务参数校验信息定义模块、服务参数校验信息管理模块和服务参数校验代理模块相连接,用于接收所述的服务参数校验信息定义模块发出的变更通知。较佳地,所述的服务收集管理模块包括查询管理接口,用于提供查询需要管理的应用列表及应用下的服务列表。较佳地,所述的服务参数校验信息定义模块的服务参数检验规则模型包括支持的服务参数类型和支持的校验规则。较佳地,所述的服务参数校验信息管理模块提供的操作包括根据应用id查询该应用下所有的服务参数校验规则、根据服务id,查询服务参数校验规则详细信息、新增服务参数校验规则、更新服务参数校验规则以及删除服务参数校验规则。该基于上述系统实现分布式架构下的动态可配置服务参数校验处理的方法,其主要特点是,所述的方法包括以下步骤:(1)所述的服务收集管理模块收集分布式架构应用系统所有的服务列表;(2)所述的服务参数校验信息定义模块管理具体服务的参数校验规则定义,通知服务参数校验信息代理模块参数校验规则变更;(3)所述的服务参数校验信息管理模块负责持久化服务参数校验规则(4)所述的服务参数校验信息代理模块接收所述的服务参数校验信息定义模块发出的变更通知;(5)所述的服务参数校验代理模块根据具体的服务请求数据和对应的服务参数校验规则,通过代理动态校验服务参数的有效性。较佳地,所述的步骤(1)具体包括以下步骤:(1.1)查找所有的应用列表及应用的基本信息,或者根据提供的管理界面手动录入应用信息;(1.2)查找应用下所有的实例信息,或者根据提供的管理界面手动录入应用的实例信息;(1.3)扫描收集应用下所有的服务列表及服务信息,或者根据提供的管理界面手动录入服务信息;(1.4)将收集的信息持久化,持久化到数据库或者持久化到文件系统中;(1.5)为(1.4)中持久化的信息提供查询api管理接口。较佳地,所述的步骤(2)具体包括以下步骤:(2.1)从所述的服务收集管理模块中查询出所有收集的应用;(2.2)从查询的所有应用列表中指定需要校验的应用;(2.3)查询应用下所有的服务列表;(2.4)选择需要校验的具体服务;(2.5)根据服务参数校验规则模型,定义服务输入参数的校验规则;(2.6)根据服务参数校验规则模型,定义服务输出参数的校验规则;(2.7)将定义的参数校验规则持久化到所述的服务参数校验信息管理模块中;(2.8)从所述的服务收集管理模块中查询出所有该应用下所有的在线实例列表;(2.9)通知所有实例的服务参数校验信息代理模块,通知服务参数校验规则变化。较佳地,所述的步骤(4)具体包括以下步骤:(4.1)按照应用的启动方式拉起应用;(4.2)在启动过程中拉起服务参数校验信息代理模块;(4.3)从所述的服务参数校验信息管理模块中查找该应用下所有的服务参数校验规则;(4.4)将查找的服务参数校验规则,通过应用内部的本地缓存或者分布式缓存进行存储,提升访问效率;(4.5)判断是否监听收到服务参数校验规则变更通知,如果是,则继续步骤(4.6);否则,继续步骤(4.5);(4.6)判断服务参数校验规则变化的类型,如果是新增或者修改类型,则继续步骤(4.7);如果是删除类型,则继续步骤(4.9);(4.7)根据变化的服务id,从服务参数校验信息管理模块查询变化的服务参数校验规则;(4.8)根据服务id,将查询出的新的服务参数校验规则更新至步骤(4.4)的缓存;(4.9)根据变化的服务id删除步骤(4.4)的缓存。较佳地,所述的步骤(5)具体包括以下步骤:(5.1)按照应用的启动方式拉起应用;(5.2)在启动过程中拉起服务参数校验代理模块,并根据加载的所有服务参数校验信息进行校验;(5.3)代理所有服务实例;(5.4)根据加载的所有服务参数校验规则,判断服务是否需要拦截,如果是,则继续步骤(5.5);否则,继续步骤(5.6);(5.5)根据调用的服务id,从加载的服务参数校验规则中查找到对应的服务参数校验规则,对服务输入参数进行校验,判断校验是否通过,如果是,则继续步骤(5.6);否则,继续步骤(5.9);(5.6)继续执行服务的具体业务逻辑,根据步骤(5.4)的判断结果,如果服务需要拦截,则表示输出参数需要校验,继续步骤(5.7);如果服务不需要拦截,则表示输出参数不需要校验,继续步骤(5.8);(5.7)对服务逻辑的返回值作为输出参数进行校验,判断校验是否通过,如果是,则继续步骤(5.8);否则,继续步骤(5.9);(5.8)返回服务输出参数至调用方;(5.9)将校验不通过的信息返回至调用方,并结束本次服务调用。采用了本发明的分布式架构下实现动态可配置的服务参数校验处理系统及其方法,实现了对服务参数校验配置与业务代码分离的机制,并提供集中化的动态配置、热更新能力,从而实现了服务参数校验规则与业务代码解耦,解决服务参数校验规则对业务代码侵入性强的问题,降低业务代码的复杂度、提升可读性;同时实现无需停止业务系统即可进行服务参数规则动态调整的能力;另外提供服务参数校验规则集中管理的方式,提供服务参数校验规则全局的管理视角进行服务治理,具备较强的推广价值。附图说明图1为本发明的分布式架构下实现动态可配置的服务参数校验处理系统的结构图。图2为本发明的实现分布式架构下的动态可配置服务参数校验处理的方法的服务收集管理模块运行的流程图。图3为本发明的实现分布式架构下的动态可配置服务参数校验处理的方法的服务参数校验信息定义模块运行的流程图。图4为本发明的实现分布式架构下的动态可配置服务参数校验处理的方法的服务参数校验信息代理模块运行的流程图。图5为本发明的实现分布式架构下的动态可配置服务参数校验处理的方法的服务参数校验代理模块运行的流程图。具体实施方式为了能够更清楚地描述本发明的技术内容,下面结合具体实施例来进行进一步的描述。本发明的该分布式架构下实现动态可配置的服务参数校验处理系统,其中包括:服务收集管理模块,用于收集分布式架构应用系统所有的服务列表;服务参数校验信息定义模块,与所述的服务收集管理模块相连接,用于定义服务参数检验规则模型,管理具体服务的参数校验规则定义,通知后续模块进行参数校验规则变更;服务参数校验信息管理模块,与所述的服务参数校验信息定义模块相连接,用于负责持久化服务参数校验规则以及相关操作;服务参数校验代理模块,与所述的服务参数校验信息管理模块相连接,用于根据具体的服务请求数据和对应的服务参数校验规则,通过代理动态校验服务参数的有效性;服务参数校验信息代理模块,与所述的服务参数校验信息定义模块、服务参数校验信息管理模块和服务参数校验代理模块相连接,用于接收所述的服务参数校验信息定义模块发出的变更通知。作为本发明的优选实施方式,所述的服务收集管理模块包括查询管理接口,用于提供查询需要管理的应用列表及应用下的服务列表。作为本发明的优选实施方式,所述的服务参数校验信息定义模块的服务参数检验规则模型包括支持的服务参数类型和支持的校验规则。作为本发明的优选实施方式,所述的服务参数校验信息管理模块提供的操作包括根据应用id查询该应用下所有的服务参数校验规则、根据服务id,查询服务参数校验规则详细信息、新增服务参数校验规则、更新服务参数校验规则以及删除服务参数校验规则。本发明的该利用上述系统实现分布式架构下的动态可配置服务参数校验处理的方法,其中包括以下步骤:(1)所述的服务收集管理模块收集分布式架构应用系统所有的服务列表;(1.1)查找所有的应用列表及应用的基本信息,或者根据提供的管理界面手动录入应用信息;(1.2)查找应用下所有的实例信息,或者根据提供的管理界面手动录入应用的实例信息;(1.3)扫描收集应用下所有的服务列表及服务信息,或者根据提供的管理界面手动录入服务信息;(1.4)将收集的信息持久化,持久化到数据库或者持久化到文件系统中;(1.5)为(1.4)中持久化的信息提供查询api管理接口;(2)所述的服务参数校验信息定义模块管理具体服务的参数校验规则定义,通知服务参数校验信息代理模块参数校验规则变更;(2.1)从所述的服务收集管理模块中查询出所有收集的应用;(2.2)从查询的所有应用列表中指定需要校验的应用;(2.3)查询应用下所有的服务列表;(2.4)选择需要校验的具体服务;(2.5)根据服务参数校验规则模型,定义服务输入参数的校验规则;(2.6)根据服务参数校验规则模型,定义服务输出参数的校验规则;(2.7)将定义的参数校验规则持久化到所述的服务参数校验信息管理模块中;(2.8)从所述的服务收集管理模块中查询出所有该应用下所有的在线实例列表;(2.9)通知所有实例的服务参数校验信息代理模块,通知服务参数校验规则变化;(3)所述的服务参数校验信息管理模块负责持久化服务参数校验规则(4)所述的服务参数校验信息代理模块接收所述的服务参数校验信息定义模块发出的变更通知;(4.1)按照应用的启动方式拉起应用;(4.2)在启动过程中拉起服务参数校验信息代理模块;(4.3)从所述的服务参数校验信息管理模块中查找该应用下所有的服务参数校验规则;(4.4)将查找的服务参数校验规则,通过应用内部的本地缓存或者分布式缓存进行存储,提升访问效率;(4.5)判断是否监听收到服务参数校验规则变更通知,如果是,则继续步骤(4.6);否则,继续步骤(4.5);(4.6)判断服务参数校验规则变化的类型,如果是新增或者修改类型,则继续步骤(4.7);如果是删除类型,则继续步骤(4.9);(4.7)根据变化的服务id,从服务参数校验信息管理模块查询变化的服务参数校验规则;(4.8)根据服务id,将查询出的新的服务参数校验规则更新至步骤(4.4)的缓存;(4.9)根据变化的服务id删除步骤(4.4)的缓存;(5)所述的服务参数校验代理模块根据具体的服务请求数据和对应的服务参数校验规则,通过代理动态校验服务参数的有效性;(5.1)按照应用的启动方式拉起应用;(5.2)在启动过程中拉起服务参数校验代理模块,并根据加载的所有服务参数校验信息进行校验;(5.3)代理所有服务实例;(5.4)根据加载的所有服务参数校验规则,判断服务是否需要拦截,如果是,则继续步骤(5.5);否则,继续步骤(5.6);(5.5)根据调用的服务id,从加载的服务参数校验规则中查找到对应的服务参数校验规则,对服务输入参数进行校验,判断校验是否通过,如果是,则继续步骤(5.6);否则,继续步骤(5.9);(5.6)继续执行服务的具体业务逻辑,根据步骤(5.4)的判断结果,如果服务需要拦截,则表示输出参数需要校验,继续步骤(5.7);如果服务不需要拦截,则表示输出参数不需要校验,继续步骤(5.8);(5.7)对服务逻辑的返回值作为输出参数进行校验,判断校验是否通过,如果是,则继续步骤(5.8);否则,继续步骤(5.9);(5.8)返回服务输出参数至调用方;(5.9)将校验不通过的信息返回至调用方,并结束本次服务调用。本发明的具体实施方式中,本发明涉及分布式架构下一种动态可配置的服务参数校验的系统和方法。其中包括服务收集管理模块,负责收集分布式架构应用系统所有的服务列表;服务参数校验信息定义模块,管理具体服务的参数校验规则定义、通知服务参数校验信息代理模块参数校验规则变更;服务参数校验信息管理模块,负责持久化服务参数校验规则;服务参数校验信息代理模块,从服务参数校验信息管理模块加载当前应用系统下所有的服务参数校验规则,并进行缓存,支持全量加载和局部加载;服务参数校验代理模块,根据具体的服务请求数据和对应的服务参数校验规则,动态判断服务参数的有效性,校验通过继续执行服务,校验不通过拒绝服务继续执行。采用该种结构的分布式架构下一种动态可配置的服务参数校验的系统和方法,实现了对服务参数动态配置、热更新、集中化管理,对业务规则变化导致参数校验变化具有强适应性,提升了分布式架构应用服务参数校验的开发、运维效率,在分布式架构领域具有广泛的使用范围。如图1所示,本发明分为服务收集管理模块、服务参数校验信息定义模块、服务参数校验信息管理模块、服务参数校验信息代理模块、服务参数校验代理模块。服务收集管理模块,负责收集分布式架构应用系统所有的服务列表;服务参数校验信息定义模块,管理具体服务的参数校验规则定义、通知服务参数校验信息代理模块参数校验规则变更;服务参数校验信息管理模块,负责持久化服务参数校验规则;服务参数校验信息代理模块,接收“服务参数校验信息定义模块”中发出的变更通知,从“服务参数校验信息管理模块”加载当前应用系统下所有的服务参数校验规则,并进行缓存,支持全量加载和局部加载;服务参数校验代理模块,根据具体的服务请求数据和对应的服务参数校验规则,通过代理动态判断服务参数的有效性,校验通过继续执行服务,校验不通过拒绝服务继续执行。下面将详细描述服务收集管理模块、服务参数校验信息定义模块、服务参数校验信息管理模块、服务参数校验信息代理模块、服务参数校验代理模块。一、服务收集管理模块:服务收集管理模块,收集需要进行服务参数配置管理的应用以及应用实例的信息,收集每个应用下所有需要进行服务参数配置管理的服务列表;将上面收集的信息进行持久化,并提供查询管理接口,“服务参数校验信息定义模块”基于此接口查询需要管理的应用列表及应用下的服务列表。服务收集管理模块操作的步骤如图2所示。步骤说明:步骤1:收集应用信息:从注册中心查找所有的应用列表及应用的基本信息,或者根据提供的管理界面手动录入应用信息;收集的应用信息包括的元数据有:应用id、应用名称、应用描述、应用注册时间;步骤2:收集应用的实例信息:从注册中心查找应用下所有的实例信息,或者根据提供的管理界面手动录入应用的实例信息;应用的实例信息包括的元数据有:应用实例id、ip地址、应用端口、实例状态、应用实例注册时间等;步骤3:收集应用下服务信息:根据服务上声明用于自动发现的注解@servicevalidateannounce,扫描收集应用下所有的服务列表及服务信息,或者根据提供的管理界面手动录入服务信息;服务信息包括的元数据有:服务id(在同一个应用内服务id全局唯一)、服务名称、服务全路径、方法名、参数列表信息、返回值信息;其中参数列表信息包括参数名称、参数类型;返回值信息包括返回值名称、返回值类型;步骤4:持久化收集的信息:将步骤1、步骤2、步骤3收集的信息持久化;例如持久化到数据库或者持久化到文件系统中;步骤5:提供查询类api管理接口:为步骤4中持久化的信息提供查询api管理接口,主要包括:查询应用列表接口;根据应用id查询应用信息详情接口;根据应用id查询应用的实例信息接口;根据应用id查询服务信息列表接口;根据服务id查询服务信息详情接口。二、服务参数校验信息定义模块:服务参数校验信息定义模块主要提供的能力包括:定义服务参数检验规则模型,包括针对具体参数的校验规则;针对“服务收集管理模块”中收集的应用、服务列表定义具体的服务参数校验规则;服务参数校验规则定义完成后,通知服务所在应用的应用实例中的“服务参数校验信息代理模块”,进行服务参数校验规则的动态刷新;服务参数校验规则模型主要包括:1、支持的服务参数类型基本类型参数:支持java中基本类型string、int、long、double、boolean、char等;javabean类型参数:支持javabean类型的参数,实际配置参数规则时,对javabean参数进行展开,针对javabean的每个基本类型的属性进行校验,如果属性仍然是javabean类型,则继续展开对应的属性进行校验;2、支持的校验规则必填校验:判断当前参数是否必填;长度校验:校验参数的最大长度;定长校验:判断当前参数是否定长,并校验给定的定长长度;范围校验:判断当前参数取值是否在给定的范围(范围)中;自定义校验规则:通过扩展方式实现自定义的校验规则;如图3所示,步骤说明:步骤1:查询所有的应用列表:从“服务收集管理模块”中查询出所有收集的应用;步骤2:选择需要检验的应用:用户从步骤1查询的所有应用列表中指定需要校验的应用;步骤3:查询该应用下所有的服务列表:根据步骤2指定的应用,从“服务收集管理模块”中查询出所有的服务列表;步骤4:选择需要校验的服务:从步骤3中的查找到的服务列表中,选择需要校验的具体服务;步骤5:设置输入参数的校验规则:根据服务参数校验规则模型,定义服务输入参数的校验规则;步骤6:设置输出参数的校验规则:根据服务参数校验规则模型,定义服务输出参数的校验规则;步骤7:调用“服务参数校验信息管理模块”,持久化校验规则:将步骤5、步骤6中定义的参数校验规则持久化到“服务参数校验信息管理模块”中;步骤8:查询该应用下所有的在线实例列表:根据步骤2指定的应用,从“服务收集管理模块”中查询出所有该应用下的应用实例列表;步骤9:通知所有实例的“服务参数校验信息代理模块”,通知服务参数校验规则变化:通知步骤8中查询出的所有应用实例,该应用下的服务参数校验规则发生变化,“服务参数校验信息代理模块”会从“服务参数校验信息管理模块”中重新加载变化的服务参数校验规则。三、服务参数校验信息管理模块:服务参数校验信息管理模块,负责持久化“服务参数校验信息定义模块”中定义的服务参数校验规则,并提供服务参数校验规则管理类api接口,主要提供的操作有:1)根据应用id,查询该应用下所有的服务参数校验规则;2)根据服务id,查询服务参数校验规则详细信息;3)新增服务参数校验规则;4)更新服务参数校验规则;5)删除服务参数校验规则。四、服务参数校验信息代理模块:服务参数校验信息代理模块,作为应用的一部分并随应用的启动对外提供服务,应用停止则停止该模块;应用启动时,该模块从“服务参数校验信息管理模块”中加载当前应用下所有的服务参数校验规则,并缓存在应用内部,用于提升访问效率;同时,当用户通过“服务参数校验信息定义模块”新增、修改或者删除服务参数检验规则后,该模块接收“服务参数校验信息定义模块”中发出的服务参数变更通知,从“服务参数校验信息管理模块”中重新加载发生变更的服务参数校验规则,该模式下采用局部加载模式,用于提升运行效率。如图4所示,步骤说明:步骤1:启动应用:按照应用的启动方式拉起应用;步骤2:启动服务参数校验信息代理模块:在步骤1启动过程中拉起服务参数校验信息代理模块;步骤3:查找应用下所有的服务参数校验规则:从“服务参数校验信息管理模块”中查找该应用下所有的服务参数校验规则;步骤4:缓存步骤3中查找的服务参数校验规则:将步骤3中查找的服务参数校验规则,通过应用内部的本地缓存或者分布式缓存进行存储,提升访问效率;步骤5:监听是否收到服务参数校验规则变更通知:该模块监听是否收到“服务参数校验信息定义模块”发送的服务参数校验规则变化,如果收到通知则执行步骤6,没有收到则继续监听;步骤6:判断服务参数校验规则变化的类型:如果服务参数校验规则变化的是新增或者修改类型则执行步骤7;如果是删除类型,执行步骤9;步骤7:查询变化的服务参数校验规则:根据变化的服务id,从“服务参数校验信息管理模块”查询变化的服务参数校验规则;步骤8:根据变化的服务id更新步骤4中的缓存:根据服务id,将步骤7查询出的新的服务参数校验规则加入到缓存;步骤9:根据变化的服务id删除步骤4中的缓存。五、服务参数校验代理模块:服务参数校验代理模块,作为应用的一部分并随应用的启动对外提供服务,应用停止则停止该模块;该模块根据动态代理技术拦截所有的服务请求,并根据“服务参数校验信息代理模块”中加载的所有服务参数校验规则,判断当前的服务是否需要校验;如果需要校验,则对服务的输入参数、输出参数根据定义的校验规则进行校验,校验通过则继续后续的业务逻辑执行,校验失败则返回校验失败信息,拒绝后续的业务逻辑执行;如果不需要校验,则直接执行具体的业务逻辑;通过代理技术实现了对服务api的透明化调用。如图5所示,步骤说明:步骤1:启动应用:按照应用的启动方式拉起应用;步骤2:启动服务参数校验代理模块:在步骤1启动过程中拉起服务参数校验代理模块,并根据“服务参数校验信息代理模块”中加载的所有服务参数校验信息进行校验;步骤3:代理所有服务实例:所有对服务的访问均通过服务代理进行动态代理拦截,对客户端调用完全透明;步骤4:判断服务是否需要拦截:根据步骤2加载的所有服务参数校验规则,如果调用的服务id存在服务参数校验规则定义,则执行步骤5;否则,调用的服务id不存在服务参数校验规则定义,则执行步骤6;步骤5:对服务输入参数进行校验:根据调用的服务id,从步骤2加载的服务参数校验规则中查找到对应的服务参数校验规则,对服务输入参数进行校验,校验通过执行步骤6,校验不通过执行步骤9;步骤6:执行服务逻辑:服务输入参数校验通过后,继续执行服务的具体业务逻辑;根据步骤4的判断,如果服务需要拦截,表示输出参数需要校验,则执行步骤7;如果服务不需要拦截,表示输出参数不需要校验,则执行步骤8;步骤7:对服务输出参数进行校验:对步骤6中服务逻辑的返回值作为输出参数进行校验,校验通过执行步骤8,校验不通过则执行步骤9;步骤8:返回服务输出参数:将步骤6执行的返回值作为输出参数返回到调用方;步骤9:返回校验错误信息:将校验不通过的信息返回给调用方,并结束本次服务调用。本发明以对微服务架构的订单应用为具体实施例:微服务架构的订单应用orderapp,对外提供订单的管理功能。主要提供如下2个接口,并添加了注解@servicevalidateannounce,表示可以被应用自动扫描发现用于后续的服务参数校验规则定义:1)我的订单列表查询接口;2)产品加入购物车接口;两个对外接口示例如下所示:/***我的订单列表查询*@paramuserid*@return*/@servicevalidateannouncepubliclist<order>querymyorder(stringuserid);/***产品加入购物车*@paramorderitemlist*@return*/@servicevalidateannouncepublicbooleanaddshoppingcar(list<orderitem>orderitemtlist);订单应用orderapp部署了三个实例用于对外提供服务,并注册到了服务注册中心,分别是:实例1:orderinstance1:对外提供的访问地址为192.168.1.1:8080;实例2:orderinstance2:对外提供的访问地址为192.168.1.2:8080实例3:orderinstance2:对外提供的访问地址为192.168.1.3:8080;场景:订单应用orderapp中的服务1):我的订单列表查询接口,服务2):产品加入购物车接口已经上线运行,需要在运行期动态设置服务的输入参数的校验规则,对服务的输出参数无需校验,并应用到订单应用orderapp的三个实例中,而无需停止订单应用,实现服务参数校验规则的热更新能力;接下来,根据本发明的方法,采用动态可配置的服务参数校验的系统和方法,来实现上面定义的业务场景,将会明显感受到本发明所具有的简单便捷的优势。一、服务收集管理模块:本模块负责收集订单应用orderapp的应用信息,订单应用orderapp下的三个订单应用的实例信息,订单应用orderapp下所有的需要进行服务参数配置管理的服务列表;并将收集的应用信息、应用实例信息,应用下的服务列表信息持久化,本例子采用数据库的方式进行存储,并提供查询管理接口,“服务参数校验信息定义模块”基于此接口查询需要管理的应用列表及应用下的服务列表。本模块的具体实现如下:1、收集应用信息:收集订单应用orderapp的应用id、应用名称、应用描述、应用注册时间等元信息,具体元信息参见下表:2、收集应用的实例信息:本模块通过服务注册中心收集订单应用orderapp的所有实例的应用实例id、ip地址、应用端口、实例状态、应用实例注册时间等元信息,本场景中设定了订单应用orderapp的三个示例都注册在了注册中心,通过注册中心收集应用实例元信息参见下表:应用实例元信息实例1实例2实例3应用实例idorderinstance1orderinstance2orderinstance3ip地址192.168.1.1192.168.1.2192.168.1.3应用端口808080808080实例状态online(在线)online(在线)online(在线)应用实例注册时间2019-11-1713:00:002019-11-1714:00:002019-11-1715:00:003、收集应用下服务信息:本模块通过在订单应用orderapp下自动扫描注解@servicevalidateannounce,获取所有的服务列表,服务信息包括的元数据有:服务id(在同一个应用内服务id全局唯一)、服务名称、服务全路径、方法名、参数列表信息、返回值信息;其中参数列表信息包括参数名称、参数类型;返回值信息包括返回值名称、返回值类型;场景中定义了2个接口,收集订单应用orderapp下的服务信息参见下表:其中参数列表信息中,如果有多个参数则使用“;”作为分隔符进行串接为一个完整的字符串。4、持久化收集的信息:将步骤1、步骤2、步骤3收集的订单应用,订单应用的实例,订单应用中需要校验的2个服务持久化到数据库中,执行的数据库示意脚本如下所示://持久化应用信息insertinto[应用表表名](应用id,应用名称,应用描述,应用注册时间)value('orderapp','订单应用','用于订单管理的应用','2019-11-1712:00:00');//持久化3条应用实例信息insertinto[应用实例表表名](应用id,应用实例id,ip地址,应用端口,实例状态,应用实例注册时间)value('orderapp','orderinstance1','192.168.1.1','8080','online','2019-11-1713:00:00');insertinto[应用实例表表名](应用id,应用实例id,ip地址,应用端口,实例状态,应用实例注册时间)value('orderapp','orderinstance2','192.168.1.2','8080','online','2019-11-1714:00:00');insertinto[应用实例表表名](应用id,应用实例id,ip地址,应用端口,实例状态,应用实例注册时间)value('orderapp','orderinstance3','192.168.1.3','8080','online','2019-11-1715:00:00');//持久化2个服务的信息insertinto[服务表表名](服务id,服务名称,服务全路径,方法名,参数列表信息,返回值信息)value('com.primeton.iorder.querymyorder(string)','我的订单列表查询接口',com.primeton.iorder.querymyorder',querymyorder,'userid:java.lang.string','java.util.list<com.primeton.order>');insertinto[服务表表名](服务id,服务名称,服务全路径,方法名,参数列表信息,返回值信息)value('com.primeton.iorder.addshoppingcar(list<orderitem>)','产品加入购物车接口',com.primeton.iorder.addshoppingcar',addshoppingcar,'orderitemlist:java.util.list<com.primeton.orderitem>','boolean');5、提供查询类api管理接口:本模块中提供查询api管理接口,提供的查询api管理接口如下所示://查询应用列表publiclist<appinfo>queryallapps();//根据应用id查询应用信息详情publicappinfoqueryappdetail(stringappid);//根据应用id查询应用的实例信息publiclist<appinstance>queryallinstances(stringappid);//根据应用id查询服务信息列表publiclist<services>queryallservice(stringappid);//根据服务id查询服务信息详情publicservicesqueryservicedetail(stringserviceid);二:服务参数校验信息定义模块针对场景,本模块主要负责2个具体服务(服务1:我的订单列表查询接口;服务2:产品加入购物车接口)的参数校验规则的定义。具体功能包括:定义服务参数检验规则模型,包括针对具体参数的校验规则;定义2个具体服务的参数校验规则,并通知三个应用实例,服务参数校验规则发生了变化,实现应用实例对参数校验规则的动态刷新;服务参数校验规则模型定义如下:1、支持的服务参数类型定义支持的基本类型参数:支持java中的string、int、long、double、boolean、char等;定义支持javabean类型参数:实际配置参数规则时,对javabean参数进行展开,针对javabean的每个基本类型的属性进行校验,如果属性仍然是javabean类型,则继续展开对应的属性进行校验;2、定义支持的校验规则本模块中定义支持四种校验规则,分别是必填校验、长度校验、定长校验、范围校验。具体的校验规则及实现参见下表:我的订单列表查询接口的校验规则定义如下:对参数userid需要满足:userid是必填的,最大长度不超过128;具体的参数校验规则说明参见下表:参数必填校验长度校验定长校验userid是128-产品加入购物车接口的校验规则定义如下:对参数orderitemlist需要满足:orderitemlist是必填的;同时由于orderitemlist是javabean类型,对内部的orderitem对象继续定义规则如下:javabean对象orderitem的属性productid(产品id)需要满足:必填,固定长度64位;javabean对象orderitem的属性num(产品数量)需要满足:必填,最大长度4位;具体的参数校验规则说明参见下表:服务参数校验规则与通知操作的步骤如下:1、查询所有的应用列表:从“服务收集管理模块”中根据提供的管理api:publiclist<appinfo>queryallapps(),查询出所有收集的应用,本示例查询出的应用为:orderapp;2、选择需要检验的应用:用户指定需要校验的应用为orderapp应用;3、查询该应用下所有的服务列表:根据“服务收集管理模块”中提供的管理api:publiclist<services>queryallservice(stringappid),查询orderapp应用下所有的服务列表,本示例会查询出两个服务,具体的服务id如下所示:服务1的id:com.primeton.iorder.querymyorder(string)服务2的id:com.primeton.iorder.addshoppingcar(list<orderitem>)4、选择需要校验的服务:本示例中需要对两个服务都进行参数校验规则设置,需要先后选中两个服务id;5、设置输入参数的校验规则:本示例以数据库的方式存储定义的校验规则,根据上面场景定义的参数校验规则分别设置服务1与服务2的输入参数校验规则如下:服务1:com.primeton.iorder.querymyorder(string)的参数校验规则如下:参数必填校验长度校验定长校验userid是128-服务2:com.primeton.iorder.addshoppingcar(list<orderitem>)的参数校验规则如下:6、设置输出参数的校验规则:本示例不需要设置输出参数的校验规则;7、调用“服务参数校验信息管理模块”,持久化校验规则:本示例中将步骤5、步骤6中定义的参数中定义的参数校验规则持久化到“服务参数校验信息管理模块”中;步骤5中服务1,对应的数据库保存语句如下所示://'y,y128,n'说明:第一段y表示必填校验,第二段y128表示需要长度校验并且最大长度为128,第三段n表示不需要定长校验;insertinto[参数校验规则表表名](序列号,服务id,参数,校验规则)value(1,'com.primeton.iorder.querymyorder(string)','userid','y,y128,n');步骤5中服务2,对应的数据库保存语句参见下表://'y,n,n'说明:第一段y表示必填校验,第二段n表示不需要长度校验,第三段n表示不需要定长校验;insertinto[参数校验规则表表名](序列号,服务id,参数,校验规则)value(2,'com.primeton.iorder.addshoppingcar(list<orderitem>)','orderitemlist','y,n,n');//'y,n,y64'说明:第一段y表示必填校验,第二段n表示不需要长度校验,第三段y64表示需要定长校验且定长64位;insertinto[参数校验规则表表名](序列号,服务id,参数,校验规则)value(3,'com.primeton.iorder.addshoppingcar(list<orderitem>)','orderitemlist/orderitem/productid','y,n,y64');//'y,y4,n'说明:第一段y表示必填校验,第二段y4表示需要长度校验且不超过4,第三段n表示不需要定长校验;insertinto[参数校验规则表表名](序列号,服务id,参数,校验规则)value(4,'com.primeton.iorder.addshoppingcar(list<orderitem>)','orderitemlist/orderitem/num','y,y4,n');8、查询该应用下所有的在线实例列表:根据“服务收集管理模块”提供的管理api:publiclist<appinstance>queryallinstances(stringappid)查询应用orderapp下所有的应用实例列表,根据该api查询的订单应用orderapp的所有在线实例如下所示:orderinstance1orderinstance2orderinstance39、通知所有实例的“服务参数校验信息代理模块”,通知服务参数校验规则变化:通知步骤8中查询出的3个应用实例orderinstance1,orderinstance2,orderinstance3;使用每个实例对应的ip地址+应用端口通知三个实例,该应用实例下的服务参数校验规则发生变化,“服务参数校验信息代理模块”会从“服务参数校验信息管理模块”中重新加载变化的服务参数校验规则(这里服务1与服务2的参数校验规则都发生了变化)。三:服务参数校验信息管理模块本示例中采用数据库的方式对服务参数校验信息进行存储,负责持久化“服务参数校验信息定义模块”中定义的服务参数校验规则,并提供服务参数校验规则管理类api接口。服务参数校验信息管理模块提供的管理类api接口实现如下所示://根据应用id,查询该应用下所有的服务参数校验规则publiclist<paramrule>queryallrules(stringappid);//根据服务参数id,查询服务参数校验规则详细信息publicparamrulequeryparamrule(stringserviceid);//新增服务参数校验规则publicintinsertparamrule(paramrulerule);//更新服务参数校验规则publicintupdateparamrule(paramrulerule);//删除服务参数校验规则publicintdeleteparmarule(paramrulerule);四:服务参数校验信息代理模块本示例中,服务参数校验信息代理模块作为订单应用orderapp的一部分(以jar的方式加入到订单应用中)启动并提供服务;订单应用orderapp启动时,本模块从“服务参数校验信息管理模块”中加载订单应用orderapp下所有的服务的服务参数校验规则,并缓存(本示例采用本地缓存的方式)在订单应用orderapp内部,用于提升访问效率;同时监听“服务参数校验信息定义模块”中发出的服务参数变更通知,并从“服务参数校验信息管理模块”中重新加载发生变更的服务参数校验规则,并刷新本地缓存;服务参数校验信息代理模块操作的步骤如下:1、启动应用:启动订单应用orderapp的三个应用实例:orderinstance1,orderinstance2,orderinstance3;场景中定义了订单应用为微服务架构,采用java-jar的方式直接启动,启动命令如下所示:nohupjava-jarorderapp-1.0.0.0.jar&2、启动服务参数校验信息代理模块:在步骤1中启动三个订单应用实例时,服务参数校验信息代理模块作为一个jar被自动加载起来,并通过静态块拉起该服务。定义服务参数校验信息代理模块的入口类:serivevalidateproxymodule,通过start()方法拉起对应的功能,启动示例代码如下所示:3、查找应用下所有的服务参数校验规则:启动订单应用orderapp从“服务参数校验信息管理模块”提供的管理api:publiclist<paramrule>queryallrules(stringappid),查找该应用下所有的服务参数校验规则,根据上面场景定义,共查询出4条校验规则,查询的结果如下所示:1,'com.primeton.iorder.querymyorder(string)','userid','y,y128,n'2,'com.primeton.iorder.addshoppingcar(list<orderitem>)','orderitemlist','y,n,n'3,'com.primeton.iorder.addshoppingcar(list<orderitem>)','orderitemlist/orderitem/productid','y,n,y64'4,'com.primeton.iorder.addshoppingcar(list<orderitem>)','orderitemlist/orderitem/num','y,y4,n'4、缓存步骤3中查找的服务参数校验规则:将步骤3中查找的4条服务参数校验规则,通过订单应用orderapp应用内部的本地缓存进行存储,提升访问效率;5、监听是否收到服务参数校验规则变更通知:该模块监听是否收到“服务参数校验信息定义模块”发送的服务参数校验规则变化,如果收到通知则执行步骤6,没有收到则继续监听;6、判断服务参数校验规则变化的类型:通过“服务参数校验信息定义模块”重新更新第四条规则,将num的长度修改为5位,修改后的参数校验规则如下所示:4,'com.primeton.iorder.addshoppingcar(list<orderitem>)','orderitemlist/orderitem/num','y,y5,n'本模块会收到服务参数orderitemlist/orderitem/num校验规则变化是修改,则执行步骤7;7、查询变化的服务参数校验规则:根据变化的服务id:“com.primeton.iorder.addshoppingcar(list<orderitem>)”,从“服务参数校验信息管理模块”查询变化的服务参数校验规则;8、根据变化的服务id更新步骤4中的缓存:根据服务id:“com.primeton.iorder.addshoppingcar(list<orderitem>)”,将步骤7查询出的新的服务参数校验规则加入到本地缓存中;9、根据变化的服务id删除步骤4中的缓存:本示例中没有删除,所以不会执行该操作;五:服务参数校验代理模块本示例中,服务参数校验代理模块作为订单应用orderapp的一部分(以jar的方式加入到订单应用中)启动并提供服务;本模块动态代理所有对外的服务请求,并根据“服务参数校验信息代理模块”中加载的所有服务参数校验规则,判断当前的服务是否需要校验;如果需要校验,则对服务的输入参数、输出参数根据定义的校验规则进行校验,校验通过则继续后续的业务逻辑执行,校验失败则返回校验失败信息,拒绝后续的业务逻辑执行;如果不需要校验,则直接执行具体的业务逻辑;通过代理技术实现了对服务api的透明化调用。服务参数校验代理模块操作的步骤如下所示:1、启动应用:启动订单应用orderapp的三个应用实例:orderinstance1,orderinstance2,orderinstance3;场景中定义了订单应用为微服务架构,采用java-jar的方式直接启动,启动命令参见下表:nohupjava-jarorderapp-1.0.0.0.jar&2、启动服务参数校验代理模块:在步骤1中启动三个订单应用实例时,服务参数校验代理模块作为一个jar被自动加载起来,并通过静态块拉起该服务。定义服务参数校验代理模块的入口类:serivevalidateexecuteproxymodule,通过start()方法拉起对应的功能,启动示例代码如下所示:3、代理所有服务实例:订单应用orderapp所有的对外服务对象获得时,返回的是经过服务参数校验代理模块动态代理的对象,通过静态方法createapiproxy进行自动创建,代理类为validateapiproxyhandler;获取代理方法及代理类如下所示:4、判断服务是否需要拦截:当用户访问接口“我的订单列表查询接口”时,传入参数值为“testuserid”,由于前面已经定义了该接口的服务参数校验规则,则需要对该接口进行拦截调用,执行步骤5;5、对服务输入参数进行校验:根据调用的服务id:com.primeton.iorder.querymyorder(string),从步骤2加载的服务参数校验规则中查找到对应的服务参数校验规则,查询到的服务参数校验规则如下所示:'com.primeton.iorder.querymyorder(string)','userid','y,y128,n'对服务输入参数:“testuserid”进行校验,长度为10,小于最大长度128,校验通过,继续执行步骤6;6、执行服务逻辑:继续执行接口“我的订单列表查询接口”实际的逻辑操作;由于对输出参数不需要校验,则直接执行步骤8;7、对服务输出参数进行校验:通过步骤6中判断,不需要对服务输出参数进行校验;8、返回服务输出参数:将步骤6执行的返回值作为输出参数返回到调用方;9、返回校验错误信息:本示例没有校验错误,故执行不到本步骤;按照以上步骤,根据业务需求灵活的完成了对订单应用下服务参数的校验规则的动态定义与管理,开发人员只需要简单的按照规则配置服务参数的校验规则即可。由于实现了对服务参数校验配置与业务代码分离的机制,并提供集中化的动态配置、热更新能力,从而实现了服务参数校验规则与业务代码解耦,解决服务参数校验规则对业务代码侵入性强的问题,降低业务代码的复杂度、提升可读性;同时实现无需停止业务系统即可进行服务参数规则动态调整的能力;另外提供服务参数校验规则集中管理的方式,提供服务参数校验规则全局的管理视角进行服务治理,具备较强的推广价值。本发明针对分布式架构下一种动态可配置的服务参数校验的系统和方法,通过提供一种对服务参数校验配置与业务代码分离的机制,将服务参数校验规则与业务代码解耦,解决服务参数校验规则对业务代码侵入性强的问题,同时降低业务代码的复杂度、提升可读性。提供对服务参数的动态配置和热更新能力,在业务系统运行期支持对服务参数校验规则的实时配置并热更新生效,无需停止业务系统实现服务参数规则的动态调整。提供对服务及服务参数校验规则集中管理的方式,做到服务参数校验规则的集中化管理,提供服务及服务参数校验规则的全局业务视角。采用了本发明的分布式架构下实现动态可配置的服务参数校验处理系统及其方法,实现了对服务参数校验配置与业务代码分离的机制,并提供集中化的动态配置、热更新能力,从而实现了服务参数校验规则与业务代码解耦,解决服务参数校验规则对业务代码侵入性强的问题,降低业务代码的复杂度、提升可读性;同时实现无需停止业务系统即可进行服务参数规则动态调整的能力;另外提供服务参数校验规则集中管理的方式,提供服务参数校验规则全局的管理视角进行服务治理,具备较强的推广价值。在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限制性的。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1