一种多语言云编译的动态微服务调用方法及装置与流程

文档序号:12469657阅读:251来源:国知局
一种多语言云编译的动态微服务调用方法及装置与流程

本发明属于计算机技术领域,具体涉及一种多语言云编译的动态微服务调用方法及装置。



背景技术:

随着面向对象设计模式和企业架构模式出现,一个系统从功能实现、代码组织等角度来思考,通常分为三个层次:表示层、业务逻辑层、数据访问层,表示层是基于Html的Web页面,通过RestAPI取数据进行渲染;业务逻辑层是应用系统的核心代码,通常用来实现系统业务规则;数据访问层是访问数据库或信息的中间媒介;这是常见的经典三层架构模式,这种模式虽然在一定程度上解决了系统模块间调用复杂、职责不清的问题,但这种传统的架构风格在开发效率、构建部署、维护成本,以及可扩展性、可伸缩方面有很大不足和局限性。

这种架构方式的系统开发完成后是各个功能、模块相对固定的,提供的接口和实现都是约定好的,最终经过开发、编译、打包、部署,最后运行是放在一个进程中,它就像一块铁块,笨重且无法拆分,也无法扩展,后期系统中任何一点的变化都需要线下重新开发、编译,打包,部署,整个过程周期长、维护成本高。而随着业务系统的不断发展,需求的不断增加,系统的可扩展性、可维护性、可运维、可管理性却在不断下降。

综合现有技术中存在以下缺点:(1)扩展复杂:代码全部在一个项目系统中,这使得整个扩展过程非常复杂繁琐,并且有可能破还原有代码的结构;(2)代码重用率低:系统代码逻辑只是为了当前所开发并耦合到系统中,这降低了代码的重用率;。(3)开发周期长效率低:扩展或添加新的需求时,需要开发人员线下重新开发、编译、测试、上传、配置、打包、部署系统,这使得开发周期很长效率很低。(4)难以维护:系统开发人员和技术的应用有可能都已经迭代过无数次,系统中代码之间的互相调用、互相耦合也错综复杂,不是很了解系统的人不敢轻举妄动。随着系统的需求和功能越来越多,团队越来越大,相应的沟通成本、开发成本、管理成本都会成倍增加,当系统出现缺陷时,也会造成分析问题、定位问题、修复问题的时间更长;随着代码量的增加也有可能导致“修复越多,缺陷越多”的恶性循环;系统中一个小的改动就需要重新部署整个应用系统。(5)开发语言局限性:应用系统如果使用某种语言开发,那么再次需求扩展时则还必须已经此语言进行扩展,无法尝试新的编程语言或框架,这目前在现实中也不可能使用一个技术平台或方案来解决所有问题。(6)硬件成本高难以水平扩展:所有的程序代码在服务器的同一个进程中,会导致水平扩展难和成本高的局面,因为系统中不同的模块功能实际上对服务器的要求是不同的,有的是CPU密集计算机型,需要有性能较强的CPU处理器,有的是需要内存IO密集型,需要使用大量内存进行数据缓存,如果将系统所要求的服务器基础设施按同一种标准去采购,则硬件成本会非常高。(7)可靠性低:所有模块功能都运行在一个进程中,任何一个模块功能中的一个错误bug,比如内存泄露/CPU持续走高,将会有可能弄垮或拖慢整个进程,从而影响到整个应用的可靠性。(8)无法分布式部署支撑高并发:由于无法将外部依赖的Dll或Jar与现有系统程序进行物理机进行有效的分离,随着系统的不断升级和扩展,这样庞大且复杂的系统,要伸缩必须为整体式的伸缩,无法有效分离式伸缩,系统中用户所需要经常操作的核心业务点可能只有30%,而现在却要将非核心的70%做同样的部署伸缩,不能达到资源的最大化集约使用。(9)影响持续集成和交付:由于业务系统的庞大复杂,加上无数次的扩展升级,所以构建一次的时间也会非常漫长,失败的次数也会大大增加,如果构建过程错误,排查问题也会非常困难。另外对系统做的任何一点细微的修改都需要将整个系统重新构建、重新部署。多个开发人员共同开发一个系统,还需要等待其他开发人员完成后才能部署,这大大降低了团队的灵活性和功能交付频率;(10)另外在项目打开和运行十分缓慢、系统难以开发、测试、持续集成困难、部署环境依赖复杂、技术栈绑定,编程语言、框架、数据库的升级和更换非常困难等等。

如何应对这些问题,对软件系统的灵活性、开放性、可维护性、可伸缩性,以及软件系统对于市场和客户的反应能力都提出了更高的要求。如何快速地增加、扩展、升级当前标准的系统功能为客户量身定制,并且有效的保障提升软件开发质量和开发效率,已经成为软件行业的重要挑战。

现有的业务系统在调用过程中只能对整个业务系统进行调用,在业务系统进行升级或者出现故障(例如,业务系统崩溃或者CPU被占用的内存急剧飙升)的时候,在服务器中,该业务系统不能执行相应的功能,通过该业务系统完成的业务也无法正常运行。



技术实现要素:

本发明所要解决的技术问题是如何使得业务系统在进行升级或者出现故障的时候,服务器仍然可以执行预设的任务,以保证业务系统的正常运行,并且有效提高系统功能扩展的灵活性、开放性、可维护性以及可伸缩性。

针对该问题,本发明提供了一种多语言云编译的动态微服务调用方法,包括:

A1:预设服务器在接收到调用第一微服务的调用请求后,判断所述预设服务器中是否存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例,若是,运行所述第一微服务实例,并将运行结果反馈至终端;否则,执行步骤A2;

