第3篇:在windows环境下安装测试微服务框架kitex|青训营

338 阅读4分钟

0.介绍

Kitex字节跳动内部的 Golang 微服务 RPC 框架,具有高性能强可扩展的特点,在字节内部已广泛使用。如果对微服务性能有要求,又希望定制扩展融入自己的治理体系,Kitex 会是一个不错的选择。

框架特点

  • 高性能

    使用自研的高性能网络库 Netpoll,性能相较 go net 具有显著优势。

  • 扩展性

    提供了较多的扩展接口以及默认扩展实现,使用者也可以根据需要自行定制扩展,具体见下面的框架扩展。

  • 多消息协议

    RPC 消息协议默认支持 ThriftKitex ProtobufgRPC。Thrift 支持 Buffered 和 Framed 二进制协议;Kitex Protobuf 是 Kitex 自定义的 Protobuf 消息协议,协议格式类似 Thrift;gRPC 是对 gRPC 消息协议的支持,可以与 gRPC 互通。除此之外,使用者也可以扩展自己的消息协议。

  • 多传输协议

    传输协议封装消息协议进行 RPC 互通,传输协议可以额外透传元信息,用于服务治理,Kitex 支持的传输协议有 TTHeaderHTTP2。TTHeader 可以和 Thrift、Kitex Protobuf 结合使用;HTTP2 目前主要是结合 gRPC 协议使用,后续也会支持 Thrift。

  • 多种消息类型

    支持 PingPongOneway双向 Streaming。其中 Oneway 目前只对 Thrift 协议支持,双向 Streaming 只对 gRPC 支持,后续会考虑支持 Thrift 的双向 Streaming。

  • 服务治理

    支持服务注册/发现、负载均衡、熔断、限流、重试、监控、链路跟踪、日志、诊断等服务治理模块,大部分均已提供默认扩展,使用者可选择集成。

  • 代码生成

    Kitex 内置代码生成工具,可支持生成 ThriftProtobuf 以及脚手架代码 image.png

1.环境准备

go1.19,goland
v0.5.2后续版本陆续加入了对windows系统的兼容。
如果想使用wsl完成配置,可参考他文。

2.目录结构

大部分文件自动生成,我们只需要编辑以下三个文件 需要编写的文件.png

3.安装步骤

(1)新建项目

1.png 注意:如果已经在wsl中配置,创建文件的位置和SDK都需要对应。

2.png

(2)在IDE中打开终端执行以下命令

  • 安装 kitex:
    go install github.com/cloudwego/kitex/tool/cmd/kitex@latest

  • 安装 thriftgo:
    go install github.com/cloudwego/thriftgo@latest

  • 查询版本信息

    kitex --version

    thriftgo --version

QQ截图20230802155626.png (3)编写IDL,首先创建一个名为 echo.thrift 的 thrift IDL 文件

namespace go api

// 请求结构体
struct Request {
    1: string message // 请求消息
}

// 响应结构体
struct Response {
    1: string message // 响应消息
}

// Echo 服务
service Echo {
    // echo 方法用于返回请求消息的响应消息
    Response echo(1: Request req) // 请求参数
}

(4)生成 echo 服务代码 有了IDL 以后我们便可以通过 kitex 工具生成项目代码了,执行如下命令: kitex -module 模块名 -service 服务名 echo.thrift

模块名可在go.mod文件的首行查看

上述命令中, -module 表示生成的该项目的 go module 名,-service 表明我们要生成一个服务端项目,后面紧跟的为该服务的名字。最后一个参数则为该服务的 IDL 文件。

(5)修改handler.go中的Echo方法

// 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 &api.Response{Message: req.Message}, nil
}

(6)在根目录下新建client.go

package main

import (
	"context"
	"github.com/cloudwego/kitex/client"
	"github.com/cloudwego/kitex/client/callopt"
	"模块名/kitex_gen/api" // 导入自动生成的 API 代码包
	"模块名/kitex_gen/api/echo" // 导入自动生成的 Echo 服务代码包
	"log"
	"time"
)

func main() {
	// 创建 Echo 客户端
	c, err := echo.NewClient("服务名", client.WithHostPorts("0.0.0.0:8888"))
	if err != nil {
		log.Fatal(err)
	}

	// 创建请求对象
	req := &api.Request{Message: "你好,我是kitex!"}

	// 调用 Echo 服务的 echo 方法,并设置 RPC 超时时间为 3 秒
	resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
	if err != nil {
		log.Fatal(err)
	}

	// 打印响应结果
	log.Println(resp)
}

(6)刷新依赖
go mod tidy
(7)在终端启动服务端
go run main.go handler.go
(8)另外打开一个终端,启动客户端
go run client.go
(9)完成测试 0000.png

222222222.png

3.错误处理

  • 出现代码中部分的解析失败,请检查网络并执行go mod tidy

解析.png

  • 编译出现某一特定包出错,可以执行go get 包名地址

出错来源.png

更新netpoll包.png

相关阅读

使用wsl配置-powershell
使用wsl配置-微软商店
字节内部课-GO框架的设计与实现
kitex官方文档