Kitex 入门
1.获取示例代码
- 点击 此处 直接下载示例代码仓库
- 使用
git
克隆代码仓库:git clone https://github.com/cloudwego/kitex-examples.git
2.根据示例代码编写protobuf相关代码
-
参照
./hello
中的hello.thrift
编写hello.proto
- 创建文件夹
hello-protobuf
- 创建
hello.proto
syntax="proto3"; option go_package="api"; message Request{ string message=1; } message Response{ string message=1; } service Hello{ rpc echo(Request) returns (Response); }
- 创建文件夹
-
使用
kitex
自动生成代码cd kitex-protobuf kitex -module github.com/cloudwego/kitex-examples hello.proto
- 生成kitex_gen文件夹及其内部文件
-
编写服务端代码
-
创建
main.go
package main import ( api "github.com/cloudwego/kitex-examples/hello-protobuf/kitex_gen/api/hello" "log" ) // 注意: 导入的包是 hello-protobuf 下的相关包 func main() { svr := api.NewServer(new(HelloImpl)) // 爆 HelloImpl undifined 将main.go和handler.go一起选中运行 err := svr.Run() if err != nil { log.Println(err.Error()) } }
-
创建
handler.go
package main import ( "context" "github.com/cloudwego/kitex-examples/hello-protobuf/kitex_gen/api" ) // HelloImpl implements the last service interface defined in the IDL. type HelloImpl struct{} // Echo implements the HelloImpl interface. func (s *HelloImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) { // TODO: Your code here... resp = &api.Response{Message: req.Message + " from server"} return }
-
-
编写客户端代码
-
创建
client
文件夹 -
创建
client/main.go
文件package main import ( "context" "github.com/cloudwego/kitex-examples/hello-protobuf/kitex_gen/api" "github.com/cloudwego/kitex-examples/hello-protobuf/kitex_gen/api/hello" "github.com/cloudwego/kitex/client" "log" "time" ) func main() { client, err := hello.NewClient("hello", client.WithHostPorts("0.0.0.0:8888")) if err != nil { log.Fatal(err) } for { req := &api.Request{Message: "my request"} resp, err := client.Echo(context.Background(), req) if err != nil { log.Fatal(err) } log.Println(resp) time.Sleep(time.Second) } }
-
-
运行结果
// 每隔一秒输出类似日志代表运行成功
2024/01/18 20:39:59 Response({Message:my request from server})
2024/01/18 20:40:00 Response({Message:my request from server})
2024/01/18 20:40:01 Response({Message:my request from server})
3.新增代码
hello.proto
改为如下:
syntax="proto3";
option go_package="api";
message Request{
string message=1;
}
message Response{
string message=1;
}
message AddRequest{
int64 first=1;
int64 second=2;
}
message AddResponse{
int64 sum=1;
}
service Hello{
rpc echo(Request) returns (Response);
rpc add(AddRequest) returns (AddResponse);
}
- 生成新代码
kitex -module github.com/cloudwego/kitex-examples -service a.b.c hello.proto
-
handler.go
会自动更新// Add implements the HelloImpl interface. func (s *HelloImpl) Add(ctx context.Context, req *api.AddRequest) (resp *api.AddResponse, err error) { // TODO: Your code here... resp = &api.AddResponse{Sum: req.First + req.Second} return }
-
/client/main.go
新增
package main
import (
"context"
"github.com/cloudwego/kitex-examples/hello-protobuf/kitex_gen/api"
"github.com/cloudwego/kitex-examples/hello-protobuf/kitex_gen/api/hello"
"github.com/cloudwego/kitex/client"
"log"
"time"
)
func main() {
client, err := hello.NewClient("hello", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
log.Fatal(err)
}
for {
req := &api.Request{Message: "my request"}
resp, err := client.Echo(context.Background(), req)
if err != nil {
log.Fatal(err)
}
log.Println(resp)
time.Sleep(time.Second)
addReq := &api.AddRequest{First: 512, Second: 512}
addResp, err := client.Add(context.Background(), addReq)
if err != nil {
log.Fatal(err)
}
log.Println(addResp)
time.Sleep(time.Second)
}
}
4.Docker 运行
-
进入示例代码仓库:
cd kitex-examples
-
构建 docker 镜像:
docker build -t kitex-examples . // 输出类似日志代表运行成功 2024/01/18 12:47:34.712415 server.go:83: [Info] KITEX: server listen at addr=[::]:8888
-
运行客户端代码:
docker run --network host kitex-examples ./hello-server // 每隔一秒输出类似日志代表运行成功 2024/01/18 12:48:20 Response({Message:my request}) 2024/01/18 12:48:21 Response({Message:my request}) 2024/01/18 12:48:22 Response({Message:my request})