kitex介绍

kitex是字节跳动内部使用的Golang微服务RPC框架。具有高性能、强可扩展的特点。

kitex使用字节跳动自研的Netpoll网络库,比go net的性能更高,这也是kitex高性能的一个原因。

kitex采用了模块化的设计,在整个服务框架的基础上,将可以替换的内容全部抽象为扩展接口并提供了默认的实现。一般情况下,用户使用默认实现即可,必要的话,用户可以按照自己的需要来自行实现扩展接口。

kitex官网的架构图如下:
image

可以看到对于微服务治理,kitex提供了服务注册、服务发现、负载均衡、监控等等扩展。为用户提供了很大程度的自由。

除此之外,kitex还提供了工具来帮助用户来提升开发效率。

接下来就使用kitex来快速实现一个简单的服务,来看看kitex是如何使用的吧。

kitex快速启动

安装

golang环境的安装这里就不加赘述了,按照golang官网的教程来即可。不过kitex对于golang有如下要求:

  1. 推荐使用最新版本的golang,kitex保证兼容罪行的三个正式版本。
  2. 确保打开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

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性