一 简介
kitex官方文档如下 快速开始 | CloudWeGo
安装:
- 确保
GOPATH环境变量已经被正确地定义(例如export GOPATH=~/go)并且将$GOPATH/bin添加到PATH环境变量之中(例如export PATH=$GOPATH/bin:$PATH);请勿将GOPATH设置为当前用户没有读写权限的目录 - 安装 kitex:
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest - 安装 thriftgo:
go install github.com/cloudwego/thriftgo@latest
Kitex 是字节内部的 Golang 微服务 RPC 框架,具有高性能、强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展。在大项目的内部往往采用的是RPC框架,kitex根据IDL文件(定义服务与接口)生成部分代码,支持thirft或者proto。
二 示例
根据抖音项目给出的接口可以写出proto示例
syntax = "proto3";
package user;
option go_package = "user";
message douyin_user_register_request {
string username = 1; // 注册用户名,最长32个字符
string password = 2; // 密码,最长32个字符
}
message douyin_user_register_response {
int32 status_code = 1; // 状态码,0-成功,其他值-失败
optional string status_msg = 2; // 返回状态描述
int64 user_id = 3; // 用户id
string token = 4; // 用户鉴权token
}
message douyin_user_request {
int64 user_id = 1; // 用户id
string token = 2; // 用户鉴权token
}
message douyin_user_response {
int32 status_code = 1; // 状态码,0-成功,其他值-失败
optional string status_msg = 2; // 返回状态描述
User user = 3; // 用户信息
}
message User {
int64 id = 1; // 用户id
string name = 2; // 用户名称
optional int64 follow_count = 3; // 关注总数
optional int64 follower_count = 4; // 粉丝总数
bool is_follow = 5; // true-已关注,false-未关注
}
service UserSrv{
rpc Register (douyin_user_register_request) returns (douyin_user_register_response);
rpc Login (douyin_user_register_request) returns (douyin_user_register_response);
rpc GetUserById (douyin_user_request) returns (douyin_user_response);
}
使用kitex -module example -service example user.proto生成代码,kitex-gen是kitex自动生成的可以作为参考,主要在handler.go中完成服务器代码的编写,以register代码为例。
func (s *UserSrvImpl) Register(ctx context.Context, req *user.DouyinUserRegisterRequest) (resp *user.DouyinUserRegisterResponse, err error) {
if len(req.Username) == 0 || len(req.Password) == 0 {
resp = pack.BuilduserRegisterResp(errno.ErrBind)
return resp, nil
}
err = command.NewCreateUserService(ctx).CreateUser(req, Argon2Config)
if err != nil {
resp = pack.BuilduserRegisterResp(err)
return resp, nil
}
// 新用户注册成功后直接登录
uid, err := command.NewCheckUserService(ctx).CheckUser(req)
if err != nil {
resp = pack.BuilduserRegisterResp(err)
return resp, nil
}
token, err := Jwt.CreateToken(jwt.CustomClaims{
Id: int64(uid),
})
if err != nil {
resp = pack.BuilduserRegisterResp(errno.ErrSignatureInvalid)
return resp, nil
}
resp = pack.BuilduserRegisterResp(errno.Success)
resp.UserId = uid
resp.Token = token
return resp, nil
}
传入的user.DouyinUserRegisterRequest是上下文,在kitex-gen里面,但存在一致性的问题所以还需要context.Context。
在大项目中通过gin等http框架搭建http服务,并得到客户端的的输入构造出请求,调用kitex-gen中的register即可调用rpc
三 特性
1.服务发现
Kitex 已经通过社区开发者的支持,完成了 ETCD、ZooKeeper、Eureka、Consul、Nacos、Polaris 多种服务发现模式,当然也支持 DNS 解析以及 Static IP 直连访问模式,建立起了强大且完备的社区生态,供用户按需灵活选用。
2。负载均衡
WeightedRoundRobi: 该LoadBalancer 使用的是基于权重的轮询策略,也是 Kitex 的默认策略。能让所有下游实例拥有最小的同时 inflight 请求数,以减少下游过载情况的发生。如果所有的实例的权重都一样,会使用一个纯轮询的实现,来避免加权计算的一些额外开销。
WeightedRandom: 顾名思义,这个 LoadBalancer 使用的是基于权重的随机策略。这个 LoadBalancer 会依据实例的权重进行加权随机,并保证每个实例分配到的负载和自己的权重成比例。如果所有的实例的权重都一样,会使用一个纯随机的实现,来避免加权计算的一些额外开销。
ConsistentHash: 一致性哈希主要适用于对上下文(如实例本地缓存)依赖程度高的场景,如希望同一个类型的请求打到同一台机器,则可使用该负载均衡方法。
3.日志
Kitex 支持默认 logger 实现和注入自定义 logger 以及重定向默认 logger 输出。
Kitex 在 pkg/klog 里定义了 Logger、CtxLogger、FormatLogger 等几个接口,并提供了一个 FormatLogger 的默认实现,可以通过 klog.DefaultLogger() 获取到其实例。
pkg/klog 同时也提供了若干全局函数,例如 klog.Info、klog.Errorf 等,用于调用默认 logger 的相应方法。