go-kitex入门教程(1)
0 条评论kitex为字节开源的rpc框架,与go-micro等不同,kitex主打强扩展性,在协议上不仅支持Thrift(Buffered与Framed),同时也支持Kitex Protobuf等。
话不多说,首先看前置依赖
- go version>1.16
- go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
- 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过程完毕