新闻详情

新闻详情

首页 / 资讯中心 / 详情

Dapr Cangjie SDK宏实现原理:Actor宏如何在编译期生成注册代码

发布时间:2026/11/5 14:09:04来源:尧图网络
Dapr Cangjie SDK宏实现原理:Actor宏如何在编译期生成注册代码
Dapr Cangjie SDK宏实现原理Actor宏如何在编译期生成注册代码【免费下载链接】dapr-cangjie-sdkDapr Cangjie SDK是Dapr SDK的仓颉实现实现了一个支持使用 HTTP 协议访问 Dapr 边车的客户端。项目地址: https://gitcode.com/Cangjie-SIG/dapr-cangjie-sdkDapr Cangjie SDK 是 Dapr SDK 的仓颉语言实现支持通过 HTTP 协议访问 Dapr 边车。在使用它的 Actor 模型开发有状态服务时边车按方法名字符串发起 HTTP 请求——这个请求最终如何精准找到你代码里的方法答案藏在编译期生成的注册代码里。本文拆解 Dapr Cangjie SDK 的 Actor 宏实现讲清楚它如何在编译期自动完成方法名 → 函数的注册。一、为什么需要编译期生成注册代码 Dapr 的 Actor 模型中边车通过类似PUT /actors/:actorType/:actorId/method/:methodName的 HTTP 路由调用应用其中methodName只是一个字符串。应用端必须维护一张方法名 → 函数的映射表否则请求到了也无处可去。如果让开发者手动维护这张表容易出现两类典型问题注册时方法名写错字符串与方法名对不上新增方法后忘记注册运行时才报错。Dapr Cangjie SDK 的做法是用宏在编译期扫描你标注了ActorMethod、ActorReminder、ActorTimerCallback的方法自动生成注册函数。使用方式如下Actor public class TodoActor extends AbstractActor { ActorMethod protected func addItem(item: String): Unit { ... } ActorReminder protected func cleanup(): Unit { ... } }编译器展开后你的类里会被自动补上一个注册函数public func onRegisterMethodsInternal() { registerMethodInternal(addItem, addItem) registerReminderInternal(cleanup, cleanup) }运行时 Actor 激活时调用它映射表就建好了——全程零手工、零字符串拼写错误。二、Actor 宏家族macros 目录速览 整套宏实现集中在 src/actor/macros/ 目录文件分工非常清晰文件角色actor.cj父宏Actor作用于类负责生成注册函数actor_method.cj子宏ActorMethod标记 Actor 方法actor_reminder.cj子宏ActorReminder标记提醒器回调actor_timer_callback.cj子宏ActorTimerCallback标记定时器回调constants.cj父子宏之间传递信息的键名常量宏能力来自编译器 AST 工具包见 macros/import.cj 中对std.ast的引用。三、子宏 ActorMethod只发消息不改代码先看最简单的子宏 actor_method.cjpublic macro ActorMethod(input: Tokens): Tokens { assertParentContext(Actor) let funcDecl FuncDecl(input) setItem(ActorMethodNameKey, funcDecl.identifier.value) setItem(ActorMethodFuncKey, funcDecl.identifier.value) input }只有 5 行有效逻辑却体现了宏设计的两个关键点assertParentContext(Actor)强制要求该宏只能出现在被Actor标注的类内部位置用错直接编译报错setItem(...)把方法名 函数标识符以键值对形式写给父宏最后一行原样返回input——子宏不修改任何代码它只负责上报信息。键名统一定义在 constants.cj 之外的正确位置 constants.cj例如actor-method-name、actor-method-func相当于父子宏之间的通信协议。另外三个子宏都提供了带参数的重载如ActorMethod(add)此时用自定义名称add注册函数名保持不变——这正是 Dapr 边车调用时 URL 里出现的那个方法名。四、父宏 Actor三步拼出注册函数真正动手的是父宏 actor.cj流程可归纳为三步第一步收集子宏消息。通过getChildMessages(ActorMethod)等三次调用分别取出类内所有方法、定时器回调、提醒器回调上报的信息核心代码见 actor.cj#L8-L14let methods getChildMessages(ActorMethod) | map { msg let method msg.getString(ActorMethodNameKey) let function Token(TokenKind.IDENTIFIER, msg.getString(ActorMethodFuncKey)) return quote(registerMethodInternal($(method), $(function))) }quote$()插值是仓颉宏的标准写法把名称 函数渲染成一段注册语句的 token。第二步拼接函数体。三类注册语句经fold依次连接生成完整的onRegisterMethodsInternal函数体actor.cj#L30-L39。第三步写回类声明。最后一行把新函数追加进类体并返回新的 tokenactor.cj#L41-L42classDecl.body.decls.add(FuncDecl(registerFunc)) return classDecl.toTokens()至此编译期展开完成用户源码里的注解变成了实实在在的注册代码。五、注册代码如何与运行时衔接编译期生成只是上半程看下半程才能理解为什么是现在注册激活时注册AbstractActor 声明了抽象方法onRegisterMethodsInternalabstract_actor.cj#L138Actor 激活时由onActivateInternal首先调用它abstract_actor.cj#L55-L59把方法、定时器、提醒器写入三张HashMapabstract_actor.cj#L8-L10。序列化自动处理基类为registerMethodInternal准备了多组泛型重载abstract_actor.cj#L75-L105根据方法签名自动完成参数的反序列化与返回值的序列化开发者无感知。按名路由ActorManager 收到调用后用方法名查表执行ActorRuntime.invokeMethodRaw 负责激活 Actor → 调用方法的完整链路。HTTP 入口Tea 层 tea_actor.cj 把边车的各类请求映射到对应路由例如PUT /actors/:actorType/:actorId/method/:methodName直接进入上述调用链。整体数据流可以概括为Dapr 边车 HTTP 请求 → TeaActor 路由 → ActorRuntime → ActorManager → AbstractActor 按名查表 → 你的业务方法六、小结读懂这套宏的 4 个要点✅子宏只上报、父宏才生成ActorMethod等通过setItem发消息Actor宏统一汇总生成代码职责分明✅通信协议集中管理键名定义在 constants.cj避免宏之间出现隐式字符串约定✅assertParentContext防误用宏用错位置会在编译期立即暴露而不是留到运行时✅注册时机 Actor 激活宏生成的onRegisterMethodsInternal在激活时执行天然与 Actor 生命周期对齐。附关键源码文件索引路径说明src/actor/macros/actor.cj父宏Actor生成注册函数src/actor/macros/actor_method.cj子宏ActorMethodsrc/actor/macros/actor_reminder.cj子宏ActorRemindersrc/actor/macros/actor_timer_callback.cj子宏ActorTimerCallbacksrc/actor/abstract_actor.cjActor 基类与注册/调用逻辑src/actor/actor_manager.cjActor 生命周期与按名调用src/actor/actor_runtime.cjActor 运行时类型级路由src/tea/actor/tea_actor.cjDapr HTTP 路由映射cjpm.toml包配置依赖版本等下一篇可以顺着 src/tea/ 目录看看 Dapr Cangjie SDK 的订阅Subscription宏又是如何把主题编译成路由的。【免费下载链接】dapr-cangjie-sdkDapr Cangjie SDK是Dapr SDK的仓颉实现实现了一个支持使用 HTTP 协议访问 Dapr 边车的客户端。项目地址: https://gitcode.com/Cangjie-SIG/dapr-cangjie-sdk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/4 15:56:54

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/4 22:55:41

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/4 17:01:23

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/4 12:33:12

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/5 4:24:57

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/5 4:24:57

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