Kitex | 青训营笔记

151 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 8 天

概述

Kitex 是字节内部的 Golang 微服务 RPC 框架,具有高性能、强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展。

内容

Kitex 在win上代码生成不完善,win 上建议使用虚拟机或wsl2,可以参考我搭建docker的文章

安装

go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
go install github.com/cloudwego/thriftgo@latest

kitex -version

定义 IDL

namespace go api

struct Request {
    1:string message
}
struct Response {
    1:string message
}
service Echo {
    Response echo(1: Request req)
}

使用IDL 定义服务与接口

如果我们要进行RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的。这时候,就需要通过IDL来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。

Kitex 生成代码

kitex -module example -service example echo.thrift

| - build.sh
| - echo.thrift
| - hamd;er.go
| - kitex_gen
    | - api
        | - echo
            | - client.go
            | - echo.go
            | - invoker.go
            | - server.go
        | - echo.go
        | - k-echo.go
| - main.go
| - script
    | - boostrap.sh
    | - settings.py
  • build.sh: 构建脚本
  • kitex_gen: IDL内容相关的生成代码,主要是基础的 Server/Client代码。
  • main.go 程序入口
  • handler.go 用户在该文件里实现IDL service 定义的方法

server

package main

import (
    "context"
    "example/kitex_gen/api"
)
// 服务默认监听8888端口

// 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 *api.Request)(resp *api.Response, err error){
    //TODO:Your code here...
    return
}

client

import "example/kitex_gen/api/echo"
import "github.com/cloudwego/kitex/client"
...
c,err := c.Echo.NewClient("example",client.WithHostPorts("0.0.0.0:8888")
if err != nil {
    log.Fatal(err)
}
import "example/kitex_gen/api"
...
req := &api.Request[Message : "my request"}
resp,err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
if err != nil {
    log.Fatal(err)
}
Log.Println(resp)

Kitex服务注册与发现

type HelloImpl struct
func (h *HelLoImpl) Echo(ctx context. Context, req *api. Request)(resp *api. Response, err error){
    resp = &api.Response {
        Message: req.Message,
    }
    return
}
func main(){
r,err:=etcd.NewEtcdRegistry([]string("127.0.0.1:2379"})
1597 if err ! = nil {
Log.Fatal(err)
    server := hello.Newserver(new(HelloImpl),server.WithRegistry(r),server.WithserverBasicInfo(&rpcinfo.EndpointBasicInfof
        ServiceName: "Hello",
    }))
    err = server.Run()
    if err != nil {
        log.Fatal(err)
    }
}

image.png

参考