青训营X豆包MarsCode IDL我的粗浅理解 | 豆包MarsCode AI 刷题

71 阅读2分钟

作用

在RPC(Remote Procedure Call,远程过程调用)中,IDL(Interface Definition Language,接口定义语言)扮演着至关重要的角色,其主要作用如下:

1. 定义服务接口

IDL 用于定义服务的接口规范,包括:

  • 服务方法的名称。
  • 每个方法的输入参数类型及其名称。
  • 方法的返回值类型。
  • 异常或错误的约定(可选)。

通过 IDL,服务的提供者和消费者可以共享相同的接口描述,从而确保两者之间通信的正确性和一致性。

生成代码

生成代码的指令

本来还是有Kitex框架 和Hertz框架为头的生成kitex server ....但是之后推出的cwgo覆盖了这个两个,通过type来控制生成哪个的生成代码(应该是这样吧)

--type RPC就是Kitex框架,--type HTTP就是Hertz框架

cwgo server -I "../../idl" --type RPC --module "github.com/Violet2314/tiktok_e-commence/demo/demo_proto" --idl "../../idl/echo.proto" --service demo_proto  

生成代码的结构

kitex_gen 目录

这是由 cwgo 根据 IDL 文件生成的代码,通常包含:

  • 客户端和服务端的存根代码(放在 <服务名称>service 中)
    • 客户端存根: 用于客户端调用 RPC 接口。client.go
    • 服务端存根: 服务端用于处理请求并调用实际业务逻辑。server.go
    • 服务的方法定义和调用逻辑 authservice.go
    • 注册或初始化客户端/服务端组件 invoker.go
  • IDL 定义的类型映射: 如结构体、枚举类型等,用于序列化和反序列化。echo.pb.go就是这样的一个映射结构体,里面的结构体对应的就是一个message
  • 同时Kitex 生成 echo.pb.fast.go 文件,是依赖于echo.pb.go,提供更高效的序列化和反序列化实现(“fast” 意味着性能优化)。主要依赖 fastpb 库,专为高性能场景设计

conf 目录

通常存放服务的配置文件,包括:

  • 数据库连接信息。
  • 日志配置。
  • 服务注册中心的地址(如 Nacos、Etcd)。
  • 自定义配置(如超时时间、限流参数)。

biz 目录

存放核心的业务逻辑代码,比如:

  • 数据库的访问层(DAO层)。
  • 服务的业务实现层(Service层)。
  • 工具类或中间层代码。
  • 初始化代码

handler.go

  • 作用: 用于实现具体的业务逻辑。
  • Kitex 服务启动时会调用这个文件中定义的处理函数,将 RPC 请求转发到业务逻辑处理函数中

结构特点

RPC是只有三层架构的,handler,service,dao层,是没有controller层的,所以他和传统的web框架不一样

  • Controller:在传统 Web 框架中,controller 负责路由和请求分发,决定请求的处理方法,并且处理 HTTP 请求和响应的协议层面内容。
  • Handler:在 Kitex 这类 RPC 框架中,handler 层实现了服务端暴露的接口方法,接收从客户端发送的 RPC 请求并调用对应的业务逻辑(service 层),然后返回结果