Kitex初体验 | 青训营笔记

205 阅读3分钟

Kitex初体验

这是我参与「第五届青训营 」伴学笔记创作活动的第5天,今天主要学习和了解Kitex的使用和特性。

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

Kitex 框架及命令行工具,默认支持 thrift 和 proto3 两种 IDL,对应的 Kitex 支持 thrift 和 protobuf 两种序列化协议。 传输上 Kitex 使用扩展的 thrift 作为底层的传输协议(注:thrift 既是 IDL 格式,同时也是序列化协议和传输协议)。

IDL

IDL 全称是 Interface Definition Language,接口定义语言

是用来描述软件组件接口的一种计算机语言。IDL通过一种独立于编程语言的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信交流;

|消息类型 |编码协议 |传输协议|

|PingPong|Thrift / Protobuf| TTHeader / HTTP2(gRPC)

|Oneway|Thrift |TTHeader|

|Streaming| Protobuf| HTTP2(gRPC)|

例子

先进入hello目录 cd kitex-examples/hello 运行server go run . 运行client go run ./client

Thrift

目前 Thrift 支持 PingPong 和 Oneway。Kitex 计划支持 Thrift Streaming。

其IDL定义

namespace go echo

struct Request {
    1: string Msg
}

struct Response {
    1: string Msg
}

service EchoService {
    Response Echo(1: Request req
    ); // pingpong method
    oneway void VisitOneway(1: Request req); // oneway method
}

Protobuf

itex 支持两种承载 Protobuf 负载的协议:

Kitex Protobuf

  • 只支持 PingPong,若 IDL 定义了 stream 方法,将默认使用 gRPC 协议 gRPC 协议
  • 可以与 gRPC 互通,与 gRPC service 定义相同,支持 Unary(PingPong)、 Streaming 调用
syntax = "proto3";

option go_package = "echo";

package echo;

message Request {
  string msg = 1;
}

message Response {
  string msg = 1;
}

service EchoService {
  rpc ClientSideStreaming(stream Request) returns (Response) {} // 客户端侧 streaming
  rpc ServerSideStreaming(Request) returns (stream Response) {} // 服务端侧 streaming
  rpc BidiSideStreaming(stream Request) returns (stream Response) {} // 双向流
}

kitex生成工具

当你修改完.thrift文件后可以使用

kitex -service a.b.c hello.thrift

# 若当前目录不在 $GOPATH/src 下,需要加上 -module 参数,一般为 go.mod 下的名字
kitex -module "your_module_name" -service a.b.c hello.thrift

kitex会更新 ./handler.go,在里面增加一个 Add 方法的基本实现 更新 ./kitex_gen,里面有框架运行所必须的代码文件

kitex服务注册与发现

Kitex 已经通过社区开发者的支持,完成了 ETCD、ZooKeeper、Eureka、Consul、Nacos、Polaris 多种服务发现模式,当然也支持 DNS 解析以及 Static IP 直连访问模式,建立起了强大且完备的社区生态,供用户按需灵活选用

etcd(读作 et-see-dee)是一种开源的分布式统一键值存储,用于分布式系统或计算机集群的共享配置、服务发现和的调度协调。etcd 有助于促进更加安全的自动更新,协调向主机调度的工作,并帮助设置容器的覆盖网络。

package main

import (
	"context"
	"log"
	"time"

	"github.com/cloudwego/kitex-examples/hello/kitex_gen/api"
	"github.com/cloudwego/kitex-examples/hello/kitex_gen/api/hello"
	"github.com/cloudwego/kitex/client"
	etcd "github.com/kitex-contrib/registry-etcd"
)

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)
	}
}

//https://github.com/kitex-contrib/registry-etcd/blob/main/example/client/main.go

总结

Kitex作为RPC工具,能够支持Protobuf和thrift两种协议。用户可以通过修改thrift-IDL并使用kitex命令行工具来自动生成客户端和服务端的代码,简单易用。不仅如此,kitex-etcd支持服务注册与发现,其分布式服务使网络访问更安全可靠。