Go框架三件套(Web/RPC/GORM)三 | 青训营
3.Kitex
Kitex是字节内部的Golang微服务PRC框架。Kitex是一个高性能的开源网络库,它具有高性能、低延迟和高可靠性特点。它支持多种协议,如TCP、UDP、HTTP和RPC等,可以用于构建分布式系统、微服务和云计算等应用。 Kitex的主要用途是在应用程序中提供高性能的网络通信支持,并帮助开发人员更轻松地实现分布式应用程序和微服务。
3.1 框架特点
- 高性能:使用自研的高性能网络库 Netpoll,性能相较 go net 具有显著优势。
- 扩展性:提供了较多的扩展接口以及默认扩展实现,使用者也可以根据需要自行定制扩展。
- 多消息协议:RPC 消息协议默认支持 Thrift、Kitex Protobuf、gRPC。Thrift 支持 Buffered 和 Framed 二进制协议;Kitex Protobuf 是 Kitex 自定义的 Protobuf 消息协议,协议格式类似 Thrift;gRPC 是对 gRPC 消息协议的支持,可以与 gRPC 互通。除此之外,使用者也可以扩展自己的消息协议。
- 多传输协议:传输协议封装消息协议进行 RPC 互通,传输协议可以额外透传元信息,用于服务治理,Kitex 支持的传输协议有 TTHeader、HTTP2。TTHeader 可以和 Thrift、Kitex Protobuf 结合使用;HTTP2 目前主要是结合 gRPC 协议使用,后续也会支持 Thrift。
- 多种消息类型:支持 PingPong、Oneway、双向 Streaming。其中 Oneway 目前只对 Thrift 协议支持,双向 Streaming 只对 gRPC 支持
- 服务治理:支持服务注册/发现、负载均衡、熔断、限流、重试、监控、链路跟踪、日志、诊断等服务治理模块,大部分均已提供默认扩展,使用者可选择集成。
- 代码生成:Kitex 内置代码生成工具,可支持生成 Thrift、Protobuf 以及脚手架代码。
3.2 虚拟机安装
Kitex 目前对 Windows 的支持不完善,如果本地开发环境是 windows 的话需要用到 虚拟机或者是 WSL2。
1.“开始菜单”搜索功能,打开“启动或关闭Windows功能”
2.勾选以下功能
3.微软商店搜索wsl,点击安装
4.安装完打开,安装完之后输入用户的账号密码
5.更新内核
wsl --update
6.查看wsl状态并启动
wsl -l -v
wsl
3.3安装代码生成工具
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
go install github.com/cloudwego/thriftgo@latest
验证是否安装成功
kitex -version
thriftgo --version
3.4 定义 IDL
IDL (Interface Definition Language) 是指接口定义语言,是用于描述远程过程调用(RPC)或对象请求代理(ORP)接口的语言。 IDL 中定义了远程对象的接口,其中包括方法名称、参数类型和返回值类型等信息。这些信息可以用于生成代码来实现远程调用。常见的 IDL 标准有 CORBA 和 Microsoft COM/DCOM。
3.5 生成代码
使用下面的命令生成代码:
kitex -module example -service example echo.thrift
RPC(Remote Procedure Call Protocol)远程过程调用协议。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。比较正式的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
namespace go api
struct Request {
1: string message
}
struct Response {
1: string message
}
service Echo {
Response echo(1: Request req)
}
文件说明:
- build.sh:构建脚本
- kitex_gen:IDL内容相关的生成代码,主要是基础的Server/Client代码
- main.go:程序入口
- handler.go:用户在该文件里实现IDLservice定义的方法
服务默认监听8888端口;
package main
import(
"context"
"example/kitex_gen/api"
)
type EchoImpl struct{}
func (s *EchoImpl) Echo(ctx context.Context,req * api.Request) (resp *api.Response,err error) {
return
}
Kitex Client发起请求:
import "example/kitex_gen/api/echo"
import "github.com/cloudwego/kitex/client"
...
c,err := echo.NewClient("example",client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
log.Fatal(err)
}
import "example/kitex_gen/api"
...
req := &api.Request{Message:"my request"}
resp,err := c.Echo(context,Background(), reg, callopt.WithRPCTimeout(3*time.Second))
if err != nil {
log.Fatal(err)
}
log.PrintIn(resp)
Kitex服务注册与发现:
func main() {
r,err := etcd.NewEtcdResolver([]string{"127.0.0.1:2379"})
if err != nil {
log.Fatal(err)
}
client := hello.MustNewClient("Hello",client.withResolver(r))
for {
ctx,cancel := context,WithTimeout(context,Background(),time.Second*3)
resp,err := client.Echo(ctx,&api.Request{Message: "Hello"})
cancel()
if err != nil {
log.Fatal(err)
}
log.Println(resp)
time.Sleep(time.Second)
}
}
目前Kitex的服务注册与发现已经对接了主流的服务注册与发现中心,如ETCD,Nacos等;
3.6 Kitex生态