WebAssembly 组件模型 — 原因、方法和内容(第 2 部分)
原文作者:Timo Stark - F5 专业服务工程师转载来源: NGINX 中文官网
基于 Rust 的 Wasm 组件教程
Rust 开发设置
$ rustc -V rustc 1.76.0 (07dca489a 2024-02-04)
添加 wasm32-wasi 编译器目标
$ rustup target add wasm32-wasi
安装 cargo-component
$ cargo install cargo-component
安装 wasmtime 运行时和 CLI 进行测试
$ curl https://wasmtime.dev/install.sh -sSf | bash
使用 wasi Rust 库
$ cargo component new --lib test-wasi-component
$ cargo add wasi
[package] name = "test-wasi-component" version = "0.1.0" edition = "2021" [dependencies] bitflags = "2.4.2" wit-bindgen-rt = "0.21.0" wasi = "0.13.0" [lib] crate-type = ["cdylib"] [package.metadata.component] package = "component:test-wasi-component" proxy = true [package.metadata.component.dependencies]
use wasi::http::types::{ Fields, IncomingRequest, OutgoingBody, OutgoingResponse, ResponseOutparam, }; wasi::http::proxy::export!(Component); struct Component; impl wasi::exports::http::incoming_handler::Guest for Component { fn handle(_request: IncomingRequest, response_out: ResponseOutparam) { let hdrs = Fields::new(); let mesg = String::from("Hello, This is a Wasm Component using wasi/http:proxy!"); let _try = hdrs.set(&"Content-Type".to_string(), &[b"plain/text".to_vec()]); let _try = hdrs.set(&"Content-Length".to_string(), &[mesg.len().to_string().as_bytes().to_vec()]); let resp = OutgoingResponse::new(hdrs); // 添加 HTTP 响应状态代码 resp.set_status_code(200).unwrap(); let body = resp.body().unwrap(); ResponseOutparam::set(response_out, Ok(resp)); let out = body.write().unwrap(); out.blocking_write_and_flush(mesg.as_bytes()).unwrap(); drop(out); OutgoingBody::finish(body, None).unwrap(); } }
$ cargo component build --release
$ wasmtime serve target/wasm32-wasi/release/test_wasi_component.wasm
$ wasmtime serve target/wasm32-wasi/release/test_wasi_component.wasm Serving HTTP on http://0.0.0.0:8080/
$ curl -v localhost:8080 … > GET / HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/8.4.0 > Accept: */* > < HTTP/1.1 200 OK < content-type: plain/text < content-length: 54 < date: Tue, 12 Mar 2024 12:28:56 GMT < * Connection #0 to host localhost left intact Hello, This is a Wasm Component using wasi/http:proxy!
适用于生产级 Wasm 工作负载的 NGINX Unit
{ "listeners": { "127.0.0.1:8085": { "pass": "applications/my-wasm-component" } }, "applications": { "my-wasm-component": { "type": "wasm-wasi-component", "component": "path/target/wasm32-wasi/release/test_wasi_component.wasm" } } }
$ unitc config.json /config
$ curl -v localhost:8085 … < HTTP/1.1 200 OK < content-type: plain/text < content-length: 54 < Server: Unit/1.32.0 < Date: Tue, 12 Mar 2024 15:16:13 GMT < * Connection #0 to host localhost left intact Hello, This is a Wasm Component using wasi/http:proxy!
后续

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
AI Agent 十问十答,降低认知摩擦
作者:望宸 新兴技术的出现,总会伴随着术语洪流和流派之争,带来认知摩擦。 近期 OpenAI 发布了《A Practical Guide to Building Agents》电子书【1】,随后 Langchain 负责人驳斥了电子书中的一些观点,在官方博客发布了《How to think about agent frameworks》【2】。在一次夜聊中,受到同事亦盏的启发:新兴技术领域往往会经历事实标准的争夺,是模型往上,还是编排框架向下,时间才能给出答案,但作为行业从业者,不妨从中举一反三,甄别对自己有价值的信息。 本文通过提取并梳理以上两篇文章中的技术术语和价值信息,并进行扩展,再以问答形式来呈现,希望通过这种方式,在加深使用者和开发者对 AI Agent 的了解方面,起到一些帮助。 1、什么是 AI Agent? Agent,中文翻译为代理,顾名思义,代替用户在代理权限内去处理相关事宜。例如我聘请你作为代理律师,那么你将以我的名义进行民事法律行为;再例如我今天休假了,设置同事作为我的代理,去处理审批流等任务。 而 AI Agent 是指在普通代理的基础上,具备对任务的理解、环...
- 下一篇
鸿蒙跨端实践-揭秘视图渲染流程
作者:京东科技 刘宁 一、前言 通过本文你将全面清晰的洞悉动态化跨端的实现原理,感受黑悟空(数据)一路打怪升级(在不同语言环境中流转改造),逆天改命(操控原生视图绘制),终成齐天大圣(完成视图渲染呈现)的艰辛历程。 二、原理介绍 1.动态化跨端原理介绍 动态化- 罗码(Roma,后文统称动态化)是一个完全自主研发的一站式跨平台解决方案,一份代码,可以在 Android、iOS、Harmony 及 Web 上运行。动态化的跨端原理与 React Native 、Weex 一致,在吸取业界各跨端框架优势的基础上,加上自主创新,打造的一个完全自主可控的综合跨端解决方案。其跨端的理论基础在于各端都具备统一解析和执行 JavaScript 的能力(JS 虚拟机)。业务代码被打包成 js 文件,在各端被 JS 虚拟机加载,被解析成多条不同功能的指令,调用原生宿主能力,完成数据的传递和视图的绘制。示意图如下: 为了在鸿蒙端更好的接入动态化,有几点需要特别说明一下: 1.鸿蒙系统的方舟虚拟机能直接加载js文件吗? 鸿蒙的开发语言 ArkTS,是js语言的超集,但为了获取更高的执行效率去除了...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G