无服务器函数并发的本地模拟
《Wing Inflight》杂志第 9 期。
我很高兴与大家分享另一期《Wing Inflight Magazine》,其中包含有关Winglang
项目 的最新更新和新闻。
那么 Wing 又是什么?
Wing是一个全新的云端编程环境。它使开发者能够轻松构建和测试分布式系统,并充分利用各种强大的云原语,例如队列、主题、API 端点、存储桶、网站、主题以及不断壮大的 Winglib 生态系统。
Wing 带有一个可视化云模拟器,可用于在本地机器上与完整的云应用程序进行交互和测试,具有快速热重载功能,无需将单个
资源部署到云中。
Wing 的独特功能之一是它支持我们所说的可插拔平台
提供商。这意味着应用程序可以与云和配置引擎无关,因此可以使用多个配置引擎将它们部署到多个云提供商。
目前已经支持 Terraform/OpenTofu、CloudFormation、AWS、GCP 和 Azure,并且正在讨论
查看兼容性矩阵,在相关问题上添加您的👍,并分享您的用例以帮助我们确定优先顺序!
查看兼容性
矩阵,在相关问题上添加您的👍
,并分享您的用例以帮助我们确定优先顺序!
平台团队还可以使用 CDK 构建自己的定制平台。这可以集中
控制最佳实践、合规性策略、安全性、部署策略以及
Wing 应用程序在组织云环境中实施的任何其他方面。
Wing 仍处于积极开发阶段,但我们已开始看到一些非常酷炫的东西正在
使用它。如果您渴望体验一次真正有趣(但可能有些坎坷)的旅程,我们鼓励您 在本地机器或Wing Playground上试用
Wing ,并告诉我们您的 想法。
我们正在设计 Wing,以便让具有现代 面向对象背景(如 TypeScript、Swift、C# 和 Java)的开发人员熟悉和友好,因此您只需5 分钟即可学会。
在今天的期刊中
- 🐛使用断点进行调试
- 📊无服务器函数并发的本地模拟
- 💁适用于 React 和 Vite 的新项目模板
- 🔘通过以下方式向 Wing 类添加 UI
bring ui
- 🪝为 webhook 开发公开云端点
- 🏋️♀️明确提升预检对象
- 🤞默认对象标识符的更改
- 💼隐式加载的平台扩展
- 🕑标准化 cron 表达式
- 🎥 Wingly 更新中的好东西
- 🦁野外之翼
- 👯♂️社区活动
使用断点进行调试
现在可以设置断点并完全调试您的 Wing 应用程序!
Wing VS Code 扩展程序可.w
在预检和运行中代码文件中添加断点
,只需按 F5 即可进行调试。现在可以使用内置调试器检查和单步执行
代码。
无服务器函数并发的本地模拟
我们改进了cloud.Function
Wing Simulator 中的执行方式,使其
功能上的行为更接近 FaaS 提供商。现在,我们将每个函数运行在一个独立的子
进程中,并管理其并发限制。
concurrency
可以使用可传递给的选项或cloud.Function
任何采用
飞行中闭包的资源来控制这些限制。
例如:
bring util;
bring cloud;
let queue = new cloud.Queue();
let handler = inflight (x) => {
log("only one at a time: {x}");
};
queue.setConsumer(handler, concurrency: 1);
// ^^^^^^^^^^^^^^
test "push 10" {
for i in 0..10 { queue.push("{i}"); }
util.waitUntil(() => { return queue.approxSize() == 0; });
}
- 使用 运行此程序时
concurrency: 1
,代码在约 1.5 秒后完成 - 使用 运行时
concurrency: 10
,代码在 0.5 秒后完成
适用于 React 和 Vite 的新项目模板
我们正在继续为各种类型的项目添加新的项目模板,并且我们最近为臭名昭著的React与Vite
工具 组合创建了一个模板。
查看本指南
以获取详细教程或直接开始:
mkdir my-project && cd my-project
wing new react-vite
通过以下方式向 Wing 类添加 UIbring ui
现在可以通过
该ui
模块将简单的用户界面元素与 Wing 预检类关联起来。这些元素可以通过简单的
预检闭包实现与您的系统动态交互:
bring ui;
class MyResource {
counter: cloud.Counter;
new() {
this.counter = new cloud.Counter();
new ui.Button("Cool Button", inflight () => {
this.counter.inc();
});
new ui.Field("Counter", inflight () => {
return "{this.counter.peek()}";
});
}
}
现在,当MyResource
在 Wing Console 中选择一个节点时,您将在检查器
窗格中看到以下内容:
我们正在添加更多 UI 元素,迫不及待地想看看人们会用它们构建什么!
公开云端点以进行 webhook 开发
在开发通过 webhook(例如机器人
和扩展)对来自其他服务的请求做出响应的应用程序时,能够
在开发过程中接受来自这些外部系统的请求通常非常有价值。
所以现在,cloud.Endpoint
应用程序中的每个(通过cloud.Api
、cloud.Website
等显式或隐式定义)都可以公开,并且请求将被传送到本地
模拟器:
这是一个实验性的功能,仍然需要一些完善,我们很乐意听到
您的想法。
明确提升预检对象
当飞行中代码引用预检对象时,该对象将被提升
,并且 对该对象执行的操作将被限定,以便能够确定诸如 IAM 权限之类的内容。
很多情况下,Wing 编译器可以自动限定提升。例如,在下面的代码中,
很明显 inflight 闭包push
对被提升的队列对象执行了操作:
bring cloud;
let myQueue = new cloud.Queue();
inflight () => {
myQueue.push("hello");
};
但由于 Wing 编译器目前不支持符号执行,因此在某些情况下,
编译器无法限定提升。例如,如果我将myQueue
一个新变量赋值给它(yourQueue
),就会出现以下错误:
bring cloud;
let myQueue = new cloud.Queue();
inflight () => {
let yourQueue = myQueue;
yourQueue.push("hello");
//^^^^^^^^^ Expression of type "Queue" references an unknown preflight object, can't qualify its capabilities.
};
为了克服这个限制,lift()
可以使用新的内置函数来明确限定升力:
bring cloud;
let myQueue = new cloud.Queue();
inflight () => {
lift(myQueue, ["push"]);
let yourQueue = myQueue;
yourQueue.push("hello");
};
新的内置lift
功能允许您为当前飞行中闭合提升飞行前物体。
此语法仍在讨论中,但我们希望确保它不会阻碍用户。
请查看RFC并参与讨论。
默认对象标识符的更改
在 Wing 中创建预检
对象时,每个对象都会获得一个在其定义范围内唯一的标识符。这些标识符 对于在云资源配置时生成确定性的唯一地址
至关重要。
Wing 中对象的默认标识符是类名。以下示例中,
存储桶的标识符很简单"Bucket"
:
new cloud.Bucket();
以前,默认标识符包括类的命名空间,因此在上面的示例中,
标识符是"cloud.Bucket"
,但由于命名空间现在可以使用别名(),这导致了不稳定的默认值,这可能会对基础设施产生可怕的影响。bring cloud as
my_cloud
顺便说一句,Wing 还有专用语法 ( as ID
) 来确定对象的身份,以防
有多个相同类型的实例,或者您想要更明确:
new cloud.Bucket() as "my_bucket";
我们正在讨论可能改变这种
语法,所以请让我们知道您的想法。
隐式加载的平台扩展
平台扩展是 Wing 最强大的功能之一
。它们可以确定云资源在云
环境中的实现方式,验证应用程序是否遵循组织策略,或
“在后台”注入最佳实践和常见模式。
到目前为止,可以通过--platform
传递给 Wing CLI 的显式开关将 Wing 配置为使用平台提供程序,但我们已经看到需要模块或库能够提供
平台扩展,而不必要求显式配置。
为此,当 Wing 编译您的代码时,任何wplatform.js
找到的文件都将自动
作为平台加载。这种情况在显式加载(例如 )之后发生-t tf-aws
,并且也适用于
您的应用程序使用的任何 winglib。
当前探索的用例之一是库能够公开自己的平台
参数。
例如,eventbridge
winglib
公开了一个名为的平台参数,eventBridgeName
允许开发人员连接到现有的
EventBridge 总线:
wing compile -t @winglang/platform-awscdk -v eventBridgeName="my-bus" main.w
下面让我们来看一下这个平台扩展是如何实现的:
module.exports.Platform = class {
parameters = {
type: "object",
properties: {
eventBridgeName: {
type: "string",
},
},
};
};
标准化 cron 表达式
类似这样的 cron 表达式* * * * *
在基于 Unix 的 crontab 中有效,但在 AWS 中无效。另一方面
,* * * * ?
在 AWS 中有效,但在其他地方无效。
现在,Wing 将期望 cron 表达式与标准语法匹配,并
在部署到 AWS 时自动将其转换为 AWS 语法:
bring cloud;
new cloud.Schedule(cron: "* * * * *");
Wingly 更新中的好东西
Wingly Update是我们每两周一次的更新流,我们在其中分享
项目的最新进展,与云行业的人士聊天,讨论并
庆祝云的美丽。
如果您还没有看过我们的节目,您可以 在这里找到我们所有剧集
的完整内容。
以下是我们从最近的展览中精选的一些好东西:
- @MarkMcCulloh的最新CHANGELOG
- 概述我们在Wing for TypeScript方面的进展。
- 与 Allen Helton 聊了聊德克萨斯州、生活、会议、牛仔以及他对无服务器的热爱。
- 与 AWS 的 Michael Antonio进行有趣的聊天,谈论他在微软和亚马逊的旅程、IAC、CDK 和计算怀旧。
野外之翼
这是我们杂志的一个新栏目,我们从世界各地
精彩的网络上精选了有关 Wing 的内容:
- Amichai Mantinband 拍摄的Wing 的精彩概览视频。
- Ayush Thakur写了他使用 Wing 后端构建 NextS 应用程序的经历。
- Asher Sterkin 探索了Wing 中生产级 REST API的实现,并使用 Wing 管理多个 AWS 环境。
社区活动
您可以在Wingnuts
日历中找到我们所有活动的详细信息,
其中包括:
- Winlang 社区会议是我们每两周一次的聚会,社区成员在会上展示很酷的应用程序、演示和其他项目。
- 周一办公时间是我们每两周一次的机会,您可以在这里分享您的反馈、想法和顾虑,或者只是顺便过来打个招呼。
概括
这就是本期的内容!
诚邀您加入Wing Slack!快来和 Wing 的朋友们打个招呼,一起交流吧
!快来访问winglang.io,体验一下 Wing 吧!
如果您还没加入,请关注我们
代码库的最新更新。
期待您下次飞行时能得到热情招待!
- 翼队
鏂囩珷鏉ユ簮锛�https://dev.to/winglang/inflight-magazine-no-9-4fdh