A2:从预设的微服务脚本仓库中读取所述第一脚本代码,将所述第一脚本代码载入脚本编译引擎,对所述第一脚本代码进行编译,生成新的微服务实例,以作为所述第一微服务实例后,运行所述第一微服务实例并将运行结果反馈至终端;

其中,所述微服务脚本仓库包括预先创建的所有微服务的脚本代码;所述微服务为一段脚本代码,对所述脚本代码进行编译形成能够实现预设功能的微服务实例。

优选地,所述步骤A1包括:

A11:预设服务器在接收到调用第一微服务的调用请求后,判断所述预设服务器中是否存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例,若是,执行步骤A12,否则,执行步骤A2;

A12:根据所述第一微服务实例的标识在所述微服务脚本仓库中查找具有所述标识的第二微服务的第二脚本代码,判断所述第二脚本代码对应的哈希值是否与预设哈希值相同,若是,运行所述第一微服务实例,并将运行结果反馈至所述终端,否则,执行步骤A13;

A13:从所述微服务脚本仓库中读取所述第二脚本代码,将所述第二脚本代码载入脚本编译引擎,编译生成第二微服务实例,运行所述第二微服务实例,并将运行结果反馈至所述终端。

优选地,所述步骤A1之前还包括:

网关在接收到所述终端发送的调用所述第一微服务的调用请求后,在预先创建的微服务列表中查找与所述第一微服务对应的服务相关的服务器,根据预设规则从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器,并将所述第一微服务的调用请求发送至所述预设服务器;

其中,与所述第一微服务对应的服务相关的服务器,指的是服务器所执行的任务是与所述第一微服务对应的功能相关的;所述微服务列表包括所述微服务脚本仓库中所有的微服务的微服务信息,所述微服务信息至少包括:微服务的标识、微服务所在的服务器的标识、微服务所在的服务器当前的CPU使用率、微服务所在的服务器当前的内存使用率、微服务所在的服务器连接终端的连接数、微服务所在的服务器最快响应时间、微服务所在的服务器的配置对应的权重。

优选地,所述预设规则包括:采用随机法或者轮循法从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的最小连接数从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的CPU使用率或内存使用率从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器最快响应时间从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的配置对应的权重从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器。

优选地,还包括:

判断所述微服务实例运行的过程中是否出现异常,若是,将运行所述微服务实例的服务器根据所述异常判断的异常原因发送至网关,以使所述网关记录所述微服务实例的异常执行过程。

另一方面,本发明还提供了一种多语言云编译的动态微服务调用装置,包括:

判断模块,用于在预设服务器在接收到调用第一微服务的调用请求后,判断所述预设服务器中是否存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例,若是,运行所述第一微服务实例,并将运行结果反馈至终端;

编译模块,判断所述预设服务器中是不存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例,从预设的微服务脚本仓库中读取所述第一脚本代码,将所述第一脚本代码载入脚本编译引擎,对所述第一脚本代码进行编译,生成新的微服务实例,以作为所述第一微服务实例后,运行所述第一微服务实例并将运行结果反馈至终端;

其中,所述微服务脚本仓库包括预先创建的所有微服务的脚本代码;所述微服务为一段脚本代码,对所述脚本代码进行编译形成能够实现预设功能的微服务实例。

优选地,所述判断模块包括:

第一判断单元,用于在预设服务器在接收到调用第一微服务的调用请求后,判断所述预设服务器中是否存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例;

第二判断单元,用于在判断所述预设服务器中存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例后,根据所述第一微服务实例的标识在所述微服务脚本仓库中查找具有所述标识的第二微服务的第二脚本代码,判断所述第二脚本代码对应的哈希值是否与预设哈希值相同,若是,运行所述第一微服务实例,并将运行结果反馈至所述终端;

编译单元,用于在判断所述第二脚本代码对应的哈希值是否与预设哈希值不相同后,从所述微服务脚本仓库中读取所述第二脚本代码,将所述第二脚本代码载入脚本编译引擎,编译生成第二微服务实例,运行所述第二微服务实例,并将运行结果反馈至所述终端。

优选地,还包括选择模块,所述选择模块用于网关在接收到所述终端发送的调用所述第一微服务的调用请求后,在预先创建的微服务列表中查找与所述第一微服务对应的服务相关的服务器,根据预设规则从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器,并将所述第一微服务的调用请求发送至所述预设服务器;

其中,与所述第一微服务对应的服务相关的服务器,指的是服务器所执行的任务是与所述第一微服务对应的功能相关的;所述微服务列表包括所述微服务脚本仓库中所有的微服务的微服务信息,所述微服务信息至少包括:微服务的标识、微服务所在的服务器的标识、微服务所在的服务器当前的CPU使用率、微服务所在的服务器当前的内存使用率、微服务所在的服务器连接终端的连接数、微服务所在的服务器最快响应时间、微服务所在的服务器的配置对应的权重。

优选地,所述预设规则包括:采用随机法或者轮循法从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的最小连接数从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的CPU使用率或内存使用率从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器最快响应时间从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的配置对应的权重从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器。

优选地,所述编译模块还用于判断所述微服务实例运行的过程中是否出现异常,若是,将运行所述微服务实例的服务器根据所述异常判断的异常原因发送至网关,以使所述网关记录所述微服务实例的异常执行过程。

本发明提供的多语言云编译的动态微服务调用方法及装置,预设服务器接收到调用第一微服务的调用请求后,在预设服务器中查找相应的第一微服务实例并运行,或者从微服务脚本仓库中查找相应的第一微服务对应的第一脚本代码,对该第一脚本代码进行编译形成第一微服务实例后运行,并将运行结果反馈至终端。由于调用的微服务是独立于整个业务系统的,能够实现预设功能的一个功能点,而不是整个业务系统,因此,业务系统在进行升级或者出现故障的时候,服务器仍然可以通过调用能够实现预设功能的可用的微服务实现相应的功能,而不需要调用整个业务系统。解决了使得业务系统在进行升级或者出现故障的时候,服务器仍然可以执行预设的任务,以保证业务系统的正常运行的问题。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例提供的多语言云编译的动态微服务调用方法流程示意图;

