Dubbo-go-Pixiu 实现 grpc 双向流

1. 引言 本文档旨在探讨在 dubbo-go-pixiu 网关中,基于现有的 Http2ListenerService 实现对原生 gRPC 流式传输(包括客户端流、服务端流和双向流)支持的几种设计方案。核心目标是使 Pixiu 能够接收来自 gRPC 客户端的流式请求,并利用 grpcdynamic 库动态地将这些请求代理到后端的 gRPC 服务。 2. 通用前提与核心组件 在讨论具体方案之前,我们明确以下通用前提和将要使用的核心组件: Listener 配置: Pixiu 网关配置了一个 protocol_type: GRPC 或 protocol_type: HTTP2 的 Listener。这将默认或间接使用 Http2ListenerService (位于 pkg/listener/http2/http2_listener.go) 来处理底层的 HTTP/2 连接。 grpcdynamic 库: 用于在网关内部动态地构建和发送 gRPC 请求到后端服务,以及解析响应,无需预编译的 gRPC Stub。 方法描述符 (desc.MethodDescriptor): 网关需要有能力获取目标后端 gRPC 服务的方法描述符。这可以通过 gRPC 反射机制、在网关加载 .proto 文件或 FileDescriptorSet 文件,或通过其他配置服务来实现。 网络过滤器链 (NetworkFilterChain): 请求在 Http2ListenerService 接收后,会经过此处理链。我们需要在这里集成 gRPC 流处理逻辑。 3. 设计方案嵌入式标准 gRPC 服务器与 grpc.UnknownServiceHandler 3.1. 核心思想 修改 Http2ListenerService,使其内部的 http.Server 的 Handler 直接设置为一个标准的 grpc.Server 实例。这个嵌入的 grpc.Server 利用 grpc.UnknownServiceHandler 选项来捕获所有未在网关显式注册的 gRPC 服务调用,然后在其 Handler 内部使用 grpcdynamic 将这些调用动态代理到后端。 ...

May 27, 2025 · 6 min · 1084 words · Similarityoung

cursor rules

RIPER-5 背景介绍 你是Claude 4.0,集成在 Copilot 中,Copilot 是基于AI的VS Code插件。由于你的高级功能,你往往过于急切,经常在没有明确请求的情况下实施更改,通过假设你比用户更了解情况而破坏现有逻辑。这会导致对代码的不可接受的灾难性影响。在处理代码库时——无论是Web应用程序、数据管道、嵌入式系统还是任何其他软件项目——未经授权的修改可能会引入微妙的错误并破坏关键功能。为防止这种情况,你必须遵循这个严格的协议。 语言设置:除非用户另有指示,所有常规交互响应都应该使用中文。然而,模式声明(例如[MODE: RESEARCH])和特定格式化输出(例如代码块、清单等)应保持英文,以确保格式一致性。 元指令:模式声明要求 你必须在每个响应的开头用方括号声明你当前的模式。没有例外。 格式:[MODE: MODE_NAME] 未能声明你的模式是对协议的严重违反。 初始默认模式:除非另有指示,你应该在每次新对话开始时处于RESEARCH模式。 核心思维原则 在所有模式中,这些基本思维原则指导你的操作: 系统思维:从整体架构到具体实现进行分析 辩证思维:评估多种解决方案及其利弊 创新思维:打破常规模式,寻求创造性解决方案 批判性思维:从多个角度验证和优化解决方案 在所有回应中平衡这些方面: 分析与直觉 细节检查与全局视角 理论理解与实际应用 深度思考与前进动力 复杂性与清晰度 增强型RIPER-5模式与代理执行协议 模式1:研究 [MODE: RESEARCH] 目的:信息收集和深入理解 核心思维应用: 系统地分解技术组件 清晰地映射已知/未知元素 考虑更广泛的架构影响 识别关键技术约束和要求 允许: 阅读文件 提出澄清问题 理解代码结构 分析系统架构 识别技术债务或约束 创建任务文件(参见下面的任务文件模板) 创建功能分支 禁止: 建议 实施 规划 任何行动或解决方案的暗示 研究协议步骤: 创建功能分支(如需要): 1 git checkout -b task/[TASK_IDENTIFIER]_[TASK_DATE_AND_NUMBER] 创建任务文件(如需要): 1 mkdir -p .tasks && touch ".tasks/${TASK_FILE_NAME}_[TASK_IDENTIFIER].md" 分析与任务相关的代码: ...

April 19, 2025 · 3 min · 519 words · Similarityoung

