后续的文档更新还是会以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 发送请求,并得到应答。
环境准备
- devbox 或者 Linux 系统
- 安装配置 Goland 开发环境
- goland 语法特性学习 bytedance.feishu.cn/wiki/wikcnX…
工具安装
- 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是否安装成功
创建项目
- 在本地的 git 仓库中创建一个项目仓库
mkdir -p ~/mygit/kitexExample - 编写 idl 文件
- 新建一个 idl 文件夹
mkdir -p kiteExample/idl - 去其他仓库中copy一个 base.thrift 文件到 idl 文件夹下面
- 在 idl 下面新建自己的 idl文件:
kite_greet.thrift, 在这个文件中定义request 和 response的内容,同时定义一个service 包含一些方法,如下:
- 新建一个 idl 文件夹
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);
}
-
根据 idl 生成代码
- 如果用 Kitex,命令为:
cd kiteExamplekitex -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的路径
- 如果用 Kitex,命令为:
-
获取 kitex 框架 升级kitex框架
cd $EXAMPLE_PATH $ go get code.byted.org/kite/kitex $ go mod tidy -
编写服务端代码 前面 kitex 已经生成好了代码,服务器端代码的执行入口从 handle.go 文件中,我们只需要完善其中的方法即可;
-
运行 & 调用服务
- 首先更新下依赖
go get -u, 如果依赖包不匹配会报错,需要手动删除 go mod 中的 require内容,然后更新go mod tidy - 启动服务
sh build.sh+sh output/bootstrap.sh
- 首先更新下依赖
-
客户端代码 启动服务之后,可以直接执行客户端调用,示例代码:
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 天,点击查看活动详情