GoLand 开发: kitex 微服务框架搭建

595 阅读3分钟

后续的文档更新还是会以AI方向为主,我主要还是 NLP 方向,由于业务原因,会涉及到一些工程开发,刚好将自己学习和思考 goland 开发的过程记录在这里。

基础相关

RPC

RPC(remote procedure call),简单来说就是一种 client-server类型的计算机通讯协议,其实也就是我们比较熟悉的远程方法过程调用。

国内外比较知名的 RPC 框架,也是本文接下来重点讲述的是 thrift 框架,优势是能比较好的支持跨语言;还有 RPCX,基于go语言的分布式rpc框架,是目前性能最好的 rpc 框架之一。 详细内容可以看这里

Kite & KiteX

Kite 也是一个基于 go 语言的 rpc 微服务框架;而 KiteX则是基于Kite,字节内部使用的框架。 之所以使用 KiteX,是因为它基于 thrift 的 RPC框架,同时具备 服务注册和发现、统一RPC调用、服务调用跟踪、服务调用容灾、服务访问控制、服务负载均衡、性能监控分析等功能。

基于kiteX搭建简单的服务

接下来我们介绍如何从零开始搭建一个简单的服务,这个服务将实现 client 向 server 发送请求,并得到应答。

环境准备

  1. devbox 或者 Linux 系统
  2. 安装配置 Goland 开发环境
  3. goland 语法特性学习 bytedance.feishu.cn/wiki/wikcnX…

工具安装

  1. KiteX 安装
export GO111MODULE=on
go install code.byted.org/kite/kitex/tool/cmd/kitex@latest
go get code.byted.org/kite/kitex/tool/cmd/kitex@latest

使用 kitex -h check是否安装成功

创建项目

  1. 在本地的 git 仓库中创建一个项目仓库 mkdir -p ~/mygit/kitexExample
  2. 编写 idl 文件
    • 新建一个 idl 文件夹 mkdir -p kiteExample/idl
    • 去其他仓库中copy一个 base.thrift 文件到 idl 文件夹下面
    • 在 idl 下面新建自己的 idl文件: kite_greet.thrift, 在这个文件中定义request 和 response的内容,同时定义一个service 包含一些方法,如下:
include "base.thrift"

struct HelloRequest {
1: required string Message,
255: optional base.Base Base;
}

struct HelloResponse {
1: required string Message,
255: optional base.BaseResp BaseResp;
}

service GreetService {
HelloResponse SayHello(1: HelloRequest request);
}
  1. 根据 idl 生成代码

    • 如果用 Kitex,命令为:
      • cd kiteExample
      • kitex -module code.byted.org/kitex/kitex_example -service kitex.thrift.example idl/kitex_greet.thrift
    • 如果用 kite 命令为 kx -m code.byted.org/kitex/kitex_example -s kitex.thrift.example idl/kitex_greet.thrift
    • 参数说明
      • module: 表明生成的代码在 go mod 中的 module name
      • service 表明要生成服务端代码,并且制定服务的 psm,也就是上面的 kitex.thrfit.example
      • 最后一个参数指明idl的路径
  2. 获取 kitex 框架 升级kitex框架

    cd $EXAMPLE_PATH
    $ go get code.byted.org/kite/kitex
    $ go mod tidy
    
  3. 编写服务端代码 前面 kitex 已经生成好了代码,服务器端代码的执行入口从 handle.go 文件中,我们只需要完善其中的方法即可;

  4. 运行 & 调用服务

    • 首先更新下依赖 go get -u, 如果依赖包不匹配会报错,需要手动删除 go mod 中的 require内容,然后更新 go mod tidy
    • 启动服务 sh build.sh + sh output/bootstrap.sh
  5. 客户端代码 启动服务之后,可以直接执行客户端调用,示例代码:

package main
import (
"code.byted.org/kite/kitex/client"
"code.byted.org/kitex/kitex_example/kitex_gen/toutiao/kitex/demo"
"code.byted.org/kitex/kitex_example/kitex_gen/toutiao/kitex/demo/greetservice"
"context"
"fmt"
)
func main() {
var opts []client.Option
// specify the address of the server
opts = append(opts, client.WithHostPorts( "localhost:8888" ))
// construct a client
cli := greetservice.MustNewClient( "kitex.thrift.example" , opts...)
ctx := context.Background()
// initialize one request
req := &demo.HelloRequest{
    Message: "Hello",
}
// make a call
resp, err := cli.SayHello(ctx, req)
if err != nil {
fmt.Printf( "failed: %s\n" , err.Error())
} else {
fmt.Printf( "OK: %s\n" , resp.Message)
}
}

总结

到这里,我们已经能够完整的搭建一个kitex微服务了,感觉确实很方便,我们只需要编写 idl 文件,定义好需要的输入输出、想要实现的方法,约定好方法的输入输出参数,就能自动帮我们生成一个微服务的代码框架,接下来我们只需要在定义好的方法body中,填写需要的业务逻辑就好啦,真的大大节省了开发时间。 实际开发中,应该还会遇到各种奇怪的问题,我将持续更新在本文后面的 FAQ中

FAQ

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情