kitex为字节开源的rpc框架,与go-micro等不同,kitex主打强扩展性,在协议上不仅支持Thrift(Buffered与Framed),同时也支持Kitex Protobuf等。
话不多说,首先看前置依赖

  1. go version>1.16
  2. go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
  3. go install github.com/cloudwego/thriftgo@latest
    准备好后可以开始简单的入门了
    在workspace下新建项目kitex-demo

Protobuf协议

Server端

在kitex-demo根目录下,mkdir server && cd server
在kitex-demo/server下开始server端的开发工作了
定义服务kitexProtoBuf
新建kitexProtoBuf.proto文件夹,输入以下内容

syntax = "proto3";
option go_package = "./";

service kitexProtoBuf {
  rpc MyHandT1(Request1) returns (Response){};
}

message Response{
    string message = 1;
}

message Request1{
	string message = 1;
}

其中,service kitexProtoBuf 声明此服务的方法,在这里定义了Request1与一个Response,代表着输入与输出
定义好后在本目录下执行

kitex -module kitex-demo -type protobuf -service kitexProtoBuf -I ./ kitexProtoBuf.proto

你将会在本目录下得到ketex_gen与script两个文件夹,一个build.sh与两个单独的go文件(handler.go与main.go)
其中ketex_gen与script两个文件夹可先忽略,我们一般需要完成的rpc方法在handler.go中,如下所示

package main

import (
	"context"
	"kitex-demo/server/protobuf/kitex_gen"
)

// KitexProtoBufImpl implements the last service interface defined in the IDL.
type KitexProtoBufImpl struct{}

// MyHandT1 implements the KitexProtoBufImpl interface.
func (s *KitexProtoBufImpl) MyHandT1(ctx context.Context, req *kitex_gen.Request1) (resp *kitex_gen.Response, err error) {
	// TODO: Your code here...
	return
}

完成MyhandT1方法,将MyHandT1改成

package main

import (
	"context"
	"kitex-demo/server/protobuf/kitex_gen"
)

// KitexProtoBufImpl implements the last service interface defined in the IDL.
type KitexProtoBufImpl struct{}

// MyHandT1 implements the KitexProtoBufImpl interface.
func (s *KitexProtoBufImpl) MyHandT1(ctx context.Context, req *kitex_gen.Request1) (resp *kitex_gen.Response, err error) {
	// TODO: Your code here...
	resp = &kitex_gen.Response{}
	resp.Message = req.Message
	return
}

在此,server端即生成完成简单的MyHandT1方法,启动server:
go run main.go handler.go

Client端

在kitex-demo根目录下,mkdir client && cd client (要注意client与server在同级最好,client服务需要调用server下生成的struct与func)
直接新建main.go,输入以下内容

package main

import (
	"context"
	"log"

	"github.com/cloudwego/kitex/client"
	"kitex-demo/server/protobuf/kitex_gen"
	"kitex-demo/server/protobuf/kitex_gen/kitexprotobuf"
)

func main() {
	client, err := kitexprotobuf.NewClient("kitexprotobuf", client.WithHostPorts("0.0.0.0:8888"))
	if err != nil {
		log.Fatal(err)
	}
	req1 := &kitex_gen.Request1{
		Message: "message1",
	}
	resp, err := client.MyHandT1(context.Background(), req1)
	if err != nil {
		log.Fatal("err1", err.Error())
	}
	log.Println("MyHandT1 Func Response", resp)
}

运行 client端
go run main.go
得到以下输出
MyHandT1 Func Response message:“message1”

Thrift协议

Server端

在kitex-demo根目录下,mkdir server && cd server
在kitex-demo/server下开始server端的开发工作了
定义服务kitexThrift
新建kitexThrift.thrift文件夹,输入以下内容

namespace go api

struct Request1 {
    1: string message1
}
struct Request2 {
    2: string message2
}

struct Response {
    1: string message
}

service kitexThrift {
    Response MyHandT1(1: Request1 req1)
    Response myHandT2(1: Request2 req2)
}

其中,service kitexThrift 声明此服务的方法,在这里定义了两个request与一个response,代表着输入与输出
定义好后在本目录下执行

kitex -module kitex-demo -service kitexThrift kitexThrift.thrift

你将会在本目录下得到ketex_gen与script两个文件夹,一个build.sh与两个单独的go文件(handler.go与main.go)
其中ketex_gen与script两个文件夹可先忽略,我们一般需要完成的rpc方法在handler.go中,如下所示

package main

import (
	"context"
	"kitex-demo/server/thrift/kitex_gen/api"
)

// KitexThriftImpl implements the last service interface defined in the IDL.
type KitexThriftImpl struct{}

// MyHandT1 implements the KitexThriftImpl interface.
func (s *KitexThriftImpl) MyHandT1(ctx context.Context, req1 *api.Request1) (resp *api.Response, err error) {
	// TODO: Your code here...
	return
}

// MyHandT2 implements the KitexThriftImpl interface.
func (s *KitexThriftImpl) MyHandT2(ctx context.Context, req2 *api.Request2) (resp *api.Response, err error) {
	// TODO: Your code here...
	return
}

其中我们只先完成MyHandT1中的方法,如下将MyHandT1修改为

func (s *KitexThriftImpl) MyHandT1(ctx context.Context, req1 *api.Request1) (resp *api.Response, err error) {
	// TODO: Your code here...
	resp=api.NewResponse()
	resp.Message=req1.Message1
	return
}

在此,server端即生成完成简单的MyHandT1方法,启动server:

go run main.go handler.go

Client端

在kitex-demo根目录下,mkdir client && cd client (要注意client与server在同级最好,client服务需要调用server下生成的struct与func)
直接新建main.go,输入以下内容

package main

import (
	"context"
	"log"

	"github.com/cloudwego/kitex/client"
	"kitex-demo/server/thrift/kitex_gen/api"
	"kitex-demo/server/thrift/kitex_gen/api/kitexthrift"
)

func main() {
	client, err := kitexthrift.NewClient("kitexthrift", client.WithHostPorts("0.0.0.0:8888"))
	if err != nil {
		log.Fatal(err)
	}
	req1 := &api.Request1{
		Message1: "message1",
	}
	resp, err := client.MyHandT1(context.Background(), req1)
	if err != nil {
		log.Fatal("err1", err.Error())
	}
	log.Println("MyHandT1 Func Response", resp)
}

运行 client端

go run main.go

得到以下输出

MyHandT1 Func Response Response({Message:message1})

至此,简单的cs过程完毕