kitex入门实践 | 青训营

232 阅读5分钟

前言

Kitex 是字节开源的 Go 语言微服务 RPC 框架,具有高性能强可扩展等特点。

高性能:使用自研的高性能网络库 Netpoll,性能相较 go net 具有显著优势。

强可扩展:支持服务注册/发现、负载均衡、熔断、限流、重试、监控、链路跟踪、日志、诊断等服务治理模块,大部分均已提供默认扩展,使用者可选择集成。

学习框架最高效的办法就是阅读官方文档,我们可以访问 Kitex 的官方文档 ,学习其快速入门的案例,迅速地上手 Kitex 框架。在本文中,我将首先介绍 RPCIDL 的相关基础概念,利用官方文档的案例,并且结合自身实践说明利用 Kitex 搭建微服务的基本步骤。

RPC 基础 和 IDL 语言

RPCRemote Procedure Call)是一种用于实现分布式系统之间通信的协议和编程模型。它允许一个应用程序通过网络调用远程服务器上的过程或方法,就像调用本地方法一样。RPC 服务提供了一种方便的方式来进行跨网络的服务调用,并隐藏了底层的网络通信细节。

IDLInterface Definition Language): IDL 是一种语言中立的接口定义语言,用于描述接口规范。它提供了一种跨语言的标准规范,使得不同语言的应用程序可以相互调用。IDL 的主要作用是定义 RPC 服务的接口,包括接口名称、方法、参数和返回值等。

两者的重要关系:IDL 提供了一种中立的、与具体编程语言无关的接口描述方式,我们可以利用代码生成工具对 IDL 文件进行编译,可以自动生成对应语言(如Java、C++、Go等)RPC 服务的客户端和服务器端代码,确保了不同系统之间的接口一致性,降低了集成和开发的复杂性,同时使得不同编程语言的应用程序可以相互调用。

官方文档说明:为什么要使用 IDL

如果我们要进行 RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的,就好比两个人之间交流,需要保证在说的是同一个语言、同一件事。 这时候,就需要通过 IDL 来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。

快速入门

Kitex 框架及命令行工具,默认支持 thrift 和 proto3 两种 IDL,对应的 Kitex 支持 thrift 和 protobuf 两种序列化协议。

在此次快速入门的案例中,我选择采用 proto3 为例,并且利用 hertz 提供的命令行工具(使用命令 go install github.com/cloudwego/kitex/tool/cmd/kitex@latest 进行安装)。

下面就给出利用 hertz 框架创建基本微服务的过程。

1. 创建项目目录

在编写所有代码之前,首先创建项目目录为 hertz_start,具体命令为 mkdir kitex_start,然后进入该项目目录,对应命令为 cd kitex_start

2. 编写 IDL 文件

我们在项目目录中首先创建一个名为 echo.proto 的 proto IDL 文件,填写下面的代码内容。

syntax = "proto3";

package echo;

option go_package = "echo";

// Echo 请求消息
message EchoRequest {
  string message = 1;
}

// Echo 响应消息
message EchoResponse {
  string message = 1;
}

// 定义 Echo 服务接口
service EchoService {
  // Echo 方法,接收 EchoRequest 消息,并返回 EchoResponse 消息
  rpc Echo(EchoRequest) returns (EchoResponse);
}

在上面的 echo.proto 文件中,我首先指定 ProtoBuf 语法版本为 proto3 (ProtoBuf v3Google 发布的一种更简洁、更易用的版本,与之前的版本(proto2)有一些语法和特性上的差异)。其次在设置相关包名后,我定义了一个名为 EchoRequest 的消息,用于规定请求参数的类型,同时也定义了名为 EchoResponse 的消息,用于规定返回参数的类型。最后则是定义 EchoService 服务,规定服务可调用的函数 Echo

3. 生成 Kitex 代码

我们可以利用 kitex 提供的命令行工具根据前面编写的 echo.proto 文件生成对应的 kitexRPC 框架代码,具体命令为 kitex -module kitex_start -service echo_service echo.proto。然后再使用 go mod tidy 下载整理相关依赖,就可以搭建起项目的基本框架。

image.png

4. 编写业务逻辑代码

我们需要编写的服务端逻辑都在 handler.go 这个文件中,修改 Echo 函数为下述代码:

// Echo implements the EchoServiceImpl interface.
func (s *EchoServiceImpl) Echo(ctx context.Context, req *echo.EchoRequest) (resp *echo.EchoResponse, err error) {
	return &echo.EchoResponse{Message: req.Message}, nil
}

5. 编译运行 RPC 服务程序

代码生成工具为我们提供了编译和运行的脚本,我们首先使用 sh build.sh命令就可以对源文件进行编译,生成一个 output 目录存放我们的编译产物。然后我们就可以使用 sh output/bootstrap.sh运行我们的 Echo 服务,默认会监听本机的 8888 端口。

总结

本文介绍了 RPC 服务以及 IDL 接口语言的基础概念,说明了利用 kitex 代码生成工具创建简单 RPC 服务的主要流程,希望在接下来的学习过程中,能够介绍更多有关 kitex 的基础用法和高阶特性。