kitex入门 | 青训营

165 阅读3分钟

一 简介

kitex官方文档如下 快速开始 | CloudWeGo

安装:

  1. 确保 GOPATH 环境变量已经被正确地定义(例如 export GOPATH=~/go)并且将$GOPATH/bin添加到 PATH 环境变量之中(例如 export PATH=$GOPATH/bin:$PATH);请勿将 GOPATH 设置为当前用户没有读写权限的目录
  2. 安装 kitex:go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
  3. 安装 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 里定义了 LoggerCtxLoggerFormatLogger 等几个接口,并提供了一个 FormatLogger 的默认实现,可以通过 klog.DefaultLogger() 获取到其实例。 pkg/klog 同时也提供了若干全局函数,例如 klog.Infoklog.Errorf 等,用于调用默认 logger 的相应方法。