pr嵌套有什么用(Dapr 的一个轻量级、安全、可移植

足球明星 2025-06-30 10:22www.1689878.com足球直播

作者为Michael Yuan,WasmEdge维护者

源自infoQ,链接为q/articles/webassembly-dapr-wasmedge/

Dapr是一个功能强大的构建微服务的框架,而WebAssembly VM如WasmEdge则为微服务应用程序提供了高性能且安全的runtime。将如何将基于WebAssembly的微服务与Dapr sidecar应用程序相结合,以充分利用其优势。

自2019年以来,Dapr(Distributed Application runtime)已成为构建微服务的热门开源框架。它为分布式应用程序提供了常用的构建块和服务,如服务调用、状态管理、消息队列等。Dapr的sidecar模式使得微服务能够在任何语言、任何框架、任何地方运行。

传统的应用程序容器如Docker虽然提供了可移植性、易于部署和安全性等优点,但也伴随着庞大的开销。为了解决这个问题,我们提出了一种新的方法,使用WebAssembly来运行Dapr sidecar应用程序。

在这种方法中,我们使用Rust或Go等语言编写的简单NaCl应用程序来监听微服务的API请求。这些请求数据被传递给WebAssembly runtime进行处理。微服务的业务逻辑由应用程序开发者创建并部署的WebAssembly函数完成。

WasmEdge作为云原生WebAssembly runtime的领先者,是市场上最快的WebAssembly runtime之一。它支持所有标准的WebAssembly扩展以及Tensorflow推理、KV存储、图像处理、Socket等专有扩展。通过将WasmEdge与Dapr结合,我们可以为微服务应用程序提供高性能且安全的运行环境。

WebAssembly程序的优点在于它们可以像编译后的机器原生二进制文件一样快速运行,并且比容器消耗更少的资源。它们支持高性能语言如C/C++、Rust、Swift等,并且可以轻松部署在不同的操作系统和硬件平台上。WebAssembly还提供了一个在runtime层级隔离应用程序的安全沙箱,开发者可以通过声明安全策略来限制程序对操作系统或其他资源的访问。

通过结合Dapr和WasmEdge,我们可以为微服务应用程序提供一种更高效、更安全的运行方式。这种结合使得开发者能够利用Dapr的分布式应用程序构建块和WebAssembly的高性能和安全特性,从而构建出更强大、更高效的微服务应用程序。

通过将WebAssembly与Dapr sidecar应用程序相结合,我们可以充分利用两者的优势,为微服务应用程序提供高性能、可移植且安全的运行环境。这种新的方法将有助于推动微服务的发展,并为开发者提供更多的选择和灵活性。利用WasmEdge的魔力:Dapr Sidecar应用程序的演示之旅

WasmEdge,一个强大的编译器工具链,支持多种WebAssembly语言,包括C/C++、Rust、Swift、Kotlin和AssemblyScript等。这篇文章将带你领略如何使用WasmEdge作为Dapr的sidecar应用程序runtime。

让我们快速启动我们的项目。你需要安装Go、Rust、Dapr、WasmEdge和rustwasmc编译器工具。接下来,从GitHub fork或clone demo应用程序。这个Repo可以作为你的应用程序模板。

这个演示项目包含了三个Dapr sidecar应用程序。其中,“web-port”项目为静态HTML页面提供公共Web服务,这是我们的应用程序的UI。而“image-api-rs”和“image-api-go”项目则提供了WasmEdge微服务,分别用于将输入图像转换为灰度图像以及对图像上的对象进行识别和分类。

图2展示了演示应用程序中的Dapr Sidecar微服务。根据README中的指示,你可以轻松启动sidecar服务。以下是构建WebAssembly函数和启动三个sidecar服务的命令:

在构建完我们的WebAssembly函数后,我们就可以启动我们的Web服务(即应用程序UI)。然后,我们可以构建并启动用于图像处理的微服务(灰度处理)。我们构建并启动基于TensorFlow的图像分类微服务。完成这些步骤后,你应该能在浏览器中看到这个Web UI(如图3所示)。

现在,让我们更深入地了解这两个WebAssembly函数。我们用Rust编写了两个函数,并编译成WebAssembly,部署在sidecar微服务中,执行实际的图像处理和分类工作。虽然我们的示例函数是用Rust编写的,但你也可以使用C/C++、Swift、Kotlin和AssemblyScript等语言编写函数并编译为WebAssembly。WasmEdge还支持用JavaScript和DSL编写的函数。

图像处理的Rust之旅:灰度转换与分类功能

在数字世界中,图像数据扮演着至关重要的角色。借助Rust编程语言,我们可以轻松处理图像数据,并从中提取有价值的信息。将引导您了解如何使用Rust实现图像灰度转换和分类功能。

让我们从一个简单的例子开始:图像灰度转换。在处理图像数据时,灰度转换是一种常见的技术,它将彩色图像转换为黑白图像。这对于许多图像处理任务(如边缘检测、特征提取等)非常有用。

我们需要读取图像数据并将其加载到内存中。借助Rust的io模块和image库,我们可以轻松完成这一任务。接下来,我们将使用image库的函数将彩色图像转换为灰度图像。完成转换后,我们需要将灰度图像保存为文件。根据图像的格式,我们可能需要使用不同的输出格式来保存图像。在这里,我们将使用image库中的write_to函数将灰度图像保存为GIF或PNG格式。

现在,让我们来看看如何将这个灰度转换功能集成到我们的项目中。我们使用rustwasmc工具来构建我们的代码,并将其复制到image-api-rs sidecar中。我们切换到functions/grayscale目录,然后使用rustup命令设置Rust版本为1.50.0。接下来,我们运行rustwasmc build命令来构建我们的代码,并启用扩展功能。我们将生成的WebAssembly模块(grayscale.wasm)复制到image-api-rs项目的lib目录中。

除了灰度转换,我们还可以利用Rust实现更高级的功能,如图像分类。分类函数是一个Rust函数,它接受图像数据的字节数组作为输入,并返回一个用于分类的字符串。该函数使用WasmEdge TensorFlow API来处理图像数据并生成分类结果。通过使用这种功能,我们可以轻松地集成机器学习模型到我们的项目中,从而实现更智能的图像处理功能。

Rust是一种强大的编程语言,它为我们提供了丰富的库和工具来处理图像数据。通过实现灰度转换和分类功能,我们可以轻松地从图像数据中提取有价值的信息。借助rustwasmc和WasmEdge TensorFlow API等工具,我们可以将这些功能集成到我们的项目中,并构建出功能强大的图像处理应用程序。

利用wasmedge_tensorflow_interface的力量

在一个深藏不露的rust世界,我们有一个神秘的内部推断函数——`infer_internal`。这个函数能够处理图像数据并返回关于图像内容的预测结果。它仿佛拥有读懂图像秘密的神奇能力。

这个函数加载了一个名为`mobile_v1_1.0_224_quant.tflite`的模型数据,以及对应的标签文件。这些数据文件和模型就像是预测结果的指南针和地图,帮助我们理解图像的真实内容。

紧接着,它调用`wasmedge_tensorflow_interface`将输入的图像数据转换为RGB格式,并将其调整为模型所需的尺寸。这个过程就像是将图像转化为模型能够理解的“语言”。

然后,它启动了一个会话,会话中包含了我们刚刚加载的模型和一系列配置。在会话中,模型被赋予了一个输入——经过处理的图像数据。接着,模型开始默默地在背后进行复杂的计算和分析。

计算完成后,函数从模型中获取输出数据。这些数据是一系列概率值,代表了图像中不同对象的出现概率。然后,这些概率值被映射到标签文件中的文本标签上,为我们揭示了图像的真实内容。

如果某个类别的概率值超过了设定的阈值(例如50%),函数就会生成一个包含预测结果的字符串,并附上对应的链接供进一步查询。否则,函数会返回一条未识别出任何食物项目的消息。这个链接就像是一座桥梁,连接了我们的预测结果和更深入的信息。

接下来,我们使用rustwasmc工具构建这个函数并将其复制到image-api-go的sidecar中。这个过程就像是将我们的预测能力打包并部署到微服务中,以便在各种环境中轻松使用。我们遵循特定的步骤来完成这个过程,确保每个步骤都准确无误。

Rust 代码片段 - 图像 API 服务器

```rust

async fn run_server(port: u16) {

// 初始化环境日志记录器

pretty_env_logger::init();

// 定义主路由处理请求映射

let home = warp::get().map(warp::reply);

// 定义处理图像上传的路由

let image = warp::post()

.path!("api", "image") // 设置特定的路径模式匹配图像上传请求

.body::bytes() // 期望接收字节流作为请求体内容

.map(|bytes: bytes::Bytes| {

// 将字节流转换为向量形式并调用图像处理函数

let v = bytes.iter().map(|x| x).collect::>(); // 更清晰的字节转换逻辑展示

let processed_image = image_process(v); // 调用图像处理函数并获取结果

Ok(Box::new(processed_image)) // 返回处理后的图像数据(装箱)

});

// 组合路由规则并添加CORS支持,允许任何来源的请求访问接口。同时启用日志记录功能。最后启动服务器并监听指定端口。整个操作是异步的。

let routes = home.or(image);

let routes = routes.with(warp::cors().allow_any_origin()); // 添加CORS支持以允许跨域请求访问接口。这样web应用可以在任何地方通过浏览器调用我们的服务接口。我们提供CORS功能确保web浏览器和API服务器之间通信畅通无阻。我们的Rust代码确保在客户端发送请求时不会遇到任何障碍。使用warp库,我们可以轻松地管理跨域资源共享策略(CORS)。在这里我们设置允许所有来源的访问请求,便于进行跨域请求处理。并且我们还可以看到在服务器端开启日志记录功能,便于调试和监控。我们启动服务器并监听指定端口,等待客户端的请求到来。这个过程是异步的,使得我们的代码更高效并且能够快速响应来自客户端的请求。这是使用Rust编程语言编写高效网络应用程序的优势之一。同时我们在服务器的响应中返回一些重要的日志信息以便开发者调试程序或分析数据使用情况等需求。这是实现一个可靠且高效的服务器的关键步骤之一。这些步骤确保我们的服务器可以稳定运行并满足客户需求。因此我们将通过异步操作启动服务器并开始监听指定端口等待客户端的请求到来。当收到请求时,我们将根据预先定义的路由规则进行处理并返回相应的响应结果给客户端。整个过程是异步的,确保我们的服务器能够快速响应和处理大量的并发请求从而提高服务器的性能和可靠性。当我们的服务器接收到图像文件时它将调用WasmEdge中的WebAssembly函数来执行图像处理任务。这是通过使用Rust编程语言实现的代码片段来展示如何调用WasmEdge中的WebAssembly函数进行图像处理操作的具体实现细节和操作过程介绍等内容进行介绍和分析的重要步骤之一。. 我们的代码将在收到POST请求后创建WasmEdge实例以与WebAssembly程序进行交互并开始处理上传的图像文件内容。"我们会创建WasmEdge实例以与WebAssembly程序进行交互然后处理收到的图像文件"。我们看到我们创建的子进程实例在运行时需要使用Command类实例化对象并指定要执行的程序路径参数以及配置输入输出流等信息然后进行执行操作以执行我们的WebAssembly函数进行图像处理任务。"我们创建了一个子进程实例来执行我们的WebAssembly函数进行图像处理任务"。我们在子进程的stdin流中写入接收到的图像数据作为输入数据供子进程处理并使用子进程的stdout流来获取处理结果。"我们将接收到的图像数据写入子进程的stdin流中作为输入数据并在子进程的stdout流中获取处理结果"。最后我们将处理后的图像数据通过HTTP响应返回给客户端。"我们最后将处理后的图像数据返回给客户端。"在整个过程中我们会充分利用Rust语言提供的并发特性来提高我们的代码运行效率保证服务器的性能稳定性并实现高性能的图像处理能力。"通过充分利用Rust语言的并发特性我们能够确保服务器的高效稳定运行并实现高性能的图像处理能力。"这就是我们编写的Rust代码片段实现图像API服务器的基本流程介绍和分析内容。"总的来说我们的Rust代码片段实现了图像API服务器的基本功能包括接收客户端的请求调用WasmEdge中的WebAssembly函数进行图像处理任务并将处理结果返回给客户端等功能。"通过这种方式我们可以为应用程序提供高性能的图像处理能力并在服务器端实现对图像数据的快速处理和响应。"通过使用Rust编程语言编写高性能的网络应用程序我们可以实现快速响应大量并发请求的能力并提高服务器的性能和可靠性。"此外我们还实现了日志记录功能以便更好地监控和调试我们的服务器程序运行情况提高服务器的稳定性和可用性。"通过启用日志记录功能我们可以轻松地监控和调试我们的服务器程序运行情况从而更好地了解服务器的性能和运行情况从而更好地满足客户需求并提高服务器的稳定性和可用性。"这些功能的实现都体现了Rust编程语言的强大优势和应用价值使其成为构建高性能网络应用程序的理想选择之一。"综上所述使用Rust编程语言构建高性能网络应用程序可以带来许多优势和价值包括提高性能稳定性可靠性可扩展性安全性和可维护性等方面同时使开发过程更加高效和便捷从而更好地满足客户需求和业务发展需求。总之使用Rust编程语言构建高性能在一个充满活力的编程环境中,我们有一个基于 Dapr 的微服务正在启动,准备响应来自四面八方的请求。这个服务通过 daprd 的 NewService 函数在端口 9003 上启动,就像一个照亮前方的灯塔,在这个数字世界中指引方向。每当接收到 HTTP POST 请求中的图像文件时,它会毫不犹豫地启动 WasmEdge 中的 WebAssembly 函数,进行基于 Tensorflow 的图像识别任务。这是一个智能化的流程,结合了 WebAssembly 的强大性能和 Tensorflow 的学习能力。在这个服务背后,WasmEdge 的 Go API 负责与 WebAssembly 程序进行无缝交互。接下来让我们深入了解一下这个服务的核心部分——图像处理器。当接收到图像数据后,它首先创建一个配置对象并启用 WASI(WebAssembly 系统接口)。然后,它创建一个新的虚拟机实例,并进行初始化设置。在注册了 WasmEdge 中的 tensorflow 和图像相关模块后,它加载了关键的 WebAssembly 文件并开始验证和实例化。然后,它执行绑定生成器函数进行图像识别,并处理返回的结果。一旦任务完成,虚拟机配置被清理并删除。处理后的数据以内容的形式返回给请求者,这个过程通过 Dapr 的 mon.Content 类型完成,保证了数据的完整性和准确性。除了这些幕后工作外,我们还通过 Dapr CLI 在 Dapr runtime 环境中启动了微服务。这是一条强大的命令,使得我们的服务能在各种环境中轻松运行,无论是本地的开发环境还是生产环境。这个微服务就像一个守护者在后台静静运行,等待着处理每一个请求,确保我们的应用程序始终保持高效和响应迅速。在这个数字化的世界中,它是连接现实世界和虚拟世界的桥梁,每一次的交互都代表着一次创新和进步的可能。这是一个融合了技术、高效且智能的微服务,它将为我们的应用程序带来无限的可能性和潜力。在您的项目目录中,当您运行Dapr来启动您的image-api-go应用程序时,背后隐藏着一个充满活力的Web UI服务。这个服务由web-port承载,这是一个用Go语言编写的简洁而强大的Web服务器。当您处于静态文件模式下时,它能提供静态HTML、CSS和JavaScript文件,并在处理图像时表现得尤为出色。当用户将图像上传到/api/hello端点时,它启动了流程。

让我们深入了解一下这个web-port服务的核心部分。在main函数中,您可以看到两个重要的路由处理器已经定义好了。第一个处理器是处理静态文件的静态处理器(staticHandler),当用户访问以'/static/'开头的URL时,它会读取并返回HTML、CSS和JS文件的内容。第二个处理器是图像处理器(imageHandler),当用户通过API上传图像时,它会处理这些请求。这个处理器会检查请求头中的“api”字段来确定下一步应该做什么。如果“api”字段的值是“go”,那么图像将被发送到通过Dapr API进行分类的微服务;否则,图像将通过HTTP API发送到灰度处理微服务。这种灵活性使得web-port服务能够无缝地与其他微服务集成,为用户提供丰富的功能。

想象一下,你正在启动一个充满活力和创新的分布式应用。在这个旅程中,WasmEdge这个通用语言运行时和Dapr的分布式网络运行时将成为你的得力助手。让我们一步步了解如何实现这一切。

让我们看看`runWasm`函数如何运作。它首先通过FileReader读取文件内容。当文件加载完成后,它会向我们的API发起一个POST请求。这个请求将包含我们刚刚读取的文件内容,并以Blob的形式发送出去。在这个过程中,XMLHttpRequest对象将扮演关键角色,负责与服务器进行通信。我们设置了加载状态并准备了处理请求结果的部分代码。这一切都完成后,我们得到了一个强大的应用,它能够利用WasmEdge的能力来处理各种类型的文件。

接下来,使用Dapr CLI命令来启动静态UI文件的Web服务。首先导航到web-port目录,然后使用dapr run命令启动服务。这个命令包含了许多重要的参数,如应用ID、协议类型、端口号等。完成这些步骤后,你将拥有一个分布式应用,它由三个部分构成,并使用两种语言编写。

现在让我们来看看Dapr和WasmEdge之间的协同作用。这两个强大的工具能够共同工作,为你的分布式应用提供强大的支持。与传统的服务网格不同,许多服务网格只能在Kubernetes上运行并依赖其API。而WasmEdge作为一个与Kubernetes兼容的runtime,可以作为轻量级容器替代方案来运行微服务。它的通用性和灵活性使得它能够在各种环境中发挥重要作用。

这种结合Dapr和WasmEdge的方法具有广泛的应用前景,可以推广到其他服务网格或分布式应用程序框架中。通过利用这两个工具的协同优势,你可以构建出更加高效、可扩展和可维护的分布式应用。随着技术的不断进步和创新,我们可以期待更多激动人心的应用场景出现。请继续关注我们的动态,一起这个充满无限可能的未来!

Copyright © 2016-2025 www.1689878.com 体育知识网 版权所有 Power by

足球|篮球|NBA|奥运|网球|高尔夫|田径|游泳|排球|赛车|比赛|亚运会