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),仅供参考
企业数字化 ERP 产品动态
相关推荐
Qt Extension 1.16.0发布:MCP工具接入,AI Assistant退役 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:28:40
医疗行业专属Dynamics CRM解决方案:实体建模、合规安全与生态集成 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:28:34
Django实现xAdmin后台根据身份设置字段只读 在Django开发的后台管理中,常常需要根据用户的身份来设置不同的权限,例如控制某些字段是否可编辑。通常情况下,xadmin允许开发者全局设置字段为只读,但更灵活的需求(如仅超级用户可编辑)则需要通过自定义来实现。
本文将通过多个步骤,介绍如何在xadmin中根据用户身份设… · 2026/9/24 16:05:01
Python个人博客项目-7.后台控制管理应用开发 在项目开发过程中,应用的创建与配置是确保整体框架结构稳定性和功能性的关键步骤。通过对应用模块的精心配置,可以实现更加灵活的扩展和高效的管理。本文以Django框架为基础,详细展示了如何通过xAdmin构建一个模块化且功能丰富的管理系统,从而实现数据的可视化管理和用户交… · 2026/9/24 16:04:54
Python个人博客项目-6.博客评论应用开发 此文带领读者深入了解新闻网站中的评论系统开发,涵盖从应用创建、配置到前端渲染等多个关键步骤。借助Django框架的多层嵌套特性以及MPTT模型,本系统为用户提供了良好的交互体验,同时确保了后台的高效管理。首先,通过简洁的项目初始化和模块化的应用配置,为开发奠定了稳固… · 2026/9/24 16:04:48
Python个人博客项目-5.统计数据应用开发 本项目围绕网站访问统计系统的设计与实现展开,旨在通过精细化的访问数据管理,为网站流量分析和用户行为研究提供支撑。项目从应用创建、数据库模型设计到数据管理及视图控制等方面,构建了多层次的访问追踪和分析结构。以Django框架为基础,系统集成了总体访问量统计、每日访… · 2026/9/24 16:04:42
Akka Streams Unzip 算子深度解析:将二元组流拆分到两个下游流 后端并发编程异步编程 【免费下载链接】akka-core A platform to build and run apps that are elastic, agile, and resilient. SDK, libraries, and hosted environments. 项目地址: https://gitcode.com/gh_mirrors/ak/akka-core 点击查看 免费下载 导读
Unzip… · 2026/9/24 16:04:36
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44