图2是本发明实施例提供的多语言云编译的动态微服务调用装置结构框图;

图3是本发明实施例提供的多语言动态微服务调用过程流程示意图;

图4是本发明实施例提供的多语言动态微服务编辑及调用过程的框架示意图;

图5是本发明实施例提供的多语言动态微服务编辑过程流程示意图;

图6是本发明实施例提供的多语言动态微服务在线开发的界面结构示意图;

图7是本发明实施例提供的多语言动态微服务的属性结构示意图;

图8是本发明实施例提供的多语言动态微服务的进程实例状态上报示意图;

图9是本发明实施例提供的多语言动态微服务的API网关处的微服务的属性示意图;

图10是本发明实施例提供的多语言动态微服务容器内存装置结构图;

图11是本发明实施例提供的多语言动态微服务扩容过程流程示意图;

图12是本发明实施例提供的多语言动态微服务部署/分布/伸缩的示意图;

图13是本发明实施例提供的多语言动态微服务容器管理模块装置示意图;

图14是本发明实施例提供的多语言动态微服务编译的模块示意图;

图15是本发明实施例提供的多语言动态微服务的微服务列表结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

图1是本发明实施例提供的语言云编译的动态微服务调用方法的流程示意图,参见图1,该方法包括:

A1:预设服务器在接收到调用第一微服务的调用请求后,判断所述预设服务器中是否存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例,若是,运行所述第一微服务实例,并将运行结果反馈至终端;否则,执行步骤A2;

A2:从预设的微服务脚本仓库中读取所述第一脚本代码,将所述第一脚本代码载入脚本编译引擎,对所述第一脚本代码进行编译,生成新的微服务实例,以作为所述第一微服务实例后,运行所述第一微服务实例并将运行结果反馈至终端;

其中,所述微服务脚本仓库包括预先创建的所有微服务的脚本代码;所述微服务为一段脚本代码,对所述脚本代码进行编译形成能够实现预设功能的微服务实例。

可理解的是,调用请求也是一段代码,根据调用请求的代码解析出该调用请求对应的微服务,从而实现对相应的微服务的调用。微服务的脚本仓库中存储了开发人员根据实际业务的需求(例如,添加成绩、发送短信等)创建的微服务对应的脚本代码。

微服务实例是微服务的脚本代码实例化后的结果,存在于服务器中,服务器接收到调用请求后,若该服务器中存在该微服务实例,直接执行该微服务实例即可。若不存在需要从微服务脚本仓库中调用该微服务的脚本代码,将其载入脚本代码编译引擎,编译形成新的微服务实例,进而执行该微服务实例。

需要说明的是,微服务是能够实现预设功能的功能点,功能点(例如,学生管理系统中用来实现添加成绩这一功能的脚本代码)是实现业务系统(例如,学生管理系统)中的一个功能的功能模块。与现有技术不同的是,微服务的脚本代码编译后可以业务系统中的某一个功能,但其是一个独立的功能模块,其功能的实现不受整个业务系统的限制。基于这样的微服务,在实现业务系统中的某一个功能时,可以只通过该微服务来实现,而不依赖于整个业务系统。微服务的脚本代码存储于服务器中,一般来说,当存储该微服务脚本代码的服务器正常运行,且当前通过该服务器调用该微服务的终端数量在没有超过最大限制值,则该微服务对应的节点就是可用的,也就是说该微服务对应的服务是可用的。

