Kitex 框架入门系列(1)

本文是Kitex框架入门系列的第一篇,介绍了如何准备Golang环境,使用Kitex和thriftgo命令行工具生成代码,创建并启动RPC服务。通过创建IDL文件定义服务接口,实现简单的server和client,展示了Kitex的易用性和高性能特性。

KiteX 是字节跳动框架组研发的下一代高性能、强可扩展性的 Go RPC 框架。目前已经在 Github 开源。作为字节跳动内部原有的 RPC 框架 Kite 的升级版,虽然开源时间不是很长,但其实从性能和扩展性上来说都已经在字节上万微服务的场景下做了充分的验证。

近期花了一些时间简单看了看源码,被整体的框架设计和扩展性深深吸引。希望能够单独开一个系列,带大家一起熟悉Kitex的使用,通过源码了解其提供的能力,学习整体的设计。

官方文档:www.cloudwego.io/zh/docs/kit…

Github 仓库:github.com/cloudwego/k…

官方 example:github.com/cloudwego/k…

作为入门系列第一篇,今天我们先来看看如何上手。基于 kitex 0.2.1 版本。

准备工作

  • 先准备好本地的 Golang 环境,设置好 GOPATH,建议使用较新的 Go 版本。
  • 安装 kitex 和 thriftgo 两个命令行工具
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
go install github.com/cloudwego/thriftgo@latest
复制代码

这一步完成后,可以打开命令行运行 kitex --versionthriftgo --version 进行验证。

Server

创建本地仓库

我在Github上创建了公开的仓库,和这个系列文章同步更新:github.com/ag9920/kstu… ,克隆到本地后开始我们今天的开发。

创建IDL文件

Kitex 典型的使用场景就是基于 thrift 定义的 IDL 来定义服务接口,实现客户端和服务端的通信。

这里我们新建一个demo的服务定义: kstudy.thrift

namespace go api

struct Request {
    1: string message1
    2: string message2
}

struct Response {
    1: string message
}

service KStudy {
    Response Concat(1: Request req)
}
复制代码

可以看到,我们定义了一个KStudy服务,包含一个Concat接口,语义是将 Request 中的 message1 和 message2 两个字符串拼接起来,通过 Response 返回。

使用命令行工具生成代码

kitex 工具提供了很多选项扩展,可以通过 --help 来了解。

kitex --help

Version v0.2.0
Usage: kitex [flags] IDL

flags:
  -I value
        Add an IDL search path for includes.
  -combine-service
        Combine services in root thrift file.
  -copy-idl
        Copy each IDL file to the output path.
  -invoker
        Generate invoker side codes when service name is specified.
  -module string
        Specify the Go module name to generate go.mod.
  -no-fast-api
        Generate codes without injecting fast method.
  -protobuf value
        Specify arguments for the protobuf compiler.
  -service string
        Specify the service name to generate server side codes.
  -thrift value
        Specify arguments for the thrift compiler.
  -thrift-plugin value
        Specify thrift plugin arguments for the thrift compiler.
  -type string
        Specify the type of IDL: 'thrift' or 'protobuf'. (default "thrift")
  -use string
        Specify the kitex_gen package to import when generate server side codes.
  -v
  -verbose
        Turn o
Kitex 是一个高性能的 RPC 框架,专为微服务架构设计,支持多种协议和序列化方式。它由字节跳动开源,并广泛应用于云原生环境中。以下是 Kitex 的使用指南和入门教程,涵盖代码生成、服务定义、客户端和服务端的实现等核心内容。 ### 代码生成与项目结构 Kitex 提供了基于 IDL(接口定义语言)的代码生成机制。通常使用 `.proto` 文件来定义服务接口和数据结构。以 `hello.proto` 为例,执行以下命令可以生成相应的 Go 代码: ```bash cd kitex-protobuf kitex -module github.com/cloudwego/kitex-examples hello.proto ``` 该命令会生成一个 `kitex_gen` 目录,其中包含根据 IDL 文件自动生成的代码。例如,`hello` 目录对应 IDL 中定义的命名空间(ns),并在其中生成服务接口、请求/响应结构体等[^1]。 ### 服务端开发Kitex 中,服务端需要实现由 IDL 定义的接口。假设 IDL 中定义了一个 `Concat` 方法,服务端需要提供具体的实现。以下是服务端代码的示例: ```go package main import ( "context" "github.com/cloudwego/kitex-examples/kitex_gen/api" ) type HelloServiceImpl struct{} func (h *HelloServiceImpl) Concat(ctx context.Context, req *api.Request) (*api.Response, error) { return &api.Response{ Result: req.GetFirst() + req.GetSecond(), }, nil } ``` 服务端还需要启动一个 Kitex 服务器,并注册该服务: ```go package main import ( "github.com/cloudwego/kitex-examples/kitex_gen/api/hello" "github.com/cloudwego/kitex/pkg/rpcinfo" "github.com/cloudwego/kitex/server" "net" ) func main() { // 创建服务实例 svc := hello.NewServer(new(HelloServiceImpl)) // 配置监听地址 addr, _ := net.ResolveTCPAddr("tcp", ":8888") // 启动服务 err := svc.Run(rpcinfo.NewEndpointInfo(addr, "hello-service", nil)) if err != nil { panic(err) } } ``` ### 客户端开发 Kitex 的客户端通过生成的代码来调用远程服务。调用前需要创建客户端实例,并传入目标服务的名称及调用选项。以下是一个客户端调用示例: ```go package main import ( "context" "github.com/cloudwego/kitex-examples/kitex_gen/api" "github.com/cloudwego/kitex-examples/kitex_gen/api/hello" ) func main() { // 创建客户端 client, err := hello.NewClient("hello-service") if err != nil { panic(err) } // 构造请求 req := &api.Request{ First: "Hello, ", Second: "World!", } // 调用服务 resp, err := client.Concat(context.Background(), req) if err != nil { panic(err) } // 输出结果 println(resp.Result) } ``` ### 依赖管理与版本升级 Kitex 使用 `go mod` 进行依赖管理,因此升级 Kitex 框架非常简单。只需执行以下命令即可升级到最新版本: ```bash go get github.com/cloudwego/kitex@latest go mod tidy ``` 这将自动更新依赖并清理不必要的模块,确保项目的依赖关系始终保持最新状态[^2]。 ### 自动化脚本与开发环境搭建 为了简化开发环境的搭建,Kitex 提供了一个 `bootstrap.sh` 脚本,用于自动化下载依赖、拉取二进制文件和启动 Docker 镜像等操作。运行该脚本后,开发者可以快速获得一个完整的 Kitex 开发环境: ```bash ./bootstrap.sh ``` 该脚本可以帮助开发者节省大量手动配置的时间,特别是在多团队协作或 CI/CD 环境中非常有用[^5]。 ### 服务接口与客户端实现 Kitex 生成的客户端是一个接口类型,与 IDL 中定义的接口完全匹配。例如,以下是一个典型的客户端接口定义: ```go type Client interface { Concat(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) } ``` 客户端的创建方式如下: ```go func NewClient(destService string, opts ...client.Option) (Client, error) { var options []client.Option options = append(options, client.WithDestService(destService)) options = append(options, opts...) kc, err := client.NewClient(serviceInfo(), options...) if err != nil { return nil, err } return &kKStudyClient{ kClient: newServiceClient(kc), }, nil } ``` 上述代码展示了如何通过 `client.NewClient` 创建底层的客户端实例,并将其封装为具体的接口实现[^3]。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值