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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- CentOS8编译安装MySQL8.0.19
- MySQL数据库在高并发下的优化方案
- CentOS7,8上快速安装Gitea,搭建Git服务器