举例来说,微服务是用于实现预设业务系统中的预设功能的脚本代码,例如,在学生管理系统这一业务系统中,微服务A用于实现学生成绩添加这一功能、微服务B用于实现学生个人信息添加这一功能、微服务C用于实现学生信息删除和更改这一功能……,所有的微服务均只能实现学生管理系统中的一个预设功能,整个学生管理系统按照一定的规则对这些微服务进行调用实现整个学生管理系统的功能。学生管理系统的各个微服务之间相互独立,当个别微服务出现故障或者需要进行升级时,不会造成整个学生管理系统不能调用。另一方面,在系统开发的过程中,各个微服务也可以采用不同的编程开发语言(例如,C#、VB.NET、JAVA、Python)进行编写。这种方式容易使不同的开发人员尝试技术创新,甚至每个功能扩展点都可以采用不同的编程语言编写,实现的功能组件的共用,提高了业务系统创建的效率。

本发明提供的多语言云编译的动态微服务调用方法,服务器接收到调用微服务的调用请求后,在服务器中查找相应的微服务实例并运行,或者查找相应的微服务对应的脚本代码,对该脚本代码进行编译形成微服务实例后运行,并将运行结果反馈至终端。由于调用的微服务是独立于整个业务系统的,能够实现预设功能的一个功能点,而不是整个业务系统,因此,业务系统在进行升级或者出现故障的时候,服务器仍然可以通过调用能够实现预设功能的微服务实现相应的功能,而不需要调用整个业务系统。解决了使得业务系统在进行升级或者出现故障的时候,服务器仍然可以执行预设的任务,以保证业务系统的正常运行的问题。

进一步地,所述步骤A1包括:

A11:预设服务器在接收到调用第一微服务的调用请求后,判断所述预设服务器中是否存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例,若是,执行步骤A12,否则,执行步骤A2;

A12:根据所述第一微服务实例的标识在所述微服务脚本仓库中查找具有所述标识的第二微服务的第二脚本代码,判断所述第二脚本代码对应的哈希值是否与预设哈希值相同,若是,运行所述第一微服务实例,并将运行结果反馈至所述终端,否则,执行步骤A13;

A13:从所述微服务脚本仓库中读取所述第二脚本代码,将所述第二脚本代码载入脚本编译引擎,编译生成第二微服务实例,运行所述第二微服务实例,并将运行结果反馈至所述终端。

需要说明的是,第一微服务实例的标识可以是生成所述第一微服务实例的脚本代码对应的哈希值,也可以是该微服务的名称。通过该标识可以找到生成该第一微服务实例的脚本代码,进而生成该脚本代码的哈希值,将该哈希值与存储的生成第一微服务实例的脚本代码的哈希值进行对比,若相同,说明该脚本代码没有发生变化,直接运行该微服务实例即可。若不相同,说明该脚本代码发生了变化,则不再运行第一微服务实例,而是将变化后的第二微服务的脚本代码载入脚本编译引擎,编译生成第二微服务实例后运行。

进一步地,网关在接收到所述终端发送的调用所述第一微服务的调用请求后,在预先创建的微服务列表中查找与所述第一微服务对应的服务相关的服务器,根据预设规则从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器,并将所述第一微服务的调用请求发送至所述预设服务器;

其中,与所述第一微服务对应的服务相关的服务器,指的是服务器所执行的任务是与所述第一微服务对应的功能相关的;所述微服务列表包括所述微服务脚本仓库中所有的微服务的微服务信息,所述微服务信息至少包括:微服务的标识、微服务所在的服务器的标识、微服务所在的服务器当前的CPU使用率、微服务所在的服务器当前的内存使用率、微服务所在的服务器连接终端的连接数、微服务所在的服务器最快响应时间、微服务所在的服务器的配置对应的权重。

需要说明的是,第一微服务对应的服务与第一微服务实现的功能相对应。例如,第一微服务编译后的第一微服务实例可以实现添加成绩这个功能,那么,第一微服务对应的服务就是添加成绩。与第一微服务对应的服务相关的服务器是与第一微服务实现的功能相对应的服务器。例如,服务器实现的功能是添加学生信息,那么实现添加成绩这一服务的第一服务对应的服务器就是能够实现添加学生信息的服务器。

进一步地,所述预设规则包括:采用随机法或者轮循法从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的最小连接数从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的CPU使用率或内存使用率从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器最快响应时间从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的配置对应的权重从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器。

进一步地,还包括:

判断所述微服务实例运行的过程中是否出现异常,若是,将运行所述微服务实例的服务器根据所述异常判断的异常原因发送至网关,以使所述网关记录所述微服务实例的异常执行过程。

所述服务器将运行结果反馈至所述终端的过程具体包括:

服务器将所述运行结果反馈至网关后,网关将所述运行结果包装成预设通信协议下的目标运行结果,并将所述目标运行结果反馈至所述终端;

其中,所述预设通信协议是所述终端和所述网关之间的通信协议,所述目标运行结果是所述运行结果根据所述预设通信协议进行转换得到。

异常运行信息的记录以便快速找到微服务出现问题的根源,这种模块化的业务系统在某个微服务故障时,不影响业务系统其它微服务的运行。

包装过程是为了提高信息传输的效率,例如,可以将服务器与网关之间的socket连接转换为终端和网关之间的Http格式的连接。

网关处的微服务列表中包括了所有服务器中的微服务的信息,根据这些信息,网关可以判断当前需要调用的微服务存在于哪一个服务器中,进而将该微服务的请求信息发送至该微服务。

哈希运算的引入是为了提高查找效率,每一个微服务的脚本代码对应唯一一个哈希值,因而通过微服务的脚本代码对应的哈希值可以实现微服务的快速查找。

另一方面,图2是本发明实施例提供的多语言云编译的动态微服务调用装置结构框图。参见图2,该多语言云编译的动态微服务调用装置20,包括:

判断模块21,用于在预设服务器在接收到调用第一微服务的调用请求后,判断所述预设服务器中是否存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例,若是,运行所述第一微服务实例,并将运行结果反馈至终端;

编译模块22,用于在判断所述预设服务器中不存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例,从预设的微服务脚本仓库中读取所述第一脚本代码,将所述第一脚本代码载入脚本编译引擎,对所述第一脚本代码进行编译,生成新的微服务实例,以作为所述第一微服务实例后,运行所述第一微服务实例并将运行结果反馈至终端;

其中,所述微服务脚本仓库包括预先创建的所有微服务的脚本代码;所述微服务为一段脚本代码,对所述脚本代码进行编译形成能够实现预设功能的微服务实例。

本发明提供的多语言云编译的动态微服务调用装置20,判断模块21在服务器接收到调用微服务的调用请求后,在服务器中查找相应的微服务实例并运行,或者编译模块22查找相应的微服务对应的脚本代码,对该脚本代码进行编译形成微服务实例后运行,并将运行结果反馈至终端。由于调用的微服务是独立于整个业务系统的,能够实现预设功能的一个功能点,而不是整个业务系统,因此,业务系统在进行升级或者出现故障的时候,服务器仍然可以通过调用能够实现预设功能的微服务实现相应的功能,而不需要调用整个业务系统。解决了使得业务系统在进行升级或者出现故障的时候,服务器仍然可以执行预设的任务,以保证业务系统的正常运行的问题。

优选地,所述判断模块包括:

第一判断单元,用于在预设服务器在接收到调用第一微服务的调用请求后,判断所述预设服务器中是否存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例;

第二判断单元,用于在判断所述预设服务器中存在对所述第一微服务的第一脚本代码编译后形成的第一微服务实例后,根据所述第一微服务实例的标识在所述微服务脚本仓库中查找具有所述标识的第二微服务的第二脚本代码,判断所述第二脚本代码对应的哈希值是否与预设哈希值相同,若是,运行所述第一微服务实例,并将运行结果反馈至所述终端;

编译单元,用于在判断所述第二脚本代码对应的哈希值是否与预设哈希值不相同后,从所述微服务脚本仓库中读取所述第二脚本代码,将所述第二脚本代码载入脚本编译引擎,编译生成第二微服务实例,运行所述第二微服务实例,并将运行结果反馈至所述终端。

优选地,还包括还包括选择模块,所述选择模块用于网关在接收到所述终端发送的调用所述第一微服务的调用请求后,在预先创建的微服务列表中查找与所述第一微服务对应的服务相关的服务器,根据预设规则从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器,并将所述第一微服务的调用请求发送至所述预设服务器;

其中,与所述第一微服务对应的服务相关的服务器,指的是服务器所执行的任务是与所述第一微服务对应的功能相关的;所述微服务列表包括所述微服务脚本仓库中所有的微服务的微服务信息,所述微服务信息至少包括:微服务的标识、微服务所在的服务器的标识、微服务所在的服务器当前的CPU使用率、微服务所在的服务器当前的内存使用率、微服务所在的服务器连接终端的连接数、微服务所在的服务器最快响应时间、微服务所在的服务器的配置对应的权重。

优选地,所述预设规则包括:采用随机法或者轮循法从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的最小连接数从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的CPU使用率或内存使用率从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器最快响应时间从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器、根据所述微服务列表中记载的服务器的配置对应的权重从与所述第一微服务对应的服务相关的服务器中选择一个服务器作为所述预设服务器。

进一步地,所述编译模块还用于判断所述微服务实例运行的过程中是否出现异常,若是,将运行所述微服务实例的服务器根据所述异常判断的异常原因发送至网关,以使所述网关记录所述微服务实例的异常执行过程。

参见图4,服务器中的各种微服务(例如,图4中的微服务A、微服务B等)由开发人员在线开发。服务器接收到调用请求后,根据请求信息调用微服务(如图4所示,可以调用单独的一个微服务,也可以调用两个或者多个微服务,例如,按照一定的规则调用微服务A和微服务B,这种调用方式相当于调用了一个新的微服务F),在微服务完成预设功能后,将执行任务的结果反馈至终端,在反馈的过程中信息传输的途径会由网关进行包装,从socket传输转换为http的传输方式后,将结果反馈至终端。其中,socket传输是网关和服务器之间的数据传输方式,http的传输方式是网关和终端之间的传输方式。

作为一种具体的实施例,微服务的调用过程参见图3,多语言动态微服务调用过程流程示意图,包括如下步骤:

1)前端业务系统,发起业务服务请求调用,传递到动态微服务API网关。

