在上一篇博客中,我们已经成功搭建了 Kratos 的开发环境并跑通了基础脚手架。今天,我们将深入 Kratos 的核心开发流程,看看它是如何通过 Protobuf 驱动,一步步将一个接口定义转化为实际的 HTTP/gRPC 服务的。

📜 第一步:用 Protobuf 定义 API

在 Kratos 的世界观里,API 的定义优先于代码实现。我们需要在 api 目录下创建一个 .proto 文件。比如我们要做一个简单的用户查询服务,可以这样定义:

protobuf

编辑

syntax = "proto3";

package user.v1;

option go_package = "user/api/user/v1;v1";

service UserService {
    rpc GetUser (GetUserRequest) returns (GetUserReply);
}

message GetUserRequest {
    int64 id = 1;
}

message GetUserReply {
    int64 id = 1;
    string name = 2;
}

定义完成后,使用 Kratos 提供的命令生成对应的 Go 代码:

bash

编辑

kratos proto client api/user/v1/user.proto
kratos proto server api/user/v1/user.proto -t internal/service

这两条命令会自动生成底层的 gRPC/HTTP 绑定代码,并在 internal/service 下生成业务接口的骨架文件。

🔗 第二步:理解 Kratos 的经典分层架构

生成的代码完美体现了 Kratos 推荐的三层架构,这也是写好 Kratos 服务的关键:

  • Service 层(接口适配层):位于 internal/service。它负责接收前端的请求(解析 HTTP/gRPC 参数),调用 Biz 层处理业务,最后将结果封装成 Proto 定义的结构返回。你可以把它理解为 MVC 中的 Controller。

  • Biz 层(业务逻辑层):位于 internal/biz。这里承载了最核心的业务规则,它不关心数据是从 MySQL 还是 Redis 来的,只专注于业务逻辑的组合与计算。

  • Data 层(数据访问层):位于 internal/data。这一层负责与数据库、缓存等第三方资源打交道。在 Kratos 中,通常会在 Biz 层定义 Repository 接口,然后在 Data 层去实现这些接口,从而实现业务与数据的完美解耦。

⚡ 第三步:依赖注入与启动

写完了各层的逻辑,如何将它们串联起来呢?Kratos 使用了 Wire 进行依赖注入。你需要在 cmd/server 下的 wire.go 文件中声明好 ProviderSet(即把 Service、Biz、Data 层的构造函数放进去)。
当你修改完代码后,只需在项目根目录执行 make wire,Wire 就会自动生成 wire_gen.go 文件,将所有依赖关系组装完毕。

通过以上三个步骤,你就完成了一个符合微服务最佳实践的 API 开发。Kratos 虽然有一定的学习曲线,但一旦掌握了这套“Proto 定义 -> 代码生成 -> 分层实现 -> 依赖注入”的工作流,开发效率和代码质量都会得到极大的提升。