likes
comments
collection
share

字节跳动微服务框架Kitex学习之开发环境搭建与创建服务

作者站长头像
站长
· 阅读数 16

字节跳动微服务框架Kitex学习之开发环境搭建与创建服务

题图来自 Pixabay

我是游戏耀西

由于工作需要,近期在学习字节跳动的微服务框架 Kitex。

在看了官方文档之后,觉得还缺少一些实践文档,于是将自己实践和踩坑的过程记录下来,以备后续回顾,并分享给有需要的朋友们。

好了,开始今天的篇章 —— 开发环境搭建与创建服务

全文阅读大约需要 5 分钟。

一、开发环境搭建

1. 启动 docker container

由于我习惯在docker上做服务,就在docker上创建了一个名为 "debian-go-kitex" 的容器,用来作为我们后续学习的场地。

docker run -itd --name debian-go-kitex -p 8888:8888 6a3d7aa19f9c3910ba8fed40b31f0390be201e026753d639ebbfd992fbeb9791 /bin/bash

运行这条命令,就可以顺利地启动一个 debian 容器。

2. VSCode远程环境准备

在 VSCode 上搜索插件 Remote Development,安装下图所示的插件。

字节跳动微服务框架Kitex学习之开发环境搭建与创建服务

安装完毕后,左侧会出现一个 "远程资源管理器" 图标,点击选中已开启的 docker 容器,并将其附加到当前VSCode上。

字节跳动微服务框架Kitex学习之开发环境搭建与创建服务

3. VSCode 终端中运行以下命令行,安装Go环境

安装 Go 环境,只需要运行以下命令行。

wget https://go.dev/dl/go1.20.6.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.6.linux-amd64.tar.gz
# 这一行放在~/.bashrc中,然后source一下以图方便
export PATH=$PATH:/usr/local/go/bin:/root/go/bin
go version
# 创建src目录,以后工程代码就放这里了
mkdir -p $(go env GOPATH)/src

4. 安装 kitex 和 thriftgo

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

go install github.com/cloudwego/thriftgo@latest
thriftgo --version

5. 创建服务的工程目录

cd $(go env GOPATH)/src
mkdir example-server
cd example-server

至此开发环境搭建完毕。齐活儿,接下来编写服务。

二、 创建服务

请记住,kitex 的微服务是从一个 IDL 文件开始的,这个 IDL 在本文是一个 thrift 文件 —— echo.thrift。

1. 编写kitex微服务的起源 thrift 文件

namespace go api

struct Request {
  1: string message
}

struct Response {
  1: string message
}

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

这一步中的 thrift 文件定义了整个 rpc 服务的请求和返回结构,它是整个服务的源起。

2. 由 thrift 文件生成微服务 Go 代码

kitex -module example -service example-server echo.thrift
go mod tidy

这里有几个命令行中的可变量,需要说明一下:

thrift 文件首行 namespace go api,其中 api 会影响到 kitex_gen 目录中的文件的 package 名称,这个目录中都是生成的代码。

生成微服务代码中的 example 会影响到 go.mod 的 module 值,也就是整个工程的 module,比上面api这一层更高。

example-server 会影响到编译生成的可执行文件名。

这一步结束之后,我们就生成了一个叫 Echo 的服务。

整个服务目前只需要补齐工程目录下 handler.go 中的逻辑,就可以完成服务的编写。

三、 补全服务逻辑

在 handler.go 中,我们可以看到有一部分注释是这样的:

// TODO: Your code here...

在此补充自己的逻辑,例如补充:

func (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {
    return &api.Response{Message: "给你的信息: " + req.Message}, nil
}

服务已经补全,编译运行一下。

sh build.sh
sh output/bootstrap.sh

上面的 build.sh 是在 thrfit 文件生成服务代码时一并生成的,我们可以使用它非常方便地进行服务代码的编译。

编译的结果会放在 output/ 目录下,bootstrap.sh 就是我们运行服务的 shell 脚本。

四、 写个对应的 client 调用代码

在工程目录下,创建一个 client 目录,并在其中创建 main.go 文件,作为 client 代码。

package main

import (
    "context"
    "example/kitex_gen/api"
    "example/kitex_gen/api/echo"
    "log"
    "time"

    "github.com/cloudwego/kitex/client"
    "github.com/cloudwego/kitex/client/callopt"
)

func main() {
    // 创建连接
    c, err := echo.NewClient("example-server", client.WithHostPorts("0.0.0.0:8888"))
    if err != nil {
        log.Fatal(err)
    }
    // 发起调用
    req := &api.Request{Message: "这里是游戏耀西的频道,喜欢就关注追更哦"}
    resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
    if err != nil {
        log.Fatal(err)
    }
    // 输出返回
    log.Println(resp.Message)
}

运行客户端代码。

go run ./client

运行结果:

root@localhost:~/go/src/example-server# go run ./client/
2023/07/25 02:39:34 给你的信息: 这里是游戏耀西的频道,喜欢就关注追更哦

总结

本文对如何开始你的 Kitex 开发之旅进行了以下讲述:

  • 开发环境搭建
  • 创建服务
  • 补全服务逻辑
  • 写个对应的 client 调用代码

通过这些内容,能够帮助一个初始接触 kitex 微服务框架的开发者,能够快速上手,编写后续的服务。

本帐号 游戏耀西 将持续分享 Kitex 和微服务开发等干货,感谢你的阅读。