2)根据请求服务参数、用户信息,判断用户身份是否已经验证。

3)如果身份验证已经通过,则跳转到5。

4)如果身份验证没有通过,则跳转到28。

5)根据请求服务参数,判断此动态微服务是否已经在动态微服务框架中注册。

6)如果此请求的动态微服务已经注册,则跳转到8。

7)如果此请求的动态微服务没有注册,则跳转到28。

8)判断此动态微服务在注册列表中是否有效、是否健康,必须为有效的且至少有一个微服务节点可以使用。

9)如果此动态服务有效且有可用节点,则跳转到11。

10)如果此动态服务无效或无可用节点,则跳转到28。

11)选择一种负载均衡调度策略。

微服务的负载均衡策略、采用以下6种方式:

1.随机

2.轮循

3.最小连接数

4.CPU/内存最小利用率

5.最快响应时间

6、服务器配置对应的权重

其中最小连接数、CPU/内存最小利用率、最快响应时间、之前已经由底层的各个微服务定期上报给微服务API网关/综合管理调度器,所以可以很快速从综合管理调度器中获取到这些值,从多个可用的微服务节点中选择出最一个最佳节点,进行下一步请求路由。

12)将动态微服务请求包装,这里的包装主要是将rest(Http)请求包装为微服务内部所需要的Thrift(Socket)通信传输协议,然后路由至实际远程微服务节点。

13)传递包装的请求信息,如果遇到网络中断或无响应,则跳转到8。

14)根据微服务哈希标识,检测容器内存是否已经编译存在此实例或微服务脚本代码发生变化。

15)如果此动态微服务实例已经存在,则跳转到17。

16)如果此动态微服务实例不存在,则跳转到24。

17)如果此动态微服务实例脚本代码未发生变化,则跳转到19。

18)如果此动态微服务实例脚本代码已经发生变化(当动态微服务脚本代码发生变化时,原实例失效,新实例产生,这里是使用时再产生,不调用使用不产生),则跳转到24。

19)动态微服务从内存读取定位已编译的内存服务实例。

20)微服务动态脚本执行引擎驱动运行实例运行指定函数方法。

21)如果执行异常或超时,则跳转到22,再跳转到28。

22)异步记录运行日志&性能、耗时情况调用计数器加1,更新最后调用时间。

23)运行结果返回动态微服务网关。

24)从动态微服务脚本Nosql仓库中读取脚本代码。

25)将脚本代码载入动态微服务脚本编译引擎。

26)加载动态微服务关联语言外部关联模块和资源进行编译。

27)将编译内存字节放置于内存并实例化,然后跳转到19。

28)结束返回友好信息给前端调用者。

当然,调用的这些微服务是之前通过以下方式添加至服务器中的:参见图5:

