第 72 届早早聊大会将于 2023 年 10 月 29 日(本周日)举办 – 前端跨端方案|跨端同构,方法框架,5 位讲师下午直播,关键词:跨端框架/跨端组件库/小程序/ Harmony /Electron 。
跟早早聊一起,码上多平台,上车链接:www.zaozao.run/conf/c72
正文如下
本文是 2023 年 4 月 8 日,第六十二届 – 前端早早聊【Node.js】专场,来自 Eolink 的 前端负责人 —— 黎芷君的分享。感谢 AI 的发展,借助 AI 的能力,最近我们终于可以非常高效地将各位讲师的精彩分享文本化后,分享给大家。(完整版含演示请看录播视频和 PPT):www.zaozao.run/video/c62
大家好,我是 Eolink 的前端负责人黎芷君, Eolink 是一家以产品驱动的公司,我们的使命是致力于帮助全球的企业去挖掘他们的 API 的价值。我今天分享的主题是《如何使用 Node.js 搭建高性能测试服务》。
首先我们简要地探讨一下建立这个测试服务的背景和意义。在当今互联网时代,越来越多的应用程序和服务采用API 作为数据传输和交互的关键方式。因此,验证 API 的正确性和性能已经成为企业应用程序开发过程中不可或缺的环节。
假设我们拥有一款高性能的 API 测试服务,开发者可以获得更可靠且高效的测试体验。更重要的是,这个服务可以帮助我们更快速地发现生产 API 中的问题,并迅速解决这些问题。这进一步提高了整个开发流程的效率,以及产品的质量。
技术选型
介绍了项目的背景和意义,接下来我们来讨论一下我们技术选型。尽管在前文中提到,我们最终选择了Node.js作为开发语言,但我仍希望大家能了解我们选择 Node.js 的原因。我整理了一份表格,其中列出了一些流行且适合用于构建测试服务的编程语言,包括它们的容器、技术选择、监控日志以及可扩展性等方面的分析。
简而言之,如果你需要开发大型或企业级应用程序,Java 可能是一个合适的选择,因为它具有良好的可扩展性和可移植性。而如果你要构建高性能的浏览器应用程序或分布式系统,选择 Golang 可能更合适,因为像 Docker 和 Kubernetes 等项目都是使用 Golang 开发的。如果你需要高性能且内存占用较小的解决方案,那么可能会推荐使用 Rust。它不仅速度快,而且在服务器内存方面占用也是比较小的。
如果项目需要高并发处理,那么可以考虑使用 Node.js,因为它在处理高并发和大量 IO 任务方面表现出色。但需要注意的是,每种技术都有其优缺点,没有绝对的最佳选择。在进行实际技术选型时,我们除了需要综合考虑上面的因素之外,还需要结合业务场景、团队成员的技能水平以及项目开发周期等因素来做出决策。
对于我们的项目,除了 Node.js 的高并发处理能力外,还因为它在企业级 API 测试服务的开发中被广泛应用。所以综合考虑了多个因素最终我们选择了 Node.js。
如何搭建
接下来,让我们了解如何使用它来构建我们的高性能 API 测试服务。首先,我们可以从创建一个简单的可扩展的 HTTP 测试服务开始,重点关注以下五个技术要点:
- 技术选型
- 接口设计
- 可扩展性
- 监控日志
- 容器技术
技术选型
首先看一下技术选型,也就是为 Node.js 项目选择合适的技术框架。总的来说,Node.js 本身是一个简单、轻量且灵活的框架。但与其他框架相比,使用原生 Node.js 可能需要编写更多的代码,对于新手而言上手难度较高。
如果我们考虑使用 Express 框架,它是一种非常流行的选择,具有丰富的中间件库,非常适合新手使用和定制。Koa 框架是从 Express 分离出来的,它采用了异步处理方式,更加简洁且易于扩展,相比 Express 更轻巧。Hapi 框架主要用于构建可伸缩的应用程序,拥有强大的插件系统和中间件支持。Nest.js 是一款后端框架,提供了丰富的开箱即用功能和模块化架构。
尽管 Express、Koa、Hapi 都是当前流行的 Node.js 框架,可以显著提高日常开发效率,但使用框架的主要缺点是它们可能不够灵活。有时,我们可能需要采用一些 hack 的方式来满足特定需求。鉴于我们的系统需要高度定制和更大的灵活性,综合考虑后,我们选择了使用原生 Node.js 进行开发。一旦选择了技术框架,我们就可以开始构建我们的服务了。
接口设计
关于接口设计,我主要想介绍一下通信协议。首先,让我们简单了解一下什么是协议。在网络通信中,协议是一种规则,用于指导数据传输和交换。常见的网络协议包括 HTTP 和 WebSocket,我们的选择是在这两者之间进行权衡,因为它们各有优缺点。
HTTP 协议的优点在于易于上手和使用,而且广泛应用于各种应用程序。它也支持多种编程语言。然而,HTTP在日常使用中可能存在较大的网络开销和延迟,因为每个请求都需要进行三次握手。WebSocket 协议可以实现客户端和服务器之间的双向通信,特别适用于需要实时传输和对实时性要求较高的场景。相对于 HTTP,WebSocket 可以减少网络传输的开销和延迟,提高数据传输的效率和性能。
总之,如果你需要实时传输,WebSocket是一个不错的选择。如果你只需要简单的数据传输或请求-响应场景,HTTP 可能更适合。从技术开销的角度来看,WebSocket 的存在可以提升产品体验,因为它允许无感知地切换应用页面,减少明显的加载效果。考虑到我们的服务针对的是开发者,开发者工具的速度要求很高。因此,API 测试结果的实时性和正确性对我们的服务至关重要。作为一家以用户体验为重的公司,我们最终选择了 WebSocket。
聊到 WebSocket 协议,大家都了解 WebSocket 连接可能由于各种原因发生意外中断,例如网络突然断开或服务器崩溃等。因此,在设计 WebSocket 的结构时,我们需要考虑心跳机制,以确保连接的稳定性和可靠性。
下面是一个简单的心跳维持代码示例,我们主要使用第三方库 WS 来创建 WebSocket 对象。在 onpen 事件中,我们监听 WebSocket 的连接事件,并使用 setInterval 以 30 秒的间隔发送心跳 ping 包。然后,在 message 事件中,我们可以监听 WebSocket 的消息事件。
实际的 WebSocket 心跳机制实现方案将根据具体业务场景而异,不同的场景可能需要不同的设计。例如,我们可以在发送心跳包时将当前时间戳作为参数发送给服务器。服务器在接收到心跳包参数后可以存储该时间戳,并在接收到客户端的下一个心跳包时解析该时间戳,以确定连接状态。这种方法可以增加 WebSocket 连接的安全性和可靠性。
接下来,我们需要编写实际发送 HTTP 请求的服务。Node.js 提供了一个内置的 HTTP 模块,可以用于发送和接收 HTTP 请求,就像下面的示例。此外,我们还可以使用成熟的第三方库,如 Axios 和 Request。这些库提供了更多的功能选项,使 HTTP 请求的创建更加方便和灵活。
如果我们选择使用原生模块,需要注意它不能自动执行重定向。这意味着作为测试服务,我们无法真实模拟浏览器发送的 HTTP 请求。针对这种情况,我们需要自动验证接收到的 HTTP 状态码,并手动执行重定向。此外还需要考虑重定向的死循环情况。
可扩展性
以上,我们的 HTTP 测试服务基本上已经有了,可以立即投入使用。但是我们不能只考虑眼前的情况,还需要更长远的考虑。有人曾说,做技术的人每年都可能会考虑对当前项目进行重构,甚至认为以前编写的代码很糟糕。但作为一个长期迭代的产品,我们不能随意进行重构。
因此,在实现我们测试服务原型的时候,我们需要考虑可扩展性。可扩展性是指应用能够在需要时快速扩展或缩减资源,以满足不断变化的需求。
那么如何保证它的可拓展性?主要有四点:
- 选择合适的架构模式:选择一个可扩展的架构模式至关重要。对于我们的测试服务,采用微服务架构是明智的选择。这种架构模式有效地支持服务的水平扩展和负载均衡。
- 选择适当的容器技术:容器技术可以方便地管理和部署应用,从而提高系统的可扩展性。使用容器化可以让我们更灵活地管理应用。
- 合理应用云计算:云计算平台可以让我们更轻松地扩展和管理应用。例如,亚马逊的云计算平台允许轻松创建、部署和管理多个应用实例,并根据需求进行弹性扩容或缩容。
- 选择适当的数据库:虽然我们的测试服务可能不涉及数据库交互,但仍然需要选择适合的数据库,以支持未来可能的需求。数据库也是系统架构中重要的一环,应根据实际情况进行选择。
监控日志
还有一点需要注意的是,在软件开发过程中,日志是一个非常重要的组成部分。通过日志,我们可以了解应用程序的运行情况,如发生了哪些异常,哪些 API 接口被调用,用户行为等。这些信息有助于更好地分析和定位生产 API 问题,并为我们提供更多的业务价值。
在 Node.js 中,建立监控日志系统非常有益。我们可以使用内置的 console 模块将日志信息输出到控制台,也可以使用成熟的第三方库将日志输出到文件、数据库,甚至通过邮件或短信进行告警。不管怎样,一个完善的日志系统可以帮助我们更好地监控应用程序,及时发现和解决问题,而不依赖于用户的反馈。
要建立这样的系统,我们可以从以下四个方面入手:
- 设置日志级别:根据实际需要设置不同的日志级别,例如调试、警告或错误级别,以便更好地过滤和管理日志信息。
- 选择日志存储方式:确定日志存储方式,可以将日志存储在文件、数据库或远程服务器中,以便后续查询和分析。
- 定义日志格式:制定一种适合后续解析和查看的日志格式。
- 设置监控规则:例如某个 API 接口的调用次数超过一定值,或某个异常频繁出现,以帮助及时发现和解决问题。
总之,一个高效且可靠的监控日志系统可以帮助我们更好地监控和管理测试服务,提高开发效率和用户体验,是不可或缺的一部分。
容器技术
最后是容器技术的搭建,因为容器技术与开发者体验息息相关。我们知道 Node.js 是一种跨平台的强大的运行环境,允许我们在服务器端使用 JavaScript 编写代码,但当在服务器上运行多个 Node.js 应用程序时,可能会遇到一些问题,如不同 Node.js 应用之间的版本冲突、资源管理以及部署环境的复杂性等。
如果我们设计好容器技术,可以有效解决这些问题。容器技术可以将不同的应用程序隔离开来,避免版本冲突,并有效帮助管理不同应用程序之间的资源。此外,使用容器部署应用程序可以轻松实现快速部署、升级和回滚,还可以帮助我们快速构建本地开发环境。
两种常见且广泛使用的容器技术是 Docker 和 Kubernetes。Docker 目前是最流行的容器化技术之一,它提供了一种轻量级且可移植的容器化解决方案,允许我们将 Node.js 应用程序打包成容器镜像,并在不同环境中运行。Kubernetes 是一种开源的容器编排系统,它可以自动化部署、扩展和管理容器化的应用程序。它可以与 Docker一起使用,轻松管理多个容器,并提供负载均衡、自动扩展等功能。
容器技术的使用可以极大地提高开发和部署的效率。
拓展协议
到这里,我们的可扩展的 HTTP 测试服务已经基本搭建完成,但是为了满足不同应用程序或服务的测试需求,我们需要支持更多的通信协议。不同的应用程序可能使用不同的协议进行通信,如果我们的测试服务只支持 HTTP,那么某些应用场景将无法进行测试。举个例子,我们之前提到的接口设计使用了 WebSocket 协议,那么这里就无法进行测试了。
随着技术的不断发展,新的通信协议不断涌现,如果我们的测试服务不能及时跟进并支持更多协议,就可能错过一些新兴应用程序的测试需求。因此,我们需要不断扩展我们的测试服务,以支持更多的协议,以适应不同程序或服务的测试需求,并确保测试的全面性和准确性。
这里我额外介绍一下我们的测试服务支持的 TCP、UDP 协议以及 gRPC 框架。我会提供一些简单的代码示例和它们的使用场景,让大家有一个基本的概念。
TCP 协议 服务器托管网
TCP 是一种控制协议,适用于需要传输大量数据且要求可靠性的情况。在 Node.js 中,我们可以使用内置的 net模块来发起 TCP 请求。就像下面这个示例,我们可以使用 net.createconnection 方法创建 TCP 客户端,并连接到指定的服务器端口。连接成功后,我们可以通过监听 data 事件来处理服务器返回的数据,通过 close 事件来监听连接关闭,通过 error 事件来处理错误。
在实际应用中,我们还需要考虑处理 TCP 连接的错误、超时以及处理不同数据报文的拆包和粘包等问题。为了更好地处理数据报文,我们通常会制定报文解析规则。右边的图是 Eolink 提供的 TCP 测试界面,其中需要特别注意的是报文解析规则。我们可以选择根据报文的长度进行切割,或者使用换行符等方式,这有助于有效解决数据报文的粘包问题。
UDP 协议
UDP 是一种不保证数据传输可靠性的协议,更适用于实时性要求较高而可靠性要求较低的场景,例如直播应用。在 Node.js 中,我们可以使用 dgram 模块来发起 UDP 请求。代码与 TCP 类似,不展开详细介绍。
但需要额外注意一点,dgram 模块支持两种方式创建 UDP socket,分别是 UDP4 和 UDP6。它们对应两种不同的网络通信协议,即IPv4 和 IPv6。IPv4 是目前互联网上广泛使用的协议,而 IPv6 则是 IPv4 的升级版,旨在解决 IPv4 地址不同和安全性较低等问题。IPv6 支持更大的地址空间和更高的安全性等特性。
在实际应用中,由于历史原因和设备兼容性等因素,在实际应用中,IPv6 的普及度相对较低。因此,在选择 UDP4 和 UDP6 时,应该根据实际的网络环境和应用场景来做出选择。
gRPC 框架
最后是 gRPC,实际上,gRPC 不是一种协议,而是一款框架,由谷歌开发,具有高性能的远程过程调用功能。由于当前比较流行,我就挑出来分享一下。
其实在 Node.js 中,我们可以使用谷歌提供的 gRPC 模块来发起 gRPC 请求。下面是一个简单的代码示例,右边展示的是 Eolink 提供的 gRPC 测试界面。需要注意的是,gRPC 依赖于 .proto 文件资源进行数据报文传输。因此,在测试界面中,我们提供了一个 proto 编辑器,支持上传文件或直接编辑文件内容。
这就是一个简单的 gRPC 测试服务服务器托管网,现在已经可以被正式地投入使用了。
性能瓶颈
但是随着用户数量的增加,以及用户对系统的更深入使用,难免会遇到性能问题。在这方面,我们需要考虑性能瓶颈这一个概念。
性能瓶颈指的是在应用程序运行过程中,某些操作或资源成为应用的瓶颈,导致应用无法保持稳定和高效的运行。简单来说,如果你的系统突然感到卡顿,排除了代码问题,那么很可能是遇到了性能瓶颈。当我们遇到性能问题时,需要及时识别和解决,以确保系统运行顺畅。
首先,我们来了解一下常见的 Node.js 性能瓶颈种类:
- 第一个是 CPU 瓶颈,通常发生在计算密集型的场景中,比如代码中包含大量循环或递归操作时。当应用程序使用过多的计算资源时,CPU 负载会达到极限,导致整体性能下降。
- 第二个是内存瓶颈,通常出现在需要处理大量数据或创建大量对象的场景中。当应用程序占用的内存超过系统可用内存时,操作系统可能将一些数据或对象存储在磁盘上,导致性能下降。
- 最后是 IO 瓶颈,它通常出现在需要频繁读写数据的场景中。当应用程序需要执行大量 IO 操作时,会占用大量系统资源,从而导致整体性能下降。
CPU 瓶颈
分析出瓶颈的原因之后,我们需要着手解决问题。对于 CPU 瓶颈,它主要出现在需要处理大量计算密集型任务时,尤其因为 Node.js 是单线程的,这可能导致性能瓶颈。为了解决这个问题,可以使用多线程和进程池的技术来提高性能。
多线程通常涉及创建多个 Node.js 进程,并在每个进程中执行应用程序的不同部分。这样,工作负载可以分散到服务器的多个 CPU 核心上,并在不同进程之间实现负载均衡。多线程的主要优点包括提高应用的响应速度,因为多线程应用程序可以同时处理多个请求,从而提高响应速度。此外,它将应用程序的负载分散到多个 CPU 核心上,提高了应用程序的可伸缩性。
由于它可以将我们的应用程序分布在多个进程中,所以即使单个进程发生故障,也不会导致整个程序崩溃,从而提高了程序的稳定性。
另一种提高性能的方式是使用进程池技术。进程池指的是一组已经启动并等待工作请求的进程,这些进程可以在应用程序接收到请求时立即处理它们。
它的主要优点包括:
- 响应速度:由于进程池中的进程已准备好接收请求,所以当新请求到来时,它们可以立即处理,从而提高整个程序的响应速度。
- 可伸缩性:进程池将应用程序的工作负载分散到多个进程中,提高了可伸缩性。
- 稳定性:因为进程池中的进程已准备好,能够立即接收请求,所以可以提高应用程序的稳定性。
总之,当应用程序遇到 CPU 瓶颈并需要处理大量计算密集型任务时,使用多线程和进程池技术可以帮助提高性能。在实际应用中,根据应用程序的特定需求选择适当的技术也很重要,例如减少循环或递归操作的使用,采用异步编程模型,或使用缓存等方法,以提高应用程序的执行效率。
内存瓶颈
对于内存瓶颈,主要需要更有效地管理 Node.js 应用的内存,以减少与内存管理相关的性能问题。
首先,让我们简单了解一些基础知识。在 Node.js 中,内存管理由 V8 引擎负责实现,V8 引擎具有自己的垃圾回收机制,它能够自动识别不再被引用的对象并回收它们占用的内存空间。如果我们的代码中使用了不合理的内存管理方式,可能会导致内存泄漏或过多的内存使用,从而影响整个应用的性能。为了更有效地管理 Node.js 应用的内存,我们可以采用一些内存管理技术。
首先,我们可以使用内存分析工具,这些工具有助于识别应用中的内存泄漏问题,分析程序内存的使用情况,帮助我们快速定位问题并进行优化。
下面这张图是火焰图,它是典型的内存分析工具之一。还记得当我们在开发这款测试服务时,曾经遇到了内存泄漏的问题。我们使用了 Node.js 的 proto 参数生成了一个 lock 文件,然后通过某些方法生成了火焰图。最终,我们成功地定位到了问题的根本原因。当时,内存使用一度急剧上升,最终触发了内存溢出,现在是稳定在 200 兆左右。
另一方面,我们可以限制内存使用。在启动应用程序或进程时,我们可以使用 –max-old-space-size 参数来设置 Node.js 的内存限制,以避免应用程序因内存使用过多而导致性能问题。对于一些频繁使用的数据,我们可以采用内存缓存技术,将它们存储在内存中,以提高整体访问速度,并减少频繁的 IO 操作。
最后,对于那些需要频繁分配或释放内存的情况,我们可以使用内存池技术。这种技术通过预分配一定数量的内存块,然后在需要时从内存池中获取,有助于减少内存频繁分配和释放,提高应用程序的性能。
总之,内存管理是 Node.js 应用程序开发中需要着重关注的问题之一。选择适当的内存管理技术有助于提高应用程序的性能和稳定性。
此外,还有其他一些技巧,如使用对象池以减少内存碎片,或采用高效的垃圾回收机制等,可以帮助减少应用程序的内存占用。需要注意的是,不能滥用垃圾回收,因为垃圾回收需要大量的计算资源。如果不解决内存瓶颈问题,可能会导致 CPU 瓶颈。
IO 瓶颈
最后是 IO 瓶颈的问题,在此之前,我先简要介绍一下阻塞 IO 和非阻塞 IO 的概念。阻塞 IO 操作在传统的阻塞 IO 操作中,当请求进入服务器时,服务器会一直等待响应返回,然后再处理下一个请求。这将导致服务器在等待IO 响应时无法同时处理其他请求,从而影响整个应用的性能。相比之下,非阻塞 IO允许在服务器等待 IO 响应的同时处理其他请求,提高了服务器的处理能力。在 Node.js 中,我们使用事件循环机制或异步 IO 操作,使非阻塞 IO 成为 Node.js 的重要特点之一。
Node.js 常用于解决 IO 瓶颈的问题,采用非阻塞 IO 操作。此外,我们还可以考虑采用一些 IO 优化技巧,例如使用异步 IO操作、缓存或事件循环等方法,主要是为了减少应用程序对系统资源的占用,从而提高整体程序的性能。
另外,还有一些常用的性能优化技巧,如使用多进程、多线程或负载均衡等方法,主要是为了提高应用程序的性能。此外,我们还需要定期使用性能监控工具来监控应用程序的性能状况,以及及时发现和解决性能瓶颈的问题。
以上就是搭建高性能 API 测试服务的整个过程。
饿死问题
接下来,我跟大家分享一个我们实际遇到的场景,即任务饿死的问题。虽然通过扩容或分布式应用,可以减少出现这种问题的概率,但当我们面临它时,需要具备一些分析思路。
首先,什么是饿死问题?饿死问题是指当我们的应用程序在处理大量请求时,某些请求因等待其他请求的完成而未能及时处理。这些请求会一直处于等待状态,直到发生超时或内存耗尽,这种情况就被称为饿死问题,因为这些请求就像饥饿的狗一样,无法得到处理。其实饿死问题和交通拥堵有些相似,道路宽度有限,还有应急车道,但只能容纳有限数量的车辆。如果超过了这个限制,就只能等待,而等待时间太长可能会导致放弃。
对于Node.js来说,它采用了非阻塞 IO 模型,正如前面所说,它通过异步事件和驱动机制处理大量并发请求,这种异步机制的优点在于它可以极大地提高程序性能和响应速度。然而,这种机制的潜在问题就是饿死问题,它可能对应用程序的性能和可用性产生重大影响。如果大量请求被阻塞,用户可能会经历长时间的等待或错误提示,这将给用户留下不好的印象,导致用户流失。
另外,如果我们的应用程序内存被饿死的请求耗尽,应用程序可能会崩溃或变得不可用,这可能会给我们的公司带来巨大损失,尤其是在一些在线交易或金融类应用程序中。
解决这个问题的方法有很多,其中一种是采用集群技术,将请求分配到多个 Node.js 进程中以提高处理能力和可靠性。另一种方法是采用异步编程方式,例如使用异步 IO 操作或之前提到的事件驱动编程模型,以充分利用Node.js 的单线程特性,减少阻塞 IO 操作对性能的影响,从而避免饿死问题的发生。
此外,对于一些耗时的操作,我们还可以使用 Node.js 的子进程或工作线程技术,将这些操作交给子进程或工作线程来处理,以避免主进程的阻塞。同时,我们还可以通过合理的设置 Node.js的事件循环机制和定时器等参数,充分发挥其性能优势,以提高应用的吞吐量和稳定性。
为了解决饿死问题并提高应用程序的性能和可用性,我们需要采取以下三个主要措施:
- 第一,需要优化我们的代码和算法,使其适应异步事件驱动机制,这将使我们的应用程序更好地处理大量请求,从而避免饿死问题的发生。
- 第二,进行应用程序的压力测试,以找出可能导致饿死问题的瓶颈,并有针对性地进行优化,以防止它们出现。
- 第三,使用监控工具监控应用程序的运行情况,及时发现并解决潜在问题,以防止它们导致饿死问题的发生。
总之,饿死问题是 Node.js 应用程序面临的一个严重问题,如果我们不能及时处理这个问题,将对应用程序的性能和可用性产生严重影响。因此,我们需要采取措施来防止它的发生或尽早发现问题,以确保我们的 Node.js 应用程序能够顺利运行,为用户提供更好的体验。
需要明确的是饿死问题是无法完全解决的。假设服务器的事务处理已经达到了极限,这时我们应该考虑构建一个分布式的 Node.js 调用架构,而不是执着地解决这个问题。当然,Node.js 在 API 测试领域还有许多其他有趣的应用场景,感兴趣的同学,可以进一步了解这些场景。
总结
总结一下,API 测试是 Web 应用程序开发过程中的重要组成部分。它有助于确保我们的 API 接口符合规范,性能稳定可靠。Node.js 作为一种非常流行的编程语言,在 API 测试领域有着广泛的应用。
最后,我想分享一些关于 API 测试领域应用场景的数据统计。根据 Test Project 的数据,Node.js 是目前最受欢迎的 API 测试框架之一。根据统计,接近 50% 的 Test Project 用户使用 Node.js 进行 API 测试等任务。
实际上,Node.js 在 API 测试领域有着广泛的应用场景。它能够帮助我们快速实现 API 测试的自动化、负载测试以及安全测试,从而提高测试效率和测试质量。根据相关统计数据,Node.js 已经成为 API 测试领域备受欢迎的技术和工具之一。相信在未来,Node.js 在 API 测试领域的应用场景将变得更加广泛,同时其他的领域也有待我们去挖掘。
以上就是我所有的分享内容,谢谢大家。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net