Dubbo ai 方向路线

Pixiu AI 演进 AI 应用架构新范式 AI 应用架构图 调用链路说明 用户向AI应用发起请求,请求流量进入流量网关(云原生API网关)。 云原生API网关侧维护管理了不同类型的AI Agent的API或路由规则,将用户请求转发至对应的AI Agent。(可以考虑接入 A2A 协议) AI Agent无论以哪种方式实现,只要其中的节点需要获取数据,便向MCP网关(云原生API网关)请求获取可用的MCP Server及MCP Tool的信息。 因为MCP网关处可能维护了很多MCP信息,可以借助LLM缩小MCP范围,减少Token消耗,所以向AI网关(云原生API网关)发请求和LLM交互。(这一步可选) MCP网关将确定好范围的MCPServer及MCP Tool的信息List返回给AIAgent。 AI Agent将用户的请求信息及从MCP网关拿到的所有MCP信息通过AI网关发送给LLM。 经过LLM推理后,返回解决问题的唯一MCP Server和MCP Tool信息。 AI Agent拿到确定的MCP Server和MCP Tool信息后通过MCP网关对该MCP Tool做请求。 实际生产中 ③-⑧ 步会多次循环交互 云原生 API 网关 [!注释] 南北走向流量为 client-server 的流量 东西走向流量为 server-sever 流量 Web Application Firewall,Web应用防火墙,简称WAF 传统的流量网关和 API 网关集成的微服务网关(SpringCloud Gateway)注重于同 k8s 中的 Pod 进行交互,有东西走向流量和南北走向流量。 而新一代网关 增加了AI 流程的同时,有如下特点 流量网关、API网关,微服务网关、AI网关、MCP网关多合一 统一东西南北向流量 集成 WAF ,内容安全数据面 集成 AI 领域 LLM,MCP 差异化竞争力:服务治理、API管理、LLM管理、MCP管理 + 基本竞争力:高性能、高可用、零信任、易扩展 ...

April 4, 2025 · 2 min · 287 words · Similarityoung

issue:dubbo-go-hessian2 的使用问题

issue 关联 Environment Server: Java-server, dubbo version v3.0.14 Client: Dubbo-go, v3.1.1 Protocol: Dubbo Registry: Nacos, v2.1.2 Problem dubbo-go 的 client 端无法调用 dubbo 的 server 端的代码。 问题分析 在调试并复现代码问题后,我发现问题出在 QueryDataSource 方法中: 1 QueryDataSource func(ctx context.Context, id int) (*DataSource, error) dubbo:"queryDataSource" 根本原因是类型不匹配:在 Go 中,int 和 int64 通常都是 8 字节,而在 Java 中,int 类型只有 4 字节。 这种差异导致 Java 无法正确识别要调用的方法。 解决方案: 将 Go 方法中的 int 参数更改为 int32。 1 QueryDataSource func(ctx context.Context, id int32) (*DataSource, error) dubbo:"queryDataSource" 这个修改应该能解决类型兼容性问题。 Go 中的枚举表示 我注意到您定义的 Java 枚举类型在 Go 中表示为字符串: 1 Type string hessian:"type" // Mapped from Java enum 为了解决这个问题并确保在 Go 中正确处理枚举,我建议使用 dubbo-go-hessian2 仓库中提供的枚举生成工具。 ...

April 3, 2025 · 5 min · 860 words · Similarityoung

tcc-fence 模式下日志的自动清除

issue 关联 先查出可以清理的数据 按索引删除数据 给delete加上limit 查询代码后发现,在 tcc-fence 模式下并不存在自动删除日志的功能,于是准备实现该功能。 pull request 1. 配置文件 在 config 模块中新增了 Config 结构体,用于配置 TCC Fence 日志清理功能的相关参数。 1 2 3 4 5 6 type Config struct { Enable bool `yaml:"enable" json:"enable" koanf:"enable"` Url string `yaml:"url" json:"url" koanf:"url"` LogTableName string `yaml:"log-table-name" json:"log-table-name" koanf:"log-table-name"` CleanPeriod time.Duration `yaml:"clean-period" json:"clean-period" koanf:"clean-period"` } Enable: 是否启用日志清理功能。 Url: 数据库连接字符串。 LogTableName: TCC 日志表的名称。 CleanPeriod: 清理任务的执行周期。 2. 初始化函数 在客户端的 InitTCC 函数中添加了对 fence 的初始化逻辑。 ...

February 21, 2025 · 3 min · 431 words · Similarityoung