1)根据业务系统划分出来的微服务在线添加/编辑动态脚本代码。添加的信息有:微服务中英文标识、允许最大最小服务实例个数、微服务服务类型(CPU消耗型/内存消耗型)、微服务所用语言(C#/VB.NET/JAVA/Python)、微服务执行方式(同步执行/异步队列)、微服务动态脚本代码、超时限制、动态伸缩扩容阈值(CPU/内存)。

2)将微服务英文标识、业务脚本代码进行并进行唯一性哈希、生成一个36位MD5字符串,能够唯一标识此微服务脚本代码。唯一性哈希信息除了有脚本代码,英文标识、还有所用语言、服务类型。

3)根据此微服务唯一性哈希值判断NoSql脚本存储仓库(Redis)中是否已经存在。

4)如果NoSql微服务脚本代码存储仓库中不存在,则跳转到6。

5)如果NoSql微服务脚本代码存储仓库中存在,则跳转到8。

6)选择对应的语言编译器对脚本进行编译,如果微服务脚本代码没有编译语法错误,则微服务脚本代码保存到NoSql脚本存储仓库。

7)如果微服务脚本代码有编译语法错误,则跳转到8

8)根据上下文提示操作者,已经存在于NoSql脚本存储仓库中或编译存在语法错误或添加编辑成功,跳转到1、再次添加新的微服务脚本代码。

微服务编辑的界面如图6所示,通过该界面将微服务对微服务的脚本代码进行编辑,并添加微服务的属性信息。其中,图7中示出了动态微服务的属性类别。可理解的是,在动态脚本添加或者编辑后,会将微服务的状态(创建、销毁或变更)上报至网关,当然上报至网关的数据中还包括微服务的连接数,线程数等,具体参见图8。

如图9所示,动态微服务的API网关记载了动态微服务的信息,例如,微服务的注册、微服务的发现、动态微服务的身份验证等,具体参见图9。

图10是动态微服务的容器装置结构图,微服务存储于容器装置中,在容器装置中通过多语言动态脚本代码编译引擎装置和多语言动态脚本代码执行引擎装置对微服务进行实例化。这些微服务存储于多语言动态脚本存储仓库中。

对于这些微服务,还可以通过如图11所示的方式进行扩展。如图11所示,

1)从动态微服务综合管理调度器中,获取已注册有效动态微服务列表。微服务列表的结构如图15所示。

2)获取此微服务所有服务器健康状态,健康指标状态之前已上报。

每个动态微服务、根据系统配置定时上报微服务数据到微服务综合管理调度中心,上报的数据有以下12种:

1.CPU使用率

2.内存使用率

3.线程数量

4.TCP连接数

5.执行日志

6.响应时间

7.IO状况

8.垃圾回收GC状况

9.TCP端口状态(是否连通)

10.微服务的创建

11.微服务的销毁

12.微服务的版本变更

3)判断动态微服务类型

4)如果为CPU消耗型,则跳转到6。

5)如果为内存消耗型,则跳转到9。

6)判断CPU使用率是否超过所配置的最大平均值(此微服务的所有实例CPU利用率平均值)。

7)如果CPU使用率已经超过所配置的最大平均值,则跳转到12。

8)如果CPU使用率没有超过所配置的最大平均值,则跳转到14。

9)判断内存使用率是否超过所配置的最大平均值(此微服务的所有实例内存利用率平均值)。

10)如果内存使用率已经超过所配置的最大平均值,则跳转到12。

11)如果内存使用率没有超过所配置的最大平均值,则跳转到18。

12)对微服务进行非阻塞微服务实例动态复制扩展(需要准备好足够的可用物理机,扩展最大数量及增量根据配置)。

13)根据配置休息指定时间再次启动检测,跳转到1。

14)判断CPU使用率是否低于最小平均值。

15)如果CPU使用率低于最小平均值,跳转到21。

16)如果CPU使用率高于最小平均值,跳转到13。

17)减少动态微服务器实例(减少的数量根据配置),跳转到13。

18)判断内存使用率是否低于最小平均值。

19)如果内存使用率低于最小平均值,跳转到24。

20)如果内存使用否高于最小平均值,跳转到13。

21)判断CPU使用率低于最小平均值且连续超出指定持续时间。

22)如果CPU使用率低于最小平均值连续已经超出指定持续时间,跳转到17。

23)如果CPU使用率低于最小平均值连续没有超出指定持续时间,跳转到13。

24)判断内存使用率低于最小平均值且连续超出指定持续时间。

25)如果内存使用率低于最小平均值连续已经超出指定持续时间,跳转到17。

26)如果内存使用率低于最小平均值连续没有超出指定持续时间,跳转到13。

27)跳转到13。

图12是动态微服务的部署/分布/伸缩示意图,当检测到需要对微服务(例如图12中的微服务A、微服务B和微服务C)进行复制扩容时,直接将该微服务复制至其它服务器,以提供更多的可调用微服务。图13是微服务的容器管理装置,通过该装置中的检测模块、复制模块等对微服务的扩容进行控制。

图14是本发明提供的微服务的总体结构模块示意图,通过该模块中的各个模块之间的协作共同完成微服务的调用、编辑和扩容的过程。

