Wing语言中的Preflight与Inflight执行阶段解析
wing The Wing Programming Language 项目地址: https://gitcode.com/gh_mirrors/wi/wing
前言
在云计算应用开发中,基础设施定义和应用程序逻辑通常需要分开处理,这增加了开发复杂性。Wing语言通过创新的Preflight和Inflight执行阶段概念,将这两者统一到同一个编程模型中,极大地简化了云应用开发流程。
Preflight与Inflight核心概念
Preflight阶段
Preflight代码在编译时运行一次,主要用于定义云应用的基础设施配置。这相当于传统IaC(基础设施即代码)工具的功能,但直接集成在编程语言中。
关键特性:
- 默认执行阶段,无需特殊标注
- 运行于编译时而非运行时
- 生成基础设施配置(如Terraform、CloudFormation等)
- 可配置服务、设置事件监听器等
示例代码:
bring cloud;
// 创建一个存储桶
let bucket = new cloud.Bucket(public: true);
// 预填充文件内容
bucket.addObject("file1.txt", "Hello world!");
Inflight阶段
Inflight代码在运行时执行,实现应用程序的业务逻辑。这些代码可以部署到各种云计算平台,如函数服务、容器、虚拟机等。
关键特性:
- 使用
inflight
关键字明确标注 - 运行于应用部署后的运行时
- 可并行执行多次
- 能直接与云资源交互
示例代码:
bring cloud;
let bucket = new cloud.Bucket();
// 定义一个inflight函数
let getFirstObject = inflight (): str => {
return bucket.list().at(0);
};
执行阶段交互规则
阶段隔离原则
-
Preflight不能调用Inflight:因为Inflight代码需要已部署的基础设施
getFirstObject(); // 错误:不能在preflight阶段调用inflight代码
-
Inflight不能调用Preflight:因为Preflight会修改基础设施配置
inflight () => { bucket.addObject("file2.txt", "data"); // 错误:不能在inflight阶段调用preflight方法 };
数据交互方式
虽然代码执行阶段隔离,但数据可以安全传递:
let api = new cloud.Api();
api.get("/test", inflight (req) => {
return { status: 200, body: "success!" };
});
let checker = inflight () => {
let url = api.url; // 可以安全访问preflight数据
// 使用url进行测试...
};
高级用法与最佳实践
类中的阶段管理
Wing允许在类中混合定义preflight和inflight成员:
class DataProcessor {
queue: cloud.Queue;
db: cloud.Table;
new() {
// Preflight初始化
this.queue = new cloud.Queue();
this.db = new cloud.Table();
}
// Inflight方法
inflight process(item: str) {
this.db.insert(item);
}
}
Lift机制详解
当preflight对象在inflight代码中被引用时,编译器会自动进行"lift"操作,并生成最小权限:
let bucket = new cloud.Bucket();
new cloud.Function(inflight () => {
bucket.put("key", "value"); // 自动获得写权限
});
对于复杂情况,可以使用显式lift声明:
lift {bucket: [put, get]} {
// 明确指定需要的操作权限
bucket.put("key", bucket.get("other-key"));
}
自定义Inflight主机需求
通过实现onLift
方法,可以定义inflight主机的特定需求:
class SecureService {
onLift(host: std.IInflightHost, ops: Array<str>) {
if ops.contains("accessVault") {
// 配置主机访问保险箱的权限
host.addPolicy({
// 权限细节...
});
}
}
}
阶段无关代码
以下函数在两个阶段均可使用:
log()
:输出日志assert()
:断言检查throw
:抛出异常
总结对比表
| 特性 | Preflight | Inflight | |---------------------|-------------------------------|-------------------------------| | 执行时机 | 编译时 | 运行时 | | 执行次数 | 一次 | 多次 | | 主要用途 | 基础设施定义 | 业务逻辑实现 | | 资源修改权限 | 完全控制 | 只读访问 | | 典型操作 | 创建资源、配置权限 | 处理请求、读写数据 | | 部署目标 | 基础设施编排工具 | 计算服务(如Lambda、容器等) |
实际应用建议
- 清晰划分阶段:将基础设施定义与业务逻辑明确分离
- 最小权限原则:利用lift机制自动生成精确权限
- 类封装:使用类组织相关preflight和inflight代码
- 阶段无关工具:将通用功能实现为阶段无关函数
- 显式lift声明:复杂场景下明确指定权限需求
通过合理运用Wing的preflight和inflight机制,开发者可以构建出既安全又高效的云原生应用,同时保持代码的整洁和可维护性。
wing The Wing Programming Language 项目地址: https://gitcode.com/gh_mirrors/wi/wing
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考