Kitex 入门

Kitex 入门

1.获取示例代码

  • 点击 此处 直接下载示例代码仓库
  • 使用 git 克隆代码仓库:git clone https://github.com/cloudwego/kitex-examples.git

2.根据示例代码编写protobuf相关代码

  1. 参照./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);
    }
    
  2. 使用kitex 自动生成代码

    cd kitex-protobuf
    
    kitex -module github.com/cloudwego/kitex-examples hello.proto
    
    • 生成kitex_gen文件夹及其内部文件
  3. 编写服务端代码

    • 创建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
      }
      
  4. 编写客户端代码

    • 创建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)
      	}
      }
      
  5. 运行结果

// 每隔一秒输出类似日志代表运行成功
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.新增代码

  1. 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);
}
  1. 生成新代码
kitex -module github.com/cloudwego/kitex-examples -service a.b.c hello.proto
  1. 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
    }
    
    
  2. /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 运行

  1. 进入示例代码仓库:

    cd kitex-examples
    
  2. 构建 docker 镜像:

    docker build -t kitex-examples .
    
    // 输出类似日志代表运行成功
    2024/01/18 12:47:34.712415 server.go:83: [Info] KITEX: server listen at addr=[::]:8888
    
  3. 运行客户端代码:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值