本发明提供的多语言云编译实现动态微服务技术,是把系统的每一个服务都映射为一段动态脚本代码,在远程服务器动态微服务云编译引擎会把它翻译成可执行代码放置于内存当中(这段代码可以用常见的编程语言C#、VB.NET、JAVA、Python等编写),在调用时会根据路由算法,路由到此服务器的动态微服务中进行运行,以此解决系统中功能模块之间耦合的问题,提高软件重用性,降低代码的复杂度。使系统在开发阶段各模块的职能更加明确,功能模块之间的耦合更为松散,让系统更具有可扩展性、维护性、可运维性,进而大大降低项目的开发费用和成本。

本发明的方案采用多语言云编译实现动态微服务体系结构,可以使各个微服务功能模块具有更大的独立性,各个微服务之间是相对独立的,可以完全独立开发,独立部署、独立运行、独立运维,有利于在大规模软件开发过程中提高开发的并行性和效率,改善提高软件系统的的可测试性和可维护性。

本发明并不局限于应用软件所用的这一种语言,可以实现.Net、VB.NET、Java、Python在线开发、在线编译、自动编译、自动部署,不需要像传统方式一样,需要线下使用开发软件VisualStudio、Eclipse、Sublime在电脑本地进行开发、编译。

微服务API网关/综合管理调度器,负责动态微服务的注册、发现、负载均衡、身份验证、健康汇总、限流、请求路由。微服务API网关的存在,有效的连接了微服务内部和外部前端业务页面渲染,屏蔽了后台微服务的复杂性,后台个别微服务的变化和升级不会对微服务API网关和客户有任何影响。

动态微服务在创建实例启动时,会将微服务的地址信息和端口信息上报注册给微服务API网关综合管理调度器。这样前端业务在调用到动态微服务时就可以知道微服务所在位置,将请求根据所设置的负载均衡策略,路由到真实的微服务目标地址。

利用多语言云编译实现动态微服务体系,每微服务都使用最小耦合来进行处理,不同专家和团队负责开发不同的模块,每个微服务专注一件事,边界清晰且彼此隔离,开发者都可以快速线上开发、集成、测试、部署、独立完成上线部署流程,彼此间互不影响。实现快速灵活敏捷开发、有效减少运维成本和管理成本、提高开发效率。

利用多语言云编译实现动态微服务体系,可以使软件开发人员以产品的心态和角度来做微服务,使开发人员不断增强服务意识、提高服务质量。

利用多语言云编译实现动态微服务体系,支撑业务快速变化,服务之间是快速融合,实现将多个动态微服务按照业务的需求,进行有机的、灵活的组装和编排,以适应满足急剧增长的客户个性化业务逻辑需求,还可以有效合并减少客户端请求交互次数、简化客户端代码量、进一步提高系统性能和开发效率。

利用多语言云编译实现动态微服务体系,可以交将微服务的开发给第三方公司,提高行业内的合作,达到优势互补的目的。微服务在开发完成后,立即也可被其他系统所调用,完全能够提高微服务的可重用性。

利用多语言云编译实现动态微服务体系,有利于在大规模软件系统开发过程中,使开发团队能够并行进行,提高开发的效率和质量。并且在开发和调试过程中,当部分微服务发生问题的时候,并不会影响到其他微服务,将有利于软件测试、部署工作的开展和进行。

利用多语言云编译实现动态微服务体系,可以使系统在运行时刻可以动态地替换微服务组件,根据运行环境的变化或某些条件而引起新的行为,动态的提高软件系统的自适应性。

利用多语言云编译实现动态微服务体系,可以在线开发微服务、在线编译、在线调试,微服务开发编译后可立即部署,供软件系统直接调用。

利用多语言云编译实现动态微服务体系,可以在线修复微服务,实现微服务的快速升级扩展或替换,使微服务热部署、动态可插拔。可以实现微服务多版本,实现业务系统灰度升级,服务降级,服务分布式跟踪等。

利用多语言云编译实现动态微服务体系,将微服务编译后的实例放置于进程内存中,后端全部采用Thrift(Socket)通信,就像直接引用对象一样方便且高效、减少网络延迟、提高系统的吞吐量,并且体系有同步、异步(队列非阻塞)、定时多种调用处理方式,进一步提高用户体验。

利用多语言云编译实现动态微服务体系,可能使开发团队容易尝试技术创新,与平台无关、语言无关,支持多语言(C#/VB.NET/JAVA/Python),可以选择不仅可以用现有系统所用的语言开发,也可以用其它语言进行开发跨平台运行。

利用多语言云编译实现动态微服务体系,系统稳定性增强,单个服务的失效不会影响其他服务,可以一定程度实现服务降级,而不会让整个系统瘫痪。

利用多语言云编译实现动态微服务体系,可以可视化监控,即时看到每个微服务每分钟/每小时/每天会有多少次的调用,被哪些业务调用,调用的每个时间点是多少,执行的性能和状态如何。当微服务出现问题时,即时短信/QQ/邮件报警,并可以通过错误跟踪监控系统可以快速定位异常信息。另外系统支持特有的applicationContext上下文,可以从客户请求到结束做全程调用链式和依赖关系跟踪。

利用多语言云编译实现动态微服务体系,同一个微服务实例提供多个版本,当新发布的版本出现问题或不稳定时,可以立即切换到上一个微服务版本,实现微服务版本快速rollback回滚。

利用多语言云编译实现动态微服务体系,很容易通过建立新的微服务来扩展系统业务逻辑。当向系统中加入新的微服务时,不必重新编译原有系统的前提下按需对系统功能进行扩充,从而快速响应客户个性化需求变化。

利用多语言云编译实现动态微服务体系,可以将动态在线扩展的业务逻辑可以同时部署到多台服务器上,实现自动化业务逻辑的负载均衡、横向扩展及分布式部署,从而适应多用户、高并发请求。

需要说明的是,构建多语言云编译实现动态微服务,可以动态的扩展增加系统的功能。当发现当前系统不能满足目前的需求时,只需要在线增加一个相应的动态脚本,不停止现有系统运行的情况下,对现有模块在线进行功能扩展或补充即可,而不用重新在线下开发,再次构造整个系统重新部署,从而实现敏捷业务扩展开发,即时满足客户个性化定制需求。

多语言云编译实现动态微服务对于软件运行时的扩展提供了很好的平台,业务动态脚本逻辑的指令集可以支持常见语言(C#/VB.NET/JAVA/Python),语言编译器通过框架可以生成低级指令的对象代码,整个系统所需要的脚本代码在首次运行时被动态编译成高效的原始代码,并放置于内存之中,大大提高了系统的执行速度。

在体系结构方面,传统的软件体系结构不利于大规模的集群化开发、部署,对现代软件产业的发展造成了极大的限制。采用多语言云编译实现动态微服务体系结构,可以使各个功能模块具有更大的独立性,改善了软件的可测试性和可维护性。与传统的软件体系结构相比,在这种微服务的体系结构中,使得而各个新扩展的微服务之间是相对独立的,这使得程序的结构简单,各部分可以完全独立开发,独立部署、独立运行,有利于在大规模软件开发过程中提高开发的并行性和效率。

多语言云编译实现动态微服务提供的强大可扩展性和组装性,正是通过不断的微服务进行扩展,使得它就像一棵树的树根一样不断地发展,从而赋予系统功能模块的无限可扩展性,使得系统能够不断地去满足新的需求。

多语言云编译实现动态微服务它允许自定义程序代码执行顺序的关系和执行逻辑,每个动态可扩展脚本都可以单独在线编程调试、升级维护、配置,可以根据需要动态编译、安装、载入、运行、停止、启用、停用、卸载,既不影响其它已有微服务功能模块的工作,又具有极大的灵活性。

本发明并不局限于应用软件所用的这一种语言,可以实现C#、VB.NET、JAVA、Python在线编译服务,不需要像传统方式一样,使用开发软件VisualStudio或Eclipse在电脑本地进行开发,而是直接在线开发,在线动态编译、实现编译即服务并通过预留接口动态切入当前系统,实现原有功能的快速扩展。

多语言云编译实现动态微服务是基于SOA/ESB/MicroService的构建模式,这样的动态扩展也可以直接移植融合到远程业务接口或添加到您需要扩展的地方,不同的动态扩展之间,可以互相调用,也可以调用外部其它接口,从而构造复合的动态的微服务组件,使之更加灵活多变。

多语言云编译实现动态微服务是把软件开发中的功能细分,使开发者可以使用不同语言在线开发,动态部署,动态运行的方案,以减少重复代码编写,然后在系统运行需要时编译、加载、运行时,这套框架体系可以提高开发效率的编程思想。

多语言云编译实现动态微服务,这个微服务甚至可以交给第三方公司开发,提高行业内的合作,达到优势互补的目的。在开发完成后,微脚本功能也可被其他程序系统所调用,能提高软件的可重用性。

有利于在大规模软件开发过程中,使开发能够并行进行,提高开发的效率和质量。并且在开发和调试过程中,当部分微服务动态脚本发生问题的时候,由于各个微服务动态脚本之间相对独立,并不会影响到其他微服务,将有利于软件测试工作的开展和进行,便于在测试和调试的过程中发现问题解决问题。另外,对部分微服务动态脚本的修改,不会影响到其他微服务动态脚本,避免了因为改正错误而引出新问题的情况,而且系统在运行时刻可以动态地替换微服务组件,根据运行环境的变化或某些条件而引起新的行为,从而动态的提高软件系统的自适应性。

与现有技术相比,本发明公开的技术方案具有以下优点:

1)即时生效:由于微服务是开线开发、在线编译,所以开发编译后可立即生成微服务,可以开发后的微服务可以直接立即调用,不需要开发人员重新编译,重新部署系统;

2)增强代码可维护性:微服务代码在线开发、在线调试、在线运行,如果遇到问题,可以在线修复微服务,快速升级扩展或替换微服务、启用或停用微服务,实现微服务动态可插拔。

3)微服务会降低业务的复杂度,迫使你去合理划分系统边界,合理设计领域模型,使迭代的周期更短,可以多版本,灰度升级,服务降级,服务分布式跟踪等。

