CN109358956B - 服务调用方法 - Google Patents
服务调用方法 Download PDFInfo
- Publication number
- CN109358956B CN109358956B CN201811153291.2A CN201811153291A CN109358956B CN 109358956 B CN109358956 B CN 109358956B CN 201811153291 A CN201811153291 A CN 201811153291A CN 109358956 B CN109358956 B CN 109358956B
- Authority
- CN
- China
- Prior art keywords
- service function
- identifier
- task
- service
- tasks
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Abstract
本公开提供了一种服务调用方法,其特征在于包括:注册步骤,其中,通过使用于实现预定功能的各模块的服务功能函数与独立于各模块的标识符ID匹配来注册所述服务功能函数;队列创建步骤,其中,创建任务队列以便接收由各模块发起的调用服务功能函数的任务,其中每个任务都包括服务功能函数的标识符ID和参数;调度步骤,其中,对任务队列中的任务进行分配;以及执行步骤,其中,使用预先配置数量的并发的Go协程来执行所分配的任务。
Description
技术领域
本公开涉及一种服务调用方法,具体地,本公开涉及在基于Go语言实现的应用中的各功能模块之间的服务调用方法。
背景技术
Go语言是开源的编译型编程语言,支持并发、垃圾回收,旨在创造一种具有静态编程语言的高性能和动态语言的高效开发之间拥有良好平衡点的编程语言。此外,Go语言专门针对多处理器系统应用的编程进行了优化。目前,基于Go语言开发的实际应用和用于开发的资源越来越多。
在Go语言实现的应用中,程序是通过包(package,本文也称之为模块)来组织的,一个包可以通过导入(import)其它包来调用其它包。在实际应用中,模块间的调用是不可避免的,但是在Go语言中禁止包之间的循环调用,例如,如果B包调用了A包,则不允许A包再调用B包。再例如,如果B包调用了A包,C包调用了B包,也不允许A包调用C包。因此难以实现模块之间的互相调用。
发明内容
本公开提供一种能够尤其在基于Go语言的应用中实现模块之间的互相调用的方法和设备。
根据本公开的一个方面,提供了一种服务调用方法,该服务调用方法包括:注册步骤,其中,通过使用于实现预定功能的各模块的服务功能函数与独立于各模块的标识符ID匹配来注册所述服务功能函数;队列创建步骤,其中,创建任务队列以便接收由各模块发起的调用服务功能函数的任务,其中每个任务都包括服务功能函数的标识符ID和参数;调度步骤,其中,对任务队列中的任务进行分配;以及执行步骤,其中,使用预先配置数量的并发的Go协程来执行所分配的任务。
根据本公开的另一个方面,提供了一种服务调用设备,该服务调用设备包括:注册装置,被配置为通过使用于实现预定功能的各模块的服务功能函数与独立于各模块的标识符ID匹配来注册所述服务功能函数;队列创建装置,被配置为创建任务队列以便接收由各模块发起的用于调用服务功能函数的任务,其中每个任务都包括服务功能函数的ID和参数;调度装置,被配置为对任务队列中的任务依次进行分配;以及执行装置,被配置为使用预先配置数量的并发Go协程来执行所分配的任务。
根据本公开的另一个方面,提供了一种服务调用装置,该服务调用装置包括:一个或更多个处理器,以及一个或更多个存储器,上面存储有计算机程序,当所述计算机程序被处理器执行时使得所述一个或更多个处理器实施如上所述的服务调用方法。
根据本公开的另一个方面,提供了一种计算机可读存储介质,上面存储有计算机程序,当所述计算机程序被一个或更多个处理器执行时使得所述一个或更多个处理器实施如上所述的服务调用方法。
根据参照附图的以下描述,本公开的其它特征和优点将变得清晰。
附图说明
并入说明书中并且构成说明书的一部分的附图示出了本公开的实施例,并且与描述一起用于说明本公开的原理。
图1是示出了根据本公开一个实施例的服务调用方法的实施的架构图。
图2是示出了根据本公开一个实施例的核心系统的基本配置的框图。
图3是示出了根据本公开一个实施例的服务调用方法的流程图。
图4是示出了根据本公开一个实施例的注册表的示意图。
图5是示出了根据本公开一个实施例的任务调度过程和任务执行过程的示意图。
图6是示出了根据本公开一个实施例的注册过程的流程图。
图7是示出了根据本公开一个实施例的执行过程的流程图。
图8是示出可以实现根据本公开的实施例的计算机设备的示例性配置图。
具体实施方式
为了清楚和简明起见,在说明书中并未描述实施例的所有特征。然而,应该了解,在对实施例进行实施的过程中必须做出很多特定于实施例的设置,以便实现开发人员的具体目标,例如,符合与设备及业务相关的那些限制条件,并且这些限制条件可能会随着实施例的不同而有所改变。
在此,还应当注意,为了避免因不必要的细节而模糊了本公开,在附图中仅仅示出了与至少根据本公开的方案密切相关的处理步骤和/或设备结构,而省略了与本公开关系不大的其他细节。
实施本公开的服务调用方法的应用是基于Go语言编写的,因此为了清楚说明,首先介绍Go语言中的一些相关概念。
线程:线程是操作系统的内核对象,线程可以作为独立运行和独立调度的基本单位,线程的作用就在于充分使用CPU,也就是所说的并行。
Go协程:一般而言,协程是在应用层模拟的线程。Go语言是从编译器和语言基础库多个层面对协程做了实现,所以,Go语言中使用的Go协程是包含协程概念的各类语言中实现的比较完整和成熟的。Go协程是一个与其他Go协程并发运行在同一地址空间的Go函数或方法。一个运行的程序由一个或更多个Go协程组成。
类型:Go语言中,类型用于声明函数和变量。类型用于把数据分成需要不同尺寸内存的数据,需要用大数据的时候才需要申请大内存,就可以充分利用内存。Go语言中的类型不但有常见的数字类型如int,float等以及字符串类型,还有函数类型、结构化类型(struct)和接口类型(interface)。每个接口类型都代表固定的方法(或函数)集合,通过interface可以定义对象的一组行为。
对象:相对于类型而言是对客观事物的更加具体的表示,可以包括客观事物的属性和/或表示行为的方法或函数。因此,一个函数类型在运行时可以成为具体的对象。
包(package):一个包可以认为对应于本公开的一个模块并且每个包都有一个名字,简称包名。属于某一个包的源文件都应该放置于一个单独命名的文件夹里。按照Go语言的惯例,应该用包名来命名该文件夹。包用于组织Go源代码,一个包中的函数可以被其它包调用或引用(import),从而提供了更好的可重用性与可读性。
通道:用于在多个Go协程之间发送和接收共享的数据,从而实现数据同步。在使用时,需要知道通道中发送和接收的数据类型。通道可以看作在两个Go协程之间架设的管道,一个Go协程可以向这个管道里存放数据,另外一个Go协程可以从这个管道里取出数据。
下面结合附图详细描述本公开的各个实施例。
图1是示出了根据本公开一个实施例的服务调用方法的实施的架构图。
如图1所示,在实施服务调用方法的应用中,包括多个模块101-104和核心系统100。这些模块101-104可以分别被一个工作组内的不同的编程人员编写,以便在应用运行时实现不同的功能。此外,这些模块可以对外部提供内部的服务功能函数的接口,以便被其它模块调用。一个服务功能函数可以认为是提供某种服务或功能的函数,例如求和A+B或者乘法A*B等。在编程过程中,负责一个模块的编程人员可以通过这些接口来调用其它模块的服务功能函数并且几乎可以不关注其它模块的具体实现方式。核心系统101是应用的整个架构的核心,负责管理和调度来自各个模块101-104的请求并且执行这些请求,如后面详细描述那样。
图2示出了根据本公开一个实施例的核心系统的基本配置的框图。核心系统可用于在应用运行时管理整个架构并调用各个模块内的服务功能函数。如图2所示,核心系统可以包括例如注册单元201、队列创建单元202、调度单元203和执行单元204。这些单元201-204是在应用启动过程中创建的。此外,各个单元可以根据需要被组合或分割成子部件。
注册单元201可被配置为通过使用于实现预定功能的各模块101-104的服务功能函数与独立于各模块101-104的标识符ID匹配来注册所述服务功能函数。
队列创建单元202可被配置为创建任务队列以便接收由各模块101-104发起的用于调用服务功能函数的任务,其中每个任务都包括服务功能函数的ID和参数。
调度单元203可被配置为对任务队列中的任务依次进行分配。
执行单元204可被配置为使用预先配置数量的并发Go协程来执行所分配的任务。
下面结合图3所示的根据本公开一个实施例的服务调用方法的流程图来描述核心系统100及其各个组成单元的操作。图3中的服务调用方法可以被核心系统100在应用运行时执行。
步骤S301是注册步骤,其中,通过使用于实现预定功能的各模块101-104的服务功能函数与独立于各模块101-104的标识符ID匹配来注册所述服务功能函数。该步骤S301可以由核心系统100中的注册单元201执行。
如前所述,一个模块可以认为是用Go语言编写的实现预定功能的一个包。该模块中的服务功能函数可以被各个包调用。在该实施例中,为了更灵活地调用服务功能函数,首先各个模块101-104向核心系统100注册服务功能函数。
例如,注册单元201可以实现一个注册函数,用于注册服务功能函数,即,使各模块101-104的服务功能函数与独立于各模块101-104的标识符ID匹配。
注册单元201中还创建了注册表来注册各个服务功能函数。图4示出了该实施例中的注册表的一个示例。从图4可见,注册表400的每个条目记录服务功能函数与相应的标识符ID之间的对应关系。
例如,在系统设计时,各个模块的负责人员公布自己能提供的服务函数接口,核心系统的负责人员通过例如表格的形式把这些服务函数与标识符ID一一匹配以形成对应关系,并且对全部模块公布这种对应关系。或者,在系统设计时在预先并不确定所有的服务功能函数的情况下规定各模块的ID段标识,例如A01用于标识模块101,B01用于标识模块102,C01用于标识模块103,以及D01用于标识模块104。在开发过程中如果生成具体的服务功能函数,则由各模块的负责人员对全部模块公布的所生成的具体服务功能函数和完整ID标识的对应关系,例如模块101中第一个生成的服务功能函数被赋予完整ID标识如A01_1,以此类推。
另一方面,在应用启动时,可以把标识符ID初始化为全局变量,例如字符串类型的全局变量,并且与对应的服务函数相关联。因此,在应用运行过程时,在其它包中调用某个标识符ID时,就调用了与该标识符ID匹配的服务功能函数。不管该全局变量的内容如何改变,其保持与对应的服务功能函数相匹配,因此其它包可以通过调用该标识符ID来调用了与之相匹配的服务功能函数。
如前所述,Go语言中禁止包之间的循环调用,例如,如果B包调用了A包的服务功能函数,则不允许A包再调用B包的服务功能函数。在该实施例中,因为在编程过程中,各个包中向核心系统100请求调用的是与服务功能函数对应的标识符ID,所以在编译过程中,Go语言编译器不会在代码行中发现标识符ID中含有被调用的服务功能函数所属的包的包名,因此也就不会认为各个包彼此之间存在循环调用的问题。
例如,A包提供函数F1,B包提供函数F2。如果在编码过程中出现调用:A->B.F2以及B->A.F1,则编译器发现循环调用就会通过报错而拒绝通过。根据该实施例,为F1函数分配标识符ID_1并且为F2函数分配标识符ID_2。因为在编码过程中出现调用A->ID_2以及B->ID_1,所以编译器不会报错。在编译通过之后,应用的可执行代码运行期间将不再被检查循环调用的问题。从这个意义上可以说,核心系统100中的标识符ID独立于各个包或者各个模块。
值得注意的是,上面介绍的匹配原则体现了系统设计阶段的原理。然而,在应用启动或者编译之后的可执行代码的运行期间,各个包以及核心系统都处于动态运行状态。各个包的服务功能函数都进行了实例化并且成为在内存中存储的具体对象,那么注册单元201是如何具体实施在运行期间把标识符ID与服务功能函数的具体对象匹配起来并且进而记录为注册表中的条目呢?
这里首先要介绍Go语言中的反射机制,然后说明如何利用反射机制解决上述问题。
对于对象的使用,常规的方式是知道对象的属性和方法之后进行调用或者访问。而反射机制是在运行状态中,对于任何一个对象,都能调用它的任意方法和属性。这种动态获取或者调用的方式就是反射机制。简单而言,类似于照镜子的过程,通过照镜子,镜子里的镜像能获取对象的属性和行为。
反射机制是使用反射包(reflect包)来实现,使用的时候需要将反射包引用进来。反射包中包括了两个反射类型reflect.Type和reflect.Value,这两个类型对应于两个方法或反射函数reflect.TypeOf()和reflect.ValueOf()。这两个函数可接收任何类型的对象,该对象的Value就是实现该类型的底层数据,Type是底层数据的具体类型。这两个函数的返回值的类型是reflect.Type和reflect.Value,中间的转换由反射包来实现。
因此,本公开封装反射机制,使各个包101-104的开发人员不必了解反射机制的原理,简化了开发过程,降低了开发门槛。
具体而言,在该实施例中,在运行状态下,把服务功能函数看作对象,可以通过反射机制动态获取服务功能函数的反射类型对象或者说镜像,然后把该反射类型对象与标识符ID的对应关系记录到注册表中,以便动态地实现服务功能函数与标识符ID之间的匹配。
例如,图6示出注册单元201把前述的F1函数与标识符ID_1匹配的流程图。在步骤S601中,通过reflect.ValueOf(F1)把内存中的函数对象F1转换为反射类型对象Value。然后在步骤S602中,把该反射类型对象Value与标识符ID_1的对应关系记录到注册表中。通过这种方式,就能够在运行期间把各个包的服务功能函数的反射类型对象与对应的标识符ID的对应关系记录到注册表中,以便在后续调用过程中使用。
下面返回图3继续描述。步骤S302是队列创建步骤,其中,创建任务队列以便接收由各模块101-104发起的用于调用服务功能函数的任务,其中每个任务都包括服务功能函数的标识符ID和参数。该步骤S302可以由核心系统100中的队列创建单元202执行。
如前所述,Go语言中的通道可以用于在多个Go协程之间发送和接收共享的数据。队列创建单元202可以利用通道来创建任务队列使得其具有通道的属性和功能。
在应用的运行状态下,每当模块101-104中的一个模块向核心系统100请求调用某个服务功能函数时,它提供请求调用的函数的标识符ID以及要赋予该函数的参数。队列创建单元202把该标识符ID和参数封装作为一个任务添加到任务队列中等待被调度并且任务队列中中的各任务遵循先入先出的规则。
在一个示例中,队列创建单元202创建至少两个任务队列,这两个任务队列具有不同的优先级。例如,在两个任务队列的情况下,一个任务队列为优先任务队列,用于接收较高优先级的任务,例如立即需要返回值的任务。另一个队列为普通任务队列,用于接收常规任务。
在又一个示例中,至少两个任务队列都能够缓冲任务。Go语言的通道分为有缓冲的通道和无缓冲的通道。
一方面,无缓冲的通道指的是通道的大小为0,也就是说,这种类型的通道在接收前没有能力保存任何值,它要求发送Go协程和接收Go协程同时准备好,才可以完成发送和接收操作。
对于无缓冲的通道,发送Go协程和接收Go协程必须同时准备好存取数据。如果没有同时准备好的话,先执行的操作就会被阻塞等待,直到另一个相对应的操作准备好为止。因此,这种无缓冲的通道也称之为同步通道。
另一方面,对于有缓冲的通道,向其发送数据就是把数据插入通道的尾部,接收操作则是从通道的头部删除元素。有缓冲的通道不要求发送和接收操作是同步的。
因此,在该示例中,至少两个任务队列是使用有缓冲的通道实现的。任务在任务队列中排队等候调度,当系统处于满负荷运转时,只要任务队列不满,任务队列就可缓冲任务。
步骤S303是调度步骤,其中,对任务队列中的任务依次进行分配。该步骤S303可以由核心系统100中的调度单元203执行。
任务队列中的任务分配遵循先入先出的原则,因此调度单元203从任务队列依次分配其中的任务。
在至少两个任务队列的情况下,调度调用203可以按照各任务队列的优先级对任务进行分配并且在较高优先级队列的任务全部分配之后分配较低优先级队列的任务。
图5示出了根据一个实施例的在运行状态下核心系统100中的任务调度和执行过程的示意图。
发起调用的模块把任务1、2、…、m根据任务的优先级添加到相应的任务队列中。图5中的位于左侧的虚线表示任务将根据优先级来进入不同的队列。例如,任务m为立即要求返回值的较高优先级任务,因此进入优先队列504中;而任务1、2为普通任务,因此进入普通队列505中。
调度器501是调度单元203的一个具体示例。在调度过程中,如果任务队列504、505没有缓冲机制,则在系统满负荷运转的情况下发起调用的模块挂起等待被调度器501调度。如步骤S303中所述,任务队列都是使用有缓冲的通道实现的并因此能够缓冲任务,所以除非一个任务队列已满,否则不会出现发起调用的模块挂起等待调度。因此,通过能够缓冲任务的任务队列可以有效缓缓解高负荷运转下的调用等待。
此外,可以看出,调度器501先分配了优先队列504中的任务m进入调度器501和执行单元(下文称之为协程池)502之间的下一个通道503中,在优先队列504中没有任务之后,才开始分配普通队列505中的任务2、1等进入通道503中,直到普通队列505中没有任务为止。
因此,本公开通过引入优先队列,可使得需要紧急处理的任务通过优先队列504得到及时处理。
步骤S304是执行步骤,其中,使用预先配置数量的并发的Go协程来执行所分配的任务。该步骤S304可以由核心系统100中的执行单元204执行。
如前所述,在应用启动时创建了执行单元204,其可以包括多个并行执行的Go协程,简称协程池502。这些Go协程根据自身的状态从通道503中取得任务并执行该任务。例如,如果一个Go协程正在执行任务,则此Go协程处于忙碌状态并且在执行完成之前不能再执行其它任务。如果一个Go协程并未执行任务,则它处于空闲状态,并且可以从通道503中取得任务并执行该任务。若多个Go协程均处于空闲,则这些Go协程可以按顺序依次从通道503中取得任务并执行相应的任务。图5中位于右侧的虚线表示通道503中的任务将根据Go协程的忙碌或空闲状态而被不同的Go协程执行。Go协程的并行运行是由Go语言的底层调度器来管理的。
通过Go协程池来并行地执行通道503中的分配的任务,可以充分利用CPU资源,尤其适合多核处理器的情况。在编程过程中对任务的常规处理方式是,如果需要处理一个新的任务,则创建一个Go协程来执行该任务。但是,当前的大型应用越来越复杂,其中的任务数量可能达到几十万、几百万个甚至更多,因此应用在运行时将创建相应数量的Go协程。因为在运行状态下CPU需要在各个Go协程之间切换,所以CPU在大量的Go协程之间切换上下文花费的资源甚至会超过执行任务所用的资源,导致系统处理效率下降、甚至系统崩溃。
针对这种缺陷,该实施例提出在应用启动时就预先配置Go协程的数量,并且在应用运行过程中使用这些Go协程按照上述的方式执行任务。所述数量可以根据硬件处理能力和系统性能指标中的至少一个预先配置。
在一个示例中,在使用多核处理器的情况下,可以把该数量设置较大。
在另一个示例中,可以预先在硬件平台上通过运行较大负荷的应用来进行加压测试。通过不断调整Go协程的数量,来确定使系统性能最高的数量,作为所述预先配置数量。
执行单元204有两种执行方式,异步执行和同步执行。异步执行方式是指调用的模块不需要等待执行单元204的返回结果,因此执行单元204执行任务完成即可转入空闲状态并执行其它任务,而同步执行方式是指调用的模块需要等待执行单元204的返回结果,因此执行单元204和调用的模块之间需要返回结果。这例如可以通过在模块发起调用时核心系统100在调用的模块和执行单元204之间创建一个通道,专用于向调用的模块传送返回结果。
因此,该实施例对于不需要获得返回结果的任务,引入异步执行方法,从而节省了不必要的等待时间,提高了系统效率。
在任务的具体执行过程中,执行单元204从通道503中取得任务,使用反射包的反射函数根据任务的标识符ID和参数来调用与该标识符ID匹配的服务功能函数。
在现有技术中,通常功能或函数调用是通过在编程期间在代码行中直接定义,然后代码行在编译过程中被编译成固定的可执行代码。在运行状态下,必须知道要调用的具体功能或函数才能执行该具体功能或函数,同一可执行代码并不能根据数据改变调用关系。
然而,在本公开中,并不是在代码行中定义调用哪个具体功能或函数,并且在编译过程中也不知道在哪个时间点会调用哪个具体功能或函数。相反,本公开允许在可执行代码的运行状态下传送不同的参数或标识符ID并且根据传送来的参数或标识符ID来动态调用相关联的服务功能函数。如果参数相同,则执行服务功能函数的结果不同;反之如果参数不同,则执行服务功能函数的结果相同。上述这种功能调用方式也可称为数据驱动的功能调用,从而实现了根据所传送的数据来选择调用关系的统一调度。
下面参照图7说明根据一个实施例的执行过程的流程图。
在步骤S701中,执行单元204中的空闲Go协程从通道503中取得任务。在步骤S702中,取得任务的Go协程根据任务中的标识符ID和参数,参照注册表的对应条目,执行服务功能函数的反射类型对象。例如,如果要调用的服务功能函数是F1,则根据任务中的ID-1和参数,参照注册表中的与ID_1对应的条目,通过reflect.ValueOf(F1)来执行服务功能函数F1的反射对象。例如,F1要实现A+B的功能,参数是3和6,则执行结果是3+6=9。在步骤S703中,把执行结果返回给调用的模块。该步骤S703是可选的,因为不是每个调用的模块都要求返回执行结果。
综上所述,本公开采用新的注册机制,把不同模块的功能统一注册到核心系统。各模块都可向核心系统申请调用其他模块的各种功能或函数,从而使得模块之间解耦,避免了Go语言所禁止的循环引用。
此外,核心系统通过已创建的协程池和反射机制来有效配置服务的并发数量,可控地并发执行个模块的业务请求,并且使系统达到最佳运行效果,从而避免了现有技术中因协程数量剧烈增加导致的系统处理效率下降甚至系统崩溃。
本公开的前述各实施例可以应用于尤其是基于Go语言实现的应用,例如用于银行、保险、资金监管等领域的应用。
图8示出了可以实现根据本公开的实施例的计算机设备2000的示例性配置。计算机设备2000是可以应用本公开的上述方面的硬件设备的实例。计算机设备2000可以是被配置为执行处理和/或计算的任何机器。计算机设备2000可以是但不限制于工作站、服务器、台式计算机、膝上型计算机、平板计算机、个人数据助手(PDA)、智能电话、车载计算机或以上组合。本公开的前述服务调用设备、服务调用装置等均可以全部或至少部分地由上述计算机设备2000或与其相似的设备或系统实现。
如图8所示,计算机设备2000可以包括可能经由一个或多个接口与总线2002连接或通信的一个或多个元件。例如,计算机设备2000可以包括总线2002、一个或多个处理器2004、一个或多个输入设备2006以及一个或多个输出设备2008。总线2002可以包括但不限于,工业标准架构(Industry Standard Architecture,ISA)总线、微通道架构(MicroChannel Architecture,MCA)总线、增强ISA(EISA)总线、视频电子标准协会(VESA)局部总线、以及外设组件互连(PCI)总线等。一个或多个处理设备2004可以是任何种类的处理器,并且可以包括但不限于一个或多个通用处理器或专用处理器(诸如专用处理芯片)。输入设备2006可以是能够向计算机设备输入信息的任何类型的输入设备,并且可以包括但不限于鼠标、键盘、触摸屏、麦克风和/或远程控制器。输出设备2008可以是能够呈现信息的任何类型的设备,并且可以包括但不限于显示器、扬声器、视频/音频输出终端、振动器和/或打印机。计算机设备2000还可以包括或被连接至非暂态存储设备2010,该非暂态存储设备2010可以是任何非暂态的并且可以实现数据存储的存储设备,并且可以包括但不限于盘驱动器、光存储设备、固态存储器、软盘、柔性盘、硬盘、磁带或任何其他磁性介质、压缩盘或任何其他光学介质、ROM(只读存储器)、RAM(随机存取存储器)、缓存存储器和/或任何其他存储芯片或模块、和/或计算机可以从其中读取数据、指令和/或代码的其他任何介质。非暂态存储设备2010可以与任何接口可拆卸地连接。非暂态存储设备2010可以具有存储于其上的、用于实现前述服务调用方法和/或步骤的计算机程序/数据。计算机设备2000还可以包括通信设备2012,该通信设备2012可以是能够启用与外部装置和/或网络通信的任何种类的设备或系统,并且可以包括但不限于调制解调器、网络卡、红外线通信设备、无线通信设备和/或芯片集(诸如蓝牙TM设备、1302.11设备、WiFi设备、WiMax设备、蜂窝通信设施等)。
计算机设备2000还可以包括工作存储器2014。该工作存储器2014可以是能够存储对于处理器2004有用的指令和/或数据的任何类型的工作存储器,并且可以包括但不限于随机存取存储器(RAM)和只读存储器(ROM)。
位于上述工作存储器2014上的软件元件可以包括但不限于操作系统2016、一个或多个应用程序2018、驱动器和/或其他数据和代码。上述一个或多个应用程序2018可以包括用于执行如上所述的服务调用方法及各步骤的指令。可以通过读取和执行一个或多个应用程序2018的处理器实现前述的服务调用设备或核心系统100的装置/单元/元件。更具体地,例如,前述核心系统100中的注册单元201可以由处理器2004在执行具有用于执行图3的步骤S301的指令的应用程序2018时实现。此外,例如,前述核心系统100中的队列创建单元202可以由处理器2004在执行具有用于执行步骤S302的指令的应用程序2018时实现。此外,例如,前述核心系统100中的调度单元203可以由处理器2004在执行具有用于执行步骤S303的指令的应用程序2018时实现。此外,例如,前述核心系统100中的执行单元204可以由处理器2004在执行具有用于执行步骤S304的指令的应用程序2018时实现。前述核心系统100中未示出的其它各个单元也可以用类似的方式实现。软件元件的指令的可执行代码或源代码可以存储在非暂态计算机可读存储介质(诸如如上所述的存储设备2010)中,并且可以通过编译和/或安装读入工作存储器2014中。还可以从远程位置下载软件元件的指令的可执行代码或源代码。
应当理解,可以根据特定要求进行变型。例如,可以使用定制的硬件和/或特定元件可以以硬件、软件、固件、中间件、微代码、硬件描述语言或其任何组合的方式实现。此外,可以采用与其他计算机设备(诸如网络输入/输出设备)的连接。例如,本公开的计算机设备中的一些或全部可以根据本公开通过使用汇编语言编程硬件(例如,包括现场可编程门阵列(FPGA)和/或可编程逻辑阵列(PLA)的可编程逻辑电路)或逻辑和算法的硬件编程语言(例如VERILOG,VHDL,C++)来实现。
应当进一步理解,计算机设备2000的元件可以分布在整个网络上。例如,可以在使用一个处理器执行一些处理的同时,使用其他远程处理器执行其他处理。计算机系统2000的其他元件也可以类似地分布。因此,计算机设备2000可以被理解为在多个地点执行处理的分布式计算系统。
可以通过许多方式来实施本公开的方法和设备。例如,可以通过软件、硬件、固件、或其任何组合来实施本公开。上述的方法步骤的次序仅是说明性的,本公开的方法步骤不限于以上具体描述的次序,除非以其它方式明确说明。此外,在一些实施例中,本公开还可以被实施为记录在记录介质中的程序,其包括用于实现根据本公开的方法的机器可读指令。因而,本公开还覆盖存储用于实现根据本公开的方法的程序的记录介质。
本公开还至少公开了以下方案:
方案1.一种服务调用设备,其特征在于包括:
注册装置,被配置为通过使用于实现预定功能的各模块的服务功能函数与独立于各模块的标识符ID匹配来注册所述服务功能函数;
队列创建装置,被配置为创建任务队列以便接收由各模块发起的用于调用服务功能函数的任务,其中每个任务都包括服务功能函数的ID和参数;
调度装置,被配置为对任务队列中的任务依次进行分配;以及
执行装置,被配置为使用预先配置数量的并发Go协程来执行所分配的任务。
方案2.一种服务调用装置,其特征在于包括:
一个或更多个处理器,以及
一个或更多个存储器,上面存储有计算机程序,当所述计算机程序被处理器执行时使得所述一个或更多个处理器实施前述的服务调用方法。
方案3.一种计算机可读存储介质,上面存储有计算机程序,当所述计算机程序被一个或更多个处理器执行时使得所述一个或更多个处理器实施前述的服务调用方法。
虽然已通过示例详细展示了本公开的一些实施例,但是本领域技术人员应当理解,上述示例仅意图是说明性的而不限制本公开的范围。本领域技术人员应理解上述实施例可以在不脱离本公开的范围和实质的情况下被修改。本公开的范围是通过所附的权利要求限定的。
Claims (10)
1.一种服务调用方法,其特征在于包括:
注册步骤,其中,通过使用于实现预定功能的各模块的服务功能函数与独立于各模块的标识符ID匹配来注册所述服务功能函数,并且创建注册表,该注册表的每个条目记录服务功能函数与相应的标识符ID之间的对应关系,并且把使用反射机制获得的服务功能函数的反射对象与标识符ID的对应关系记录到注册表中,以便动态地实现服务功能函数与标识符ID之间的匹配;
队列创建步骤,其中,创建任务队列以便接收由各模块发起的用于调用服务功能函数的任务,其中每个任务都包括服务功能函数的标识符ID和参数;
调度步骤,其中,对任务队列中的任务依次进行分配;以及
执行步骤,其中,使用预先配置数量的并发的Go协程来执行所分配的任务,并且使用反射包的反射函数根据任务的标识符ID和参数来调用与该标识符ID匹配的服务功能函数。
2.根据权利要求1所述的服务调用方法,其中,标识符ID不包括模块的名字并且与标识符ID匹配的服务功能函数能够被各个模块调用。
3.根据权利要求1所述的服务调用方法,其中,在队列创建步骤中,创建至少两个任务队列,这两个任务队列具有不同的优先级并且都能够缓冲任务。
4.根据权利要求3所述的服务调用方法,其中,至少一个较高优先级的任务队列专用于接收较高优先级的任务。
5.根据权利要求1所述的服务调用方法,其中,在调度步骤中,按照各任务队列的优先级对任务进行分配并且在较高优先级队列的任务全部分配之后分配较低优先级队列的任务。
6.根据权利要求1所述的服务调用方法,其中,执行步骤包括对于不需要等待调用的返回结果的任务,异步地执行该任务。
7.根据权利要求1所述的服务调用方法,其中,并发的Go协程的数量是根据硬件处理能力和系统性能指标中的至少一个预先配置的。
8.一种服务调用设备,其特征在于包括:
注册装置,被配置为通过使用于实现预定功能的各模块的服务功能函数与独立于各模块的标识符ID匹配来注册所述服务功能函数,并且创建注册表,该注册表的每个条目记录服务功能函数与相应的标识符ID之间的对应关系,并且把使用反射机制获得的服务功能函数的反射对象与标识符ID的对应关系记录到注册表中,以便动态地实现服务功能函数与标识符ID之间的匹配;
队列创建装置,被配置为创建任务队列以便接收由各模块发起的用于调用服务功能函数的任务,其中每个任务都包括服务功能函数的ID和参数;
调度装置,被配置为对任务队列中的任务依次进行分配;以及
执行装置,被配置为使用预先配置数量的并发Go协程来执行所分配的任务,并且使用反射包的反射函数根据任务的标识符ID和参数来调用与该标识符ID匹配的服务功能函数。
9.一种服务调用装置,其特征在于包括:
一个或更多个处理器,以及
一个或更多个存储器,上面存储有计算机程序,当所述计算机程序被处理器执行时使得所述一个或更多个处理器实施如权利要求1-7之一所述的服务调用方法。
10.一种计算机可读存储介质,上面存储有计算机程序,当所述计算机程序被一个或更多个处理器执行时使得所述一个或更多个处理器实施如权利要求1-7之一所述的服务调用方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811153291.2A CN109358956B (zh) | 2018-09-30 | 2018-09-30 | 服务调用方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811153291.2A CN109358956B (zh) | 2018-09-30 | 2018-09-30 | 服务调用方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109358956A CN109358956A (zh) | 2019-02-19 |
CN109358956B true CN109358956B (zh) | 2021-03-16 |
Family
ID=65348184
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811153291.2A Active CN109358956B (zh) | 2018-09-30 | 2018-09-30 | 服务调用方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109358956B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110413266B (zh) * | 2019-08-05 | 2024-01-19 | 广东三维家信息科技有限公司 | 一种haxe的反射机制的改进方法和系统 |
CN110825792A (zh) * | 2019-11-15 | 2020-02-21 | 珠海市新德汇信息技术有限公司 | 基于golang中间件协程模式下的高并发分布式数据检索方法 |
CN110928709B (zh) * | 2019-11-21 | 2023-08-29 | 中国民航信息网络股份有限公司 | 一种微服务框架下的服务调用方法、装置及服务器 |
CN110941488A (zh) * | 2019-12-11 | 2020-03-31 | 中国建设银行股份有限公司 | 一种任务处理方法、装置、设备和存储介质 |
CN112395049A (zh) * | 2020-11-30 | 2021-02-23 | 深信服科技股份有限公司 | 一种业务服务器调用方法、系统、设备及存储介质 |
CN113032118A (zh) * | 2021-03-22 | 2021-06-25 | 北京元年科技股份有限公司 | 用于计算机应用程序的异步操作处理方法和相应的系统 |
CN115600567B (zh) * | 2022-10-14 | 2023-08-11 | 安芯网盾(北京)科技有限公司 | 一种报表导出方法及装置 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1889048A (zh) * | 2006-08-03 | 2007-01-03 | 华为技术有限公司 | 组件的实现方法以及系统 |
CN101464810A (zh) * | 2008-12-31 | 2009-06-24 | 金蝶软件(中国)有限公司 | 服务程序处理方法及服务器 |
CN101957780A (zh) * | 2010-08-17 | 2011-01-26 | 中国电子科技集团公司第二十八研究所 | 一种基于资源状态信息的网格任务调度处理器及方法 |
CN104346215A (zh) * | 2013-08-07 | 2015-02-11 | 中兴通讯股份有限公司 | 一种任务调度服务系统及方法 |
CN108182111A (zh) * | 2018-01-23 | 2018-06-19 | 百度在线网络技术(北京)有限公司 | 任务调度系统、方法和装置 |
WO2018123030A1 (ja) * | 2016-12-28 | 2018-07-05 | 株式会社日立製作所 | 優先度の制御方法及びデータ処理システム |
CN108390766A (zh) * | 2017-10-25 | 2018-08-10 | 国云科技股份有限公司 | 一种适用于微服务的服务注册与发现方法 |
-
2018
- 2018-09-30 CN CN201811153291.2A patent/CN109358956B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1889048A (zh) * | 2006-08-03 | 2007-01-03 | 华为技术有限公司 | 组件的实现方法以及系统 |
CN101464810A (zh) * | 2008-12-31 | 2009-06-24 | 金蝶软件(中国)有限公司 | 服务程序处理方法及服务器 |
CN101957780A (zh) * | 2010-08-17 | 2011-01-26 | 中国电子科技集团公司第二十八研究所 | 一种基于资源状态信息的网格任务调度处理器及方法 |
CN104346215A (zh) * | 2013-08-07 | 2015-02-11 | 中兴通讯股份有限公司 | 一种任务调度服务系统及方法 |
WO2018123030A1 (ja) * | 2016-12-28 | 2018-07-05 | 株式会社日立製作所 | 優先度の制御方法及びデータ処理システム |
CN108390766A (zh) * | 2017-10-25 | 2018-08-10 | 国云科技股份有限公司 | 一种适用于微服务的服务注册与发现方法 |
CN108182111A (zh) * | 2018-01-23 | 2018-06-19 | 百度在线网络技术(北京)有限公司 | 任务调度系统、方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN109358956A (zh) | 2019-02-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109358956B (zh) | 服务调用方法 | |
CN107729139B (zh) | 一种并发获取资源的方法和装置 | |
US9582312B1 (en) | Execution context trace for asynchronous tasks | |
US9354944B2 (en) | Mapping processing logic having data-parallel threads across processors | |
Kalé et al. | Converse: An interoperable framework for parallel programming | |
US9086924B2 (en) | Executing a distributed java application on a plurality of compute nodes | |
KR100898315B1 (ko) | 인핸스드 런타임 호스팅 | |
US8972699B2 (en) | Multicore interface with dynamic task management capability and task loading and offloading method thereof | |
CN108090731B (zh) | 一种信息处理方法及设备 | |
CN110955535B (zh) | 一种多业务请求进程调用fpga设备的方法及相关装置 | |
US20120066688A1 (en) | Processor thread load balancing manager | |
US8776033B2 (en) | Batch dispatch of java native interface calls | |
US11321090B2 (en) | Serializing and/or deserializing programs with serializable state | |
CN112286671B (zh) | 一种容器化批处理作业调度方法、装置和计算机设备 | |
CN111736913B (zh) | 类加载方法和装置 | |
Abbasi et al. | A preliminary study of incorporating GPUs in the Hadoop framework | |
CN114637536A (zh) | 任务处理方法、计算协处理器、芯片及计算机设备 | |
Pazzaglia et al. | Optimal memory allocation and scheduling for DMA data transfers under the LET paradigm | |
CN112506676B (zh) | 进程间的数据传输方法、计算机设备和存储介质 | |
CN112395062A (zh) | 任务处理方法、装置、设备及计算机可读存储介质 | |
CN111443898A (zh) | 基于优先级队列与有限状态机的流程式控制软件设计方法 | |
CN110275771B (zh) | 一种业务处理方法、物联网计费基础设施系统及存储介质 | |
CN1719416A (zh) | 嵌入式并行计算系统以及嵌入式并行计算方法 | |
CN111881025B (zh) | 一种自动化测试任务调度方法、装置及系统 | |
CN114741165A (zh) | 数据处理平台的处理方法、计算机设备及存储装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information |
Address after: 200120 T3, 1788, 1800 Century Avenue, free trade Experimental Zone, Pudong New Area, Shanghai Applicant after: Shanghai insurance exchange, Limited by Share Ltd Address before: 200120 Shanghai East Road Pudong New Area Financial Information Center 22 Applicant before: Shanghai insurance exchange, Limited by Share Ltd |
|
CB02 | Change of applicant information | ||
GR01 | Patent grant | ||
GR01 | Patent grant |