Web 三件套之 Kitex | 青训营笔记

344 阅读2分钟

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

重点内容

  • RPC 的含义
  • Kitex 安装与项目创建
  • IDL简介
  • Kitex 中 服务端与客户端的创建

详细知识

  Kitex 是 GoLang Web 开发中常用的 RPC框架,本文以Kitex v0.4.4为例介绍 Kitex 的使用方法。

  1. Kitex 的官方文档为:www.cloudwego.io/zh/docs/kit…
  2. Kitex 当今对 Windows 支持不完善,建议使用 Linux

RPC

  RPC(Remote Procedure Call,远程过程调用)是使在调用方不知情的情况下让调用者像调用本地资源一样调用网络资源,是微服务重要的技术之一。

安装配置

  安装 Kitex 和 Thrift Go:

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

  使用以下命令生成代码

kitex -module $ModuleName -service $ServiceName $ThriftFile

  生成的目录结构大致如下:

.
├── build.sh                // 构建脚本
├── go.mod
├── handler.go              // 用于实现接口
├── kitex_gen
│   └── api
│       ├── hello
│       │   ├── client.go
│       │   ├── hello.go
│       │   ├── invoker.go
│       │   └── server.go
│       ├── k-consts.go
│       ├── k-zml.go
│       └── zml.go
├── kitex.yaml
├── main.go                  // 程序入口
├── script
│   └── bootstrap.sh
└── zml.thrift

  使用build.sh进行项目编译。

IDL

  IDL(Interface Description Language,接口定义语言)是用于定义、描述接口的语言。在接下来的开发中,将使用 Thrift IDL生成代码来辅助开发。

  一个简单的 Thrift IDL 的示例如下:

namespace go api

struct Request{
    1: string message
}

struct Response{
    1: string message
}

service Echo {
    Response echo(1: Request req)
}
  1. Thrift IDL 语法 https:/thrift.apache.org/docs/idl
  2. Proto3 IDL 语法 developers.google.com/protocol-bu…

服务端与客户端

  Kitex 自动生成的服务端的启动代码(main.go下的主函数)如下:

svr := zml.NewServer(new(RemoteMonroeImpl))
err := svr.Run()
if err != nil {
    log.Println(err.Error())
}

  此部分可操作的部分为NewServer()的后续参数,可通过server.WithXXX()的形式指定各种服务端参数(Server Option),如:

addr, _ := net.ResolveTCPAddr("tcp", "0.0.0.0:38080")
svr := zml.NewServer(new(RemoteMonroeImpl), server.WithServiceAddr(addr))

  但是我们需要自己编写客户端的调用程序555。获取客户端的方式与获取服务端类似,调用NewClient()即可,如:

cli, err := zml.NewClient("zml.remoteMonroe", client.WithHostPorts("127.0.0.1:8888"))

  除了像服务端添加服务端参数那样添加客户端参数(Client Option),客户端还支持在每次调用时添加调用参数(Call Option),如:

req := zml.Request{Name: "猫猫"}
hello, err := cli.Hello(context.Background(), &req, callopt.WithConnectTimeout(time.Duration(time.Second)))
  1. Call Option 优先级高于 Client Option

  使用 Thrift 等生成的服务器端逻辑实现代码在handler.go中编写。

本文若有不足之处,欢迎纠正(≧^.^≦)喵~
我的其他笔记,可在掘金或 Github( github.com/DoudiNCer/I… )阅读