4)代码重用率高:微服务动态脚本把每个方面实现为独立的功能点,功能点之间是松散耦合的。松散耦合的实现通常意味着更好的代码重用性,可以将其移值到其它系统中直接调用,从而降低了软件的开发成本和难度,一次开发,微服务即可在任何地方调用(远程/本地)。

5)性能高:微服务体系根据上下文调用需要,即时将脚本进行编译,编译后的实例放置于内存中,就像直接引用对象一样方便且高效,且有同步、异步(队列非阻塞)、定时多种调用处理方式。

6)多种语言支持:微服务对于应用系统,如果需要扩展添加新的功能,不仅可以用现有语言开发,也可以用其它语言进行开发,并且可以跨平台运行。

7)易于管理:每个微服务开发者都可以单独开发、集成、测试、部署、完成上线流程,有效减少运维成本和管理成本,提高开发效率。

8)技术创新:微服务容易尝试技术创新,甚至每个功能扩展点微服务都可以采用不同的编程语言编写。

9)稳定性增强:系统稳定性增强,单个微服务的失效不会影响其他微服务,可以一定程度实现服务降级。

10)易于开发:每个微服务都使用最小耦合来进行处理,将系统中的模块进一步细化成不同的微服务,降低了模块之间的耦合度,不同专家和团队负责开发不同的模块,彼此间互不影响。实现快速敏捷开发。

11)代码集中易于理解。使用微服务体系可以将需要多次使用的公用代码集中到一处实现,这样代码的修改范围就可以得到严格的控制,减少代码修改对系统稳定性的影响,减少代码的冗余度和耦合度,增强可读性,提高软件质量,解决了面向对象编程跨模块造成的代码混乱和代码分散问题。

12)分布式:微服务实现将动态在线扩展的业务逻辑可以同时部署到多台服务器上,实现微服务业务逻辑的负载均衡横向扩展及分布式部署,从而适应多用户、高并发请求。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1