发明内容
为了提高数据服务发布的效率和响应效率,本方案提出了一种基于云原生架构的数据服务发布方法和系统,在云原生环境的支持下,能够适配多种不同的数据源的访问方式,服务开发者在编写脚本时只需关注数据读取处理和组装逻辑,无需关系底层数据源之间的差异性;通过即刻编写即可调试提高数据服务开发效率,有利于服务快速迭代推进,可以为大数据平台对外提供高可用、高并发的数据服务。
根据本发明的第一方面,提供一种基于云原生架构的数据服务发布方法,包括:在云原生架构提供的Java虚拟机上在线编写并调试服务脚本,服务脚本中包含用于访问不同数据源的内置函数;将调试后的服务脚本持久化保存,并将服务脚本编译成服务实例;在服务实例的http容器中注册对应的服务路由,在服务网关中注册对外服务路由。
通过上述技术方案,基于云原生架构提供的Java虚拟机可以实现脚本的即刻编写即刻调试,对服务开发者屏蔽底层数据源的差异性,只需专注于数据读取、处理、组装逻辑,能够降低服务开发和运维的复杂性,实现数据服务开发的快速迭代;同时基于云原生技术的优势保证数据服务的高可用性。
可选地,在本发明提供的数据服务发布方法中,可以使用groovy语言和Java语言混合编写服务脚本;解析服务脚本,检查脚本中是否有语法错误;向脚本中注入访问多个不同数据源的内置函数和http请求的相关对象;根据http请求的查询参数对脚本进行部分替换和裁剪,生成用于执行的脚本;将用于执行的脚本提交到Java虚拟机的脚本引擎中执行,返回json格式的查询结果。
可选地,在本发明提供的数据服务发布方法中,提取http请求的相关对象,相关对象包括请求对象、响应对象、请求头、请求体;编写内置函数将相关对象注入脚本中;在脚本中引用内置函数来访问不同的数据源和查询参数。
可选地,在本发明提供的数据服务发布方法中,内置函数包括find函数、log函数、assert函数、util函数、httpclient函数,find函数为执行SQL语句或其他数据源查询特定元素的函数;log函数为记录程序运行过程中的日志函数;assert函数为检查程序中条件是否为真的断言函数;util函数为工具类函数,httpclient函数为用于发起http请求和处理http响应的函数。
可选地,在本发明提供的数据服务发布方法中,从http请求对象中获取查询参数的值;根据查询参数的值对脚本中预留的参数进行替换;根据查询参数的值判断是否需要裁剪部分脚本;将处理后的脚本作为http响应的一部分,返回用于执行的脚本。
可选地,在本发明提供的数据服务发布方法中,将调试后的脚本持久化保存在数据库或文件系统中;将数据库或文件系统中的脚本推送给所有运行中的服务实例的Java虚拟机;在Java虚拟机上将脚本编译成 javax.script.CompiledScript 对象实例。
可选地,在本发明提供的数据服务发布方法中,在应用程序中定义不同的路由和响应该路由的服务实例;将路由映射到http容器中,以便当接收到该路由的请求时调用对应的服务实例进行处理;在服务网关的配置文件中定义对外暴露的路由和相应的后端服务地址,使服务网关将外部请求重定向到对应的服务实例;基于云原生架构将配置好的服务实例和服务网关部署到服务器中。
根据本发明的第二方面,提供了一种基于云原生架构的数据服务分发系统,包括:服务网关、服务实例和服务管理模块。
其中,服务网关用于接收客户端的http请求,根据负载均衡策略将请求路由到后端一个或多个服务实例上;
服务实例用于根据http请求参数从多个不同的数据源中获取请求数据,数据源包括关系型数据库、非关系型数据库、文件系统、缓存系统、web服务接口、第三方接口、消息队列;
服务管理模块用于在云原生架构提供的Java虚拟机上在线编写、调试、预编译服务脚本得到对应的服务实例。
根据本发明的第三方面,提供一种计算设备,包括:至少一个处理器;和存储有程序指令的存储器,其中,程序指令被配置为适于由至少一个处理器执行,程序指令包括用于执行上述基于云原生架构的数据服务发布方法的指令。
根据本发明的第四方面,提供一种存储有程序指令的可读存储介质,当程序指令被计算设备读取并执行时,使得计算设备执行上述的基于云原生架构的数据服务发布方法。
根据本发明提供的基于云原生架构的数据服务发布方法和系统,通过在云原生架构提供的Java虚拟机上,使用groovy语言和Java语言混合编写服务脚本,可以基于服务脚本中的内置函数直接访问不同数据源,能够大大降低服务开发的成本和难度;通过即刻编写即刻调试可以快速迭代开发服务;在服务应对高并发的请求时,通过云原生技术的负载均衡、熔断、智能弹性伸缩等机制,可以保障服务运行的稳定性和高可用性。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
具体实施方式
云原生是一种基于微服务架构的应用程序开发和部署方法,有容器化、弹性伸缩等特点。在云原生环境下发布数据服务的一种常用方式是使用容器化技术将数据打包成镜像,在容器平台上进行部署和管理。
本方案摒弃了服务编写、编译、制作镜像、部署等冗长步骤,做到即刻编写即刻提供服务的快速响应,能够最大限度满足消费者高并发、高频率的调用需求。
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了根据本发明一个实施例的基于云原生架构的数据服务发布系统示意图。基于云原生架构的数据服务发布系统可以提供给其他应用程序或用户进行访问和使用,并提供数据管理、数据服务发布、监控与运维等功能。
如图1所示,该系统包括服务网关、服务实例(服务实例1......服务实例-N)和服务管理模块。其中,服务网关用于接收客户端的http请求,根据负载均衡策略将请求路由到后端一个或多个服务实例上。服务网关通过对外暴露路由,可以提供集中式的请求处理、路由转发、负载均衡、安全认证、限流、熔断等功能。
服务实例用于根据http请求参数从多个不同的数据源中获取请求数据,数据源包括关系型数据库、非关系型数据库(NoSQL)、文件系统、缓存系统、web服务接口、第三方接口、消息队列。
其中,服务脚本运行在JVM(Java虚拟机)上被编译为独立的服务实例。通过服务网关可以响应特定的请求,当触发特定的请求时,服务实例可以从多个不同的数据源中获取数据,并根据实际需求弹性伸缩计算资源,以适应不断变化的流量和负载。
服务管理模块用于在云原生架构提供的Java虚拟机上在线编写、调试、预编译服务脚本得到对应的服务实例。
通过本发明提供的基于云原生环境的数据服务发布系统,服务发布者只需关心服务本身的实现逻辑,无需关心运行环境。系统支持使用Java、groovy语言进行开发,且内部预先实现了访问多种不同类型数据源的函数,可以在脚本中直接使用进行读取数据的操作。
图2示出了根据本发明一个实施例的计算设备100的结构框图。如图2所示,在基本的配置102中,计算设备100典型地包括系统存储器106和一个或者多个处理器104。存储器总线108可以用于在处理器104和系统存储器106之间的通信。
取决于期望的配置,处理器104可以是任何类型的处理器,包括但不限于:微处理器(µP)、微控制器(µC)、数字信息处理器(DSP)或者它们的任何组合。处理器104可以包括诸如一级高速缓存110和二级高速缓存112之类的一个或者多个级别的高速缓存、处理器核心114和寄存器116。示例的处理器核心114可以包括运算逻辑单元(ALU)、浮点数单元(FPU)、数字信号处理核心(DSP核心)或者它们的任何组合。示例的存储器控制器118可以与处理器104一起使用,或者在一些实现中,存储器控制器118可以是处理器104的一个内部部分。
取决于期望的配置,系统存储器106可以是任意类型的存储器,包括但不限于:易失性存储器(诸如RAM)、非易失性存储器(诸如ROM、闪存等)或者它们的任何组合。计算设备中的物理内存通常指的是易失性存储器RAM,磁盘中的数据需要加载至物理内存中才能够被处理器104读取。系统存储器106可以包括操作系统120、一个或者多个应用122以及程序数据124。
在一些实施方式中,应用122可以布置为在操作系统上由一个或多个处理器104利用程序数据124执行指令。操作系统120例如可以是Linux、Windows等,其包括用于处理基本系统服务以及执行依赖于硬件的任务的程序指令。应用122包括用于实现各种用户期望的功能的程序指令,应用122例如可以是浏览器、即时通讯软件、软件开发工具(例如集成开发环境IDE、编译器等)等,但不限于此。当应用122被安装到计算设备100中时,可以向操作系统120添加驱动模块。
在计算设备100启动运行时,处理器104会从存储器106中读取操作系统120的程序指令并执行。应用122运行在操作系统120之上,利用操作系统120以及底层硬件提供的接口来实现各种用户期望的功能。当用户启动应用122时,应用122会加载至存储器106中,处理器104从存储器106中读取并执行应用122的程序指令。
计算设备100还包括储存设备132,储存设备132包括可移除储存器136和不可移除储存器138,可移除储存器136和不可移除储存器138均与储存接口总线134连接。
计算设备100还可以包括有助于从各种接口设备(例如,输出设备142、外设接口144和通信设备146)到基本配置102经由总线/接口控制器130的通信的接口总线140。示例的输出设备142包括图形处理单元148和音频处理单元150。它们可以被配置为有助于经由一个或者多个A/V端口152与诸如显示器或者扬声器之类的各种外部设备进行通信。示例外设接口144可以包括串行接口控制器154和并行接口控制器156,它们可以被配置为有助于经由一个或者多个I/O端口158和诸如输入设备(例如,键盘、鼠标、笔、语音输入设备、触摸输入设备)或者其他外设(例如打印机、扫描仪等)之类的外部设备进行通信。示例的通信设备146可以包括网络控制器160,其可以被布置为便于经由一个或者多个通信端口164与一个或者多个其他计算设备162通过网络通信链路的通信。
网络通信链路可以是通信介质的一个示例。通信介质通常可以体现为在诸如载波或者其他传输机制之类的调制数据信号中的计算机可读指令、数据结构、程序模块,并且可以包括任何信息递送介质。“调制数据信号”可以这样的信号,它的数据集中的一个或者多个或者它的改变可以在信号中编码信息的方式进行。作为非限制性的示例,通信介质可以包括诸如有线网络或者专线网络之类的有线介质,以及诸如声音、射频(RF)、微波、红外(IR)或者其它无线介质在内的各种无线介质。这里使用的术语计算机可读介质可以包括存储介质和通信介质二者。在根据本发明的计算设备100中,应用122包括用于执行本发明的基于云原生架构的数据服务发布方法300的指令。
图3示出了根据本发明一个实施例的基于云原生架构的数据服务发布方法300的流程示意图。如图3所示,该方法300始于步骤S310,在云原生架构提供的Java虚拟机上在线编写并调试服务脚本,服务脚本中包含用于访问不同数据源的内置函数。
由于Java平台的JSR223规范定义了一种通用的Java脚本语言集成API文档,通过这个API文档,应用程序可以使用任何支持JSR223规范的脚本语言编写脚本,并在运行时将这些脚本与Java代码集成。因此,可以使用groovy语言和Java语言混合编写服务脚本。
其中,groovy语言是一种基于Java平台的开源动态编程语言,可以直接运行在Java虚拟机上,不用进行编译可以与Java无缝互操作。例如,可以直接使用Java类库和框架并在groovy中调用Java代码。反之亦然,Java代码也可以直接使用groovy类库和脚本。
系统内部预先实现了访问多种不同类型数据源的函数,可以在groovy脚本中直接使用,进行读取数据的操作。
在本发明的一个实施例中,可以在服务管理模块提供的Groovy Web Console、JDoodle、Repl.it、Gist等在线web编辑器和调试器上,使用groovy和Java语言混合编写脚本,以便用groovy脚本扩展Java应用程序的功能,同时利用groovy的优势使代码变得更加简洁易读、易维护。
例如,使用Java和Groovy混合编写的脚本代码如下:
// Groovy代码定义一个类
class MyGroovyClass {
def myMethod() {
println "Hello, Groovy!"
}
}
// Java代码使用这个类
public class MyJavaClass {
public static void main(String[] args) {
// 创建Groovy类实例
MyGroovyClass groovyObj = new MyGroovyClass()
// 调用Groovy方法
groovyObj.myMethod()
// 使用Java的库函数
String str = "Hello, Java!"
System.out.println(str)
}
}
在这个示例中,使用Groovy定义了一个类MyGroovyClass和一个方法myMethod(),并在Java代码中创建了这个类的实例,调用了这个方法。同时,Java代码还使用了Java的库函数System.out.println()打印了一句话。
这种混合编写方式可以充分利用Java和Groovy的特点,提高代码的可读性和可维护性。通过混合编写,可以以较低的代价使用Groovy的特性,同时不会失去Java的优势。
然后,解析服务脚本,检查脚本中是否有语法错误。例如,JavaScript可以通过eval()函数或浏览器的开发者工具来解析代码并检查是否存在语法错误。在浏览器中,可以使用window.onerror事件来捕获语法错误。需要说明的是,解析和检查脚本语法错误只能保证代码的合法性,并不能保证代码的逻辑正确性,需进一步进行测试和验证。
随后,向脚本中注入访问多个不同数据源的内置函数和http请求的相关对象。
将需要注入的函数定义为服务内置函数,将脚本与服务环境绑定以便脚本可以访问到服务内置的函数。内置函数主要包括find函数、log函数、assert函数、util函数、httpclient函数。
其中,find函数为执行SQL语句或其他数据源查询特定元素的函数。log函数为记录程序运行过程中的日志函数。assert函数为检查程序中条件是否为真的断言函数。util函数为工具类函数,例如日期处理、字符串操作、文件读写等。httpclient函数为用于发起http请求和处理http响应的函数。
还可以提取http请求的相关对象,如请求对象、响应对象、请求头、请求体等,编写内置函数将相关对象注入脚本中。通过将HTTP请求的相关对象作为内置的系统函数注入到脚本中,可以使脚本易于维护和扩展。在脚本中引用内置函数即可访问不同的数据源和查询参数。
随后,根据http请求的查询参数对脚本进行部分替换和裁剪,生成用于执行的脚本。
具体地,从http请求对象中获取查询参数的值;根据查询参数的值对脚本中预留的参数进行替换;根据查询参数的值判断是否需要裁剪部分脚本;将处理后的脚本作为HTTP响应的一部分,返回用于执行的脚本。
例如,可以使用request对象获取用于测试的HTTP请求的方法、URI、查询字符串和远程地址。在主程序中,创建一个GroovyHttpServletRequest对象,并将其作为参数传递给myFunction函数。GroovyHttpServletRequest是一个Groovy封装的HttpServletRequest对象,它提供了与HTTP请求相关的信息和方法。
最后,将用于执行的脚本提交到Java虚拟机的脚本引擎中执行,返回json格式的查询结果。在脚本调试过程中,可以通过设置断点,暂停脚本的执行,在此处检查变量的值和执行状态,以便分析问题所在。
完成脚本调试后执行步骤S320,将调试后的服务脚本持久化保存,并将服务脚本编译成服务实例。
可以将调试后的脚本持久化存储在数据库或文件系统中,这样可以使脚本易于管理、分享和重用。例如,将脚本以文本形式存储在关系型或非关系型数据库中,在应用程序中,可以通过SQL查询语句或ORM(Object Relational Mapping)框架来检索和更新脚本。还可以将脚本存储在本地文件系统或云存储系统中,在应用程序中通过文件路径或URL(Uniform Resource Locator,统一资源定位器)来访问脚本。
随后,将脚本推送给所有运行中的服务实例的Java虚拟机;在Java虚拟机上将脚本编译成 javax.script.CompiledScript 对象实例。这样可以提高脚本执行效率,并在后续执行中重复使用已编译的代码。
由于JVM本身只能执行编译后的字节码,用Groovy编写的服务代码在执行时也会经历解析、编译的过程,这个过程会有一定的耗时和资源占用。当服务脚本已经定型后,编译成为一个常驻内存的对象,可以有效的提升服务性能。
最后执行步骤S330,在服务实例的http容器中注册对应的服务路由,在服务网关中注册对外服务路由。
服务脚本完成后,需要将服务对外暴露,以便能够被外部用户或系统访问。此时需要两项路由映射操作。
一方面,可以在服务实例的HTTP容器中进行服务路由的注册。例如,在应用程序中定义不同的路由和响应该路由的服务实例;将路由映射到http容器中,以便当接收到该路由的请求时调用对应的服务实例进行处理。
另一方面,在服务网关的配置文件中定义对外暴露的路由和相应的后端服务地址,使服务网关将外部请求重定向到对应的服务实例;基于云原生架构将配置好的服务实例和服务网关部署到服务器中。
在云原生环境中,为了达到服务的高可用、高并发的目的,所有的请求流量均会先由服务网关接收处理,根据设定的服务负载均衡策略,然后转发到上游的服务实例中完成请求。
图4示出了根据本发明一个实施例的服务请求路由示意图。如图4所示,服务请求会先由服务网关接收处理,然后根据设定的负载均衡策略(如轮询、最少连接、响应时间等策略)将服务请求转发到上游的服务实例中完成请求。
根据本发明提供的基于云原生架构的数据服务发布方法和系统,通过在云原生架构提供的Java虚拟机上,使用groovy语言和Java语言混合编写服务脚本,可以基于服务脚本中的内置函数直接访问不同数据源,能够大大降低服务开发的成本和难度;
通过即刻编写即刻调试可以快速迭代开发服务;在服务应对高并发的请求时,通过云原生技术的负载均衡、熔断、智能弹性伸缩等机制,可以保障服务运行的稳定性和高可用性。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。