Kitex从入门到放弃【青训营】

105 阅读7分钟

本文是青训营课程--后端入门--《RDBMS 基本情况介绍》的笔记,讲师为李龙,可能老师不常和弱者打交道,语速很快,对我这种差生很不友好。

我基础很差,没有实际项目经验,但是想尽量跟上李龙老师的步伐,老师说的每一句一笔带过的话,我都要搞半天才知道啥意思。这节课几乎摧毁了我听之前几节课积累下来的信心,可能不适合做这个,但是还是听完了,我也是属于笨人里最不知天高地厚的那一种吧。
可以来看看一个笨学生被淘汰的痛苦历程,以及一篇硬着头皮写出来的流水账。

1 安装

需要先安装kitex的代码生成工具

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

这个工具能够根据Thrift生成代码.所以还需要安装thrift。

go install github.com/cloudwego/thriftgo@latest

老师一句带过了Thrift,GPT介绍如下:

Apache Thrift 是一个开源框架,用于构建高效且可扩展的跨语言服务。 它最初由 Facebook 开发,后来作为 Apache 项目开源。 Thrift 旨在简化创建和维护需要跨不同编程语言和平台进行通信的服务的过程。
Thrift 提供了一种使用自己的接口定义语言(IDL)来定义数据类型和服务接口的方法。 与我对 Kitex 的 IDL 的解释类似,Thrift 的 IDL 允许您以与语言无关的方式定义数据结构和服务方法。 一旦您在 IDL 中定义了数据类型和服务,Thrift 的代码生成工具就会为各种编程语言创建特定于语言的绑定。
Thrift 的工作原理如下:

  • IDL 定义:您在 Thrift 的 IDL 中编写服务接口和数据结构。 这包括定义您的服务将公开的方法以及它们将使用的数据类型。
  • 代码生成:Thrift 的代码生成工具采用 IDL 定义并为多种编程语言生成代码。 此代码包括客户端和服务器存根,以及已定义数据类型的序列化/反序列化逻辑。
  • 特定于语言的实现:您可以使用生成的存根以所需的编程语言实现服务逻辑。 这些存根处理通信细节,使您能够专注于服务的业务逻辑。
  • 跨语言通信:由于您使用相同的 IDL 来定义服务和数据结构,Thrift 确保用不同语言编写的服务可以无缝通信。
  • 高效序列化:Thrift 使用专为提高效率而设计的二进制序列化格式,使服务之间的数据传输快速而紧凑。

Thrift 支持多种编程语言,非常适合构建不同组件用不同语言编写的分布式系统。 它通常用于构建 API、微服务和其他需要跨语言通信和高性能的应用程序。
总而言之,Apache Thrift 是一个功能强大的框架,使您能够以与语言无关的方式定义服务和数据类型,然后为不同的编程语言生成必要的代码,从而更轻松地构建可互操作的高效分布式系统。

2 定义IDL

thrift.apache.org/docs/idl
如果我们要进行 RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的。这时候,就需要通过IDL 来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。
Thrift IDL文件由Thrift代码生成器处理,来生成各种目标语言的代码。
例子当中的项目根目录下,有一个echo.thrift,就是thrift的IDL文件,内容如下。

    namespace go api

    struct Request {
    	1: string message
    }

    struct Response {
    	1: string message
    }

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

遗憾的是老师没有给任何解释,就把这代码给读了一遍,老规矩,问GPT。 :::tips namespace go api指定已定义类型和服务的命名空间。 在本例中,命名空间设置为go.api,表示在 Go语言中定义的类型和服务将组织在该命名空间下。
第一个Request结构体定义了一个名为Request的 Thrift 结构。 它定义了一个带有标签 1 和数据类型string的字段。 该字段代表一条消息。
第二个回复结构体同上。
第三个结构体定义了一个名为Echo的 Thrift 服务。 服务是可由客户端远程调用的方法的集合。 在本例中,“Echo”只有一个方法:一个名为echo的方法,所需参数只有一个Request类型变量(标签为1,名称为req),返回一个Response类型。 ::: 我才知道,这里的1是叫label,但是这个label是干啥用的我还不清楚。

3 生成中央代码

然后使用以下指令生成服务端代码,我也不清楚这个执行结果是成功了还是没成功。

kitex -module github.com/cloudwego/kitex-examples -service example echo.thrift
# 我这里执行后结果如下
Adding apache/thrift@v0.13.0 to go.mod for generated code .......... Done

其中-module指定模块,-service指定服务名.
也不清楚代码生成在哪了,老师说,会生成以下文件,但是我记得这些东西本来就在仓库里,也不知道它生成了没,就当生成了吧,唉
image.png

  • build.sh用来构建脚本,执行它,会将代码变为一个可执行二进制文件。真的假的,我试试。果然不出我所料,报错,一个纯小白走的每一步都是报错。我猜还是因为windows的问题。我感觉就是说这些代码正常来讲应该是在服务器上的,那肯定要用Linux呀,所以就不支持windows。不知道是不是这样。

image.png

  • kitex_gen会生成一些IDL相关的代码,serviceclient还有struct,还有一些编解码(听着是这个词,不知道打对了没)的优化。这个编解码是啥玩意,老师没说,我猜是编码和解码的简称,但是是对啥玩意的编码解码,我不知道,唉。
  • main.go程序入口
  • handler.go实现echo的逻辑。

4 Kitex的基本使用

4.1 服务端

Kitex默认监听8888端口。
然后看一下handler.go

package main

import (
	"context"
	api "github.com/cloudwego/kitex-examples/kitex_gen/api"
)

// EchoImpl implements the last service interface defined in the IDL.
// 一个结构体
type EchoImpl struct{}

// Echo implements the EchoImpl interface.
// 生成的Echo方法,
func (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {
	// TODO: Your code here...
	return
}

老师说,具体实现也最好不要都放这里,如果太多的话还是要做代码分层。

4.2 客户端

创建client,我看不懂,不知道这一步是在干嘛,老师开始背贯口,感觉是讲给那些本身就用过的人的,我在这一步彻底被淘汰,这里的代码我也没找到在哪里。

import "example/kitex_gen/api/echo"
import "github.com/cloudwego/kitex/client"
...
// "example"是目标服务名,服务发现时用来过滤服务,服务发现不知道是啥
// client.WithHostPorts指定对端服务的IPPort,制定后服务发现失效
c,err : echo.NewClient("example", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
    log.Fatal(err)
}

发起请求

import "example/kitex_gen/api"
..
req := &api.Request{Message:"my request"}
resp,err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
if err != nil{
    log.Fatal(err)
}
log.Println(resp)

4.3 Kitex服务发现与注册

目前 Kitex 的服务注册与发现已经对接了主流了服务注册与发现中心,如 ETCD,Nacos 等。
把server注册到注册中心,client去注册中心获取数据,内部实现负载均衡等一系列算法,这样比比多层代理更快,因为IP直连。(其实像这种经验,对于新手是没用的,我写下来也记不住,因为理解的不深刻)
后面我就不写了,老师又开始念代码了,自己没写过,听不懂。


还是自己玩玩kitex的示例代码吧,对于我这种没实际项目经历的新手,比听大佬念贯口炫技有用一些。
我忽然想起来了有关工作的悖论,所有工作都要求你之前有几年的工作经历,这种课也给我这种感觉,想学习入门课,你必须已经在“门内”。
我放弃了,我这种没有项目经验的阶段还是更适合先跟着傻瓜式的课程手把手经历一下整体项目流程,
青训营再见,我太弱了。