XiHan Framework 处于预览阶段

查看获取方式
跳转到内容

规范与多语言 ​

XiHan Framework 的本体不是 .NET 代码,而是一份语言中立的规范:XiHan Spec。.NET 实现是它的参考实现,Go SDK 是第二个实现,其他语言按同一份规范实现并通过同一套一致性测试。这一页讲规范怎样组织、哪些内容是规范性的、一致性测试怎样工作,以及各语言 SDK 的现状。要写插件或另一种语言的 SDK 的读者需要读它;只用 .NET 的读者了解即可。

为什么要有规范 ​

「同一个名字各语言都能用」这件事,只有两条路:要么每种语言各写一个风格相似的框架,然后在文档里宣称它们是一家;要么先写下语言中立的语义,再让每种实现去通过同一套测试。前者做出来的东西经不起细看,后者才是 OpenTelemetry、MCP、CloudEvents 走通的路。我选了后者。

规范还解决一个 .NET 内部的问题:公开契约先写进规范,再写架构决策记录,再写代码与一致性向量。没有 RFC 的公开 API 变更不合并。这条流程让「随手加一个公开方法」变得不可能,也让每个设计决定都有据可查。

规范仓库 ​

规范在独立仓库 XiHanFun/framework-spec,.NET 实现以子模块引用它到 framework/spec,Go SDK 引用到 spec。目录结构:

text
spec/
├─ rfcs/           提案:先 RFC,再 ADR,再实现
├─ conventions/    规范性:术语表、包 ID、能力 ID、操作 ID、错误码、Baggage 键、批量优先
├─ manifest/       规范性:xihan.manifest.json 的 JSON Schema
├─ plugin/         规范性:插件协议 plugin.proto 与握手、生命周期、调用;Wasm 载体
├─ protocol/       规范性:HTTP、gRPC、MCP、CloudEvents、命令行的映射
├─ packaging/      规范性:应用清单 xihan.app.json 与 xihan pack 的产物映射
├─ provider/       规范性:远程 Provider 的通用规则与各能力的操作集
├─ migration/      规范性:xihan migrate 的通用约定
└─ conformance/    一致性向量与黑盒运行器

规范性与信息性 ​

不是所有东西都要各语言一致。规范把内容分成两类:

规范性(各语言必须一致)信息性(各语言自选)
原语语义与线上编码(Result、Error、Maybe 的 JSON 形态)内部 API 形态
清单 Schema包管理与目录布局
上下文传播键与载体日志实现
管道阶段名与排序规则具体中间件
插件协议隔离机制
协议映射(路由推导、错误信封)服务器实现
术语表、错误码、能力 ID、操作 ID、包 ID 命名代码风格
批量优先:集合入参、原生批量、部分失败语义批次大小

举例说,orders.create 在任何语言的实现里都推导为 POST /orders,失败时都返回 RFC 9457 的 Problem Details,错误码都是 <领域大写>_<KIND>_<三位序号>;但 Go 用 context.Context 传递取消、.NET 用 CancellationToken,这是各语言自己的事。

一致性测试 ​

一致性有两层:

层形式谁用
数据驱动向量conformance/vectors/ 下的 JSON 文件:Result 与 Error 编码、清单校验、版本解析、管道排序、上下文传播、包 ID 与能力 ID 文法各语言 SDK 的单元测试直接读取
黑盒运行器xihan-conformance plugin --dir <插件目录>:以宿主身份启动任意语言写的进程外插件,核对握手行与版本协商、清单一致性、生命周期、未知操作的拒绝、声明的操作都返回状态、订阅投递确认、stdin 关闭即退出插件作者、远程 Provider 作者

.NET 侧另有每个子系统的 <领域>.Conformance 包,是 xUnit 套件:默认实现与 Provider 都要通过,远程 Provider 跑同一套。用法见一致性套件与门禁。

SDK 按成熟度分级:Reference(.NET)、Stable(通过全部向量)、Experimental(部分向量)、Community(社区维护)。

各语言 SDK ​

语言包名仓库状态
.NETXiHan.Framework.*XiHan.Framework参考实现
Gogithub.com/xihanfun/framework-sdk-goframework-sdk-go通过全部向量;用于进程外插件与远程 Provider
TypeScriptnpm 组织 @xihan-framework/*framework-sdk-typescript占位,Go 之后的下一个
Rustcrate xihan-frameworkframework-sdk-rust占位,面向进程外与 Wasm 插件
Javacom.xihanfun:xihan-frameworkframework-sdk-java占位
Pythonxihan-frameworkframework-sdk-python占位
PHPxihanfun/xihan-frameworkframework-sdk-php占位

各语言的领域词与术语表一致,只换大小写风格。

为什么 Go 先行:它离 C# 最远,能证明规范不是 .NET 形状的;同时它适合承载进程外插件、黑盒运行器和将来的 Kubernetes Operator。Go SDK 已经做到的事:用 Go 写的插件在 .NET 宿主里服务一个操作,崩溃时宿主降级而不退出;用 Go 实现的分布式缓存经远程 Provider 适配器通过 .NET 的缓存一致性套件。示例见 framework/samples/EchoGoPlugin 与 CacheGoPlugin,写法见进程外插件。

变更流程 ​

公开契约的变更按固定顺序走:

  1. 在 rfcs/ 新建提案,状态为草案。
  2. 评审通过后写架构决策记录,RFC 状态改为已采纳,正文并入对应的规范性目录。
  3. 实现与一致性向量随 RFC 一起合并。

新增术语表条目同样走 RFC。错误码、能力 ID、Baggage 键、操作 ID 一经发布不改。

已采纳的 RFC ​

RFC主题参考实现
0001原语层Primitives
0002清单Kernel
0003调用上下文与传播各协议适配器
0004管道阶段与排序Kernel
0005领域协议与持久化Domain、Persistence.*
0006缓存、分布式锁与幂等Caching.*
0007多租户MultiTenancy.*
0008认证与授权Security.*
0009消息、CloudEvents 信封与发件箱Messaging.*
0010本地化Localization.*
0011操作契约与 XGIKernel、Protocols.*
0012对象存储ObjectStorage.*
0013调度Scheduling.*
0014远程配置与密钥Configuration.*
0015审计Auditing.*
0016应用清单与打包Cli
0017进程外插件协议Plugins.Protocol、Plugins.OutOfProcess
0018Wasm 插件Plugins.Wasm
0019远程 ProviderCaching.Remote
0020版本迁移Cli
0021工作流Workflow.*
0022AIAI.*
0023可观测性与运行信息Observability.*

正文见规范仓库的 rfcs/ 目录。

下一步 ​

Released under The MIT License