GO框架三件套之RPC Kitex | 青训营笔记

262 阅读2分钟

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

Kitex准备工作

安装Kitex代码生成工具

对Windows不支持,使用如下命令:

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

kitex文档网址:Kitex - Documentation

Thrift

Thrift是RPC框架的一种,框架内的IDL(接口定义语言)可以用来生成主流语言的RPC服务端/客户端模板代码

Thrift文档网址:Apache Thrift - Documentation

Thrift中IDL的语法规则参考网站:Apache Thrift - Interface Description Language (IDL)

IDL代码示例:

image.png

Kitex生成代码

使用命令kitex -module example -service example echo.thrift可以生成代码

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

代码结构如下:

image.png

build.sh是构建脚本

handler.go用户在该文件里实现IDL service定义的方法

main.go程序入口

kiten_genIDL相关内容的生成代码.主要是基础的Server/Client代码

Kitex基本使用

默认监听8888端口

创建Client:

echo.NewCLient()可以创建Client,第一个参数是服务名,第二个参数是options.

c.Echo()可以发起调用,第一个参数是context.Context,通常用于传递信息或者控制本次调用的一些行为,第二个参数是本次调用的请求,第三个参数是options.

kitex的服务注册与发现连接了主流的服务注册与发现中心,例如ETCD或者Nacos

etcd文档:Documentation versions | etcd

nacos文档:Nacos 快速开始

服务注册代码示例:

import (
    ...
    "github.com/cloudwego/kitex/pkg/rpcinfo"
    "github.com/cloudwego/kitex/server"
    etcd "github.com/kitex-contrib/registry-etcd"
    ...
)

func main() {
    ...
    r, err := etcd.NewEtcdRegistry([]string{"127.0.0.1:2379"}) // r should not be reused.
    if err != nil {
        log.Fatal(err)
    }
    // https://www.cloudwego.io/docs/tutorials/framework-exten/registry/#integrate-into-kitex
    server, err := echo.NewServer(new(EchoImpl), server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "echo"}), server.WithRegistry(r))
    if err != nil {
        log.Fatal(err)
    }
    err = server.Run()
    if err != nil {
        log.Fatal(err)
    }
    ...
}

调用etcd.NewEtcdRegistry()新建服务,然后调用etcd.NewServer()注册服务

服务发现代码示例:

import (
    ...
    "github.com/cloudwego/kitex/client"
    etcd "github.com/kitex-contrib/registry-etcd"
    ...
)

func main() {
    ...
    r, err := etcd.NewEtcdResolver([]string{"127.0.0.1:2379"})
    if err != nil {
        log.Fatal(err)
    }
    client, err := echo.NewClient("echo", client.WithResolver(r))
    if err != nil {
        log.Fatal(err)
    }
    ...
}

调用ectd.NewEtcdResolver()创建解析器,之后调用echo.NewClient()创建客户端连接

更多有关服务的使用方式可以查看kitex的官方文档

Kitex生态

image.png