Kitex实践 | 青训营

76 阅读1分钟

新手自用实践记录

创建项目

创建一个项目

mkdir echo && cd echo

编写IDL文件

echo.proto文件,定义我们的服务

syntax = "proto3";

package echo;

option go_package = "api";

message Request {
    string message = 1;
}

message Response {
    string message = 1;
}

service Echo {
    rpc Echo(Request) returns (Response);
}

执行 kitex -module echo -service echo echo.proto

其中

  • -module表示生成项目的go module名
  • -service表示生成一个服务端项目,后面紧跟的echo是服务的名字
  • 最后的echo.proto就是使用的IDL的文件

生成如下结构

图片.png

编写逻辑代码

生成的代码已经为我们搭建好服务框架,对于我们来说,只需要编写handler.go文件下的实现逻辑。

// handler.go文件
package main

import (
	"context"
	echo "echo/kitex_gen/api/echo"
)

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

// Echo implements the EchoImpl interface.
func (s *EchoImpl) Echo(ctx context.Context, req *echo.Request) (resp *echo.Response, err error) {
	// TODO: Your code here...
	return
}

我们可以简单实现来测试功能,这一部分主要是实现的RPC的服务端功能。

func (s *EchoImpl) Echo(ctx context.Context, req *echo.Request) (resp *echo.Response, err error) {
	return &echo.Response{Message: req.Message}, nil
}

客户端服务

func main() {
	c, err := echo.NewClient("echo", client.WithHostPorts("0.0.0.0:8888"))
	if err != nil {
		log.Fatal(err)
	}
	req := &api.Request{Message: "hello, kitex"}
	resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
	if err != nil {
		log.Fatal(err)
	}
	log.Println(resp)
}

其中echo.NewClient就是用来创建客户端的,第一个参数就是调用的服务名。 api调用kitex-gen\api。 客户端通过req向服务器发送请求,服务器接受req后返回Responese。