kitex介绍
kitex是字节跳动内部使用的Golang微服务RPC框架。具有高性能、强可扩展的特点。
kitex使用字节跳动自研的Netpoll网络库,比go net的性能更高,这也是kitex高性能的一个原因。
kitex采用了模块化的设计,在整个服务框架的基础上,将可以替换的内容全部抽象为扩展接口并提供了默认的实现。一般情况下,用户使用默认实现即可,必要的话,用户可以按照自己的需要来自行实现扩展接口。
kitex官网的架构图如下:
可以看到对于微服务治理,kitex提供了服务注册、服务发现、负载均衡、监控等等扩展。为用户提供了很大程度的自由。
除此之外,kitex还提供了工具来帮助用户来提升开发效率。
接下来就使用kitex来快速实现一个简单的服务,来看看kitex是如何使用的吧。
kitex快速启动
安装
golang环境的安装这里就不加赘述了,按照golang官网的教程来即可。不过kitex对于golang有如下要求:
- 推荐使用最新版本的golang,kitex保证兼容罪行的三个正式版本。
- 确保打开go.mod
然后执行下面的命令即可安装kitex
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
安装完成后,可以检测一下是否安装成功
$ kitex --version
v0.4.2
kitex支持thrift和protobuf两种序列化协议,用户只需要编写好对应IDL文件,然后生成对应的协议文件,就可以快速生成接口的定义以及通信的代码。
这里需要为thrift和protobuf安装编译器
- thrift的安装比较简单,执行下面的内容即可
# 安装thriftgo
go install github.com/cloudwego/thriftgo@latest
- protoc的安装要麻烦一些,可以在protoc下载源码包编译构建,也可以直接下载对应的二进制文件。然后安装下面的go插件。
# 安装protoc-gen-go/protoc-gen-go-grpc
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
因为个人在工作中使用的是protobuf,所以本教程始终以protobuf作为序列化协议。
接下来就可以使用kitex正是编写代码了。
服务编写
创建项目
创建一个项目目录并进入
mkdir echo && cd echo
编写IDL文件
在这里定义我们的服务
syntax = "proto3";
package echo;
option go_package = "api";
message Request {
string message = 1;
}
message Response {
string message = 1;
}
service Echo {
rpc Echo(Request) returns (Response);
}
生成服务代码
执行如下命令
kitex -module echo -service echo echo.proto
-module
表示生成项目的go module名-service
表示生成一个服务端项目,后面紧跟的echo
是服务的名字- 最后的
echo.proto
就是使用的IDL的文件
生成的项目结构如下所示
.
├── build.sh
├── echo.proto
├── go.mod
├── go.sum
├── handler.go
├── kitex_gen
│ └── api
│ ├── echo
│ │ ├── client.go
│ │ ├── echo.go
│ │ ├── invoker.go
│ │ └── server.go
│ ├── echo.pb.fast.go
│ └── echo.pb.go
├── main.go
└── script
└── bootstrap.sh
可以看到proto生成的代码在kitex_gen目录下,并且路径与go_package中的一致。
顺便提一下,在编写proto文件的时候要非常注意,go_package的路径最终一定要在kitex_gen路径下,否则运行上面的命令生成代码会报错。
就是说:
- 如果是非绝对路径也不是以.开头的路径,那么默认就是生成在kitex_gen目录下
- 绝对路径要保证路径为 {当前项目根路径}/kitex_gen/xxx/xxx
- 不要使用.开头的路径写法
如果使用的protoc的版本较新的话,会要求go_package一定要包含.
或者/
,所以为了避免出错,也为了简单,最好直接使用api/xxx
类型格式的路径。
编写逻辑代码
生成的代码已经为我们搭建好的服务框架,对于我们用户来说,需要做的也就是编写handler.go
文件下的实现逻辑。
现在这个文件的内容应该如下所示:
package main
import (
"context"
echo "echo/kitex_gen/api/echo"
)
// EchoImpl implements the last service interface defined in the IDL.
type EchoImpl struct{}
// Echo implements the EchoImpl interface.
func (s *EchoImpl) Echo(ctx context.Context, req *echo.Request) (resp *echo.Response, err error) {
// TODO: Your code here...
return
}
我们简单实现以下Echo方法即可
func (s *EchoImpl) Echo(ctx context.Context, req *echo.Request) (resp *echo.Response, err error) {
return &echo.Response{Message: req.Message}, nil
}
运行服务
kitex帮我们生成好了编译和运行需要的脚本。
运行build.sh,会在output目录下生成编译产物
sh build.sh
运行服务
sh output/bootstrap.sh
现在服务就已经启动了。
编写客户端
为了测试刚刚运行的服务端程序,我们来编写一个简单的客户端程序
mkdir client && cd client
touch main.go
实现客户端程序
func main() {
c, err := echo.NewClient("echo", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
log.Fatal(err)
}
req := &api.Request{Message: "hello, kitex"}
resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
if err != nil {
log.Fatal(err)
}
log.Println(resp)
}
上面代码中的echo.NewClient
就是用来创建客户端的,第一个参数就是调用的服务名,其实就是前面生成服务代码的时候 -service
后面跟着的服务名。
直接运行客户端代码,就可以看到响应的结果了。使用kitex框架开发服务的流程就介绍完毕了。
原文地址:http://www.cnblogs.com/smarticen/p/16920540.html