ycgg的GO语言之路Day07——三件套之Kitex,Hertz| 青训营笔记

48 阅读5分钟

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

Kitex

目前对Windows支持不完善,如果要使用可以使用虚拟机或WSL2

安装命令

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

安装完成后再用命令查看版本

kitex -version

相关文档:

https://www.cloudwego.iolzh/docs/kitexlgetting-started/

定义IDL

如果我们要进行RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的。这时候,就需要通过IDL来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。

相关文档:

Thrift: https://thrift.apache.org/docs/idl
Proto3 :https://developers.google.com/protocol-buffers/docs/proto3

image-20230122134912605.png

Kitex生成代码

使用命令

kitex -module example -service example echo.thrift

image-20230122142332965.png

build.sh :构建脚本 kitex _gen :IDL内容相关的生成代码,主要是基础的Server/Client代码。 main.go程序入口 handler.go用户在该文件里实现IDLservice定义的方法

Kitex的基本使用

需要在handler.go实现echo方法,kitex默认监听8888端口

image-20230122142608873.png

将代码逻辑填在Echo里面

Kitex Client发起请求

创建Client

image-20230122143027090.png

New Client传递目标服务名(可用于构建微服务时使用),后面为指定ip端口,指定完后,服务发现就不会生效

发起请求

image-20230122143327488.png

Kitex服务注册与发现

Kitex 的服务注册与发现已经对接了主流了服务注册与发现中心,如ETCD,Nacos等。

注册逻辑:

image-20230122143602343.png

上面echo的实现handler已经帮我们写好

下面主函数需要导入etcd的扩展,后面是etcd集群的地址

然后初始化server,并指定服务名,在此处可以指定微服务的权重占比等

接下来就可以run服务了,默认8888端口

相关文档:

https://www.cloudwego.io/zh/docs/kitex/tutorials/service-governance/discovery/
发现逻辑:

image-20230122144237143.png

第六行通过服务名进行过滤,获取对象

然后发送请求

示例代码:

https:/lgithub.com/kitex-contrib/registry-etcd/tree/main/example/client

Kitex生态

XDS扩展(流量路由) github.com/kitex-contr…

opentelemetry扩展(可观测性) github.com/kitex-contr…

ETCD服务注册与发现扩展(记录RPC调用方法时长) github.com/kitex-contr…

Nacos服务注册与发现扩展 github.com/kitex-contr…

Zookeeper服务注册与发现扩展 github.com/kitex-contr…

polaris扩展 github.com/kitex-contr…

丰富的示例代码与业务Demo github.com/cloudwego/k…

Hertz

相关文档:

https://www.cloudwego.io/zh/docs/hertzlgetting-started/

image-20230122145222672.png

先初始化一个Hertz对象,Default可以设置监听端口和超时

也可以使用New初始化,但是Default会继承一个recover中间件,根据需求选择

然后创建一个GET路由

开启Spin可以在服务停止之前,程序一直停在这个地方

Hertz在这里用到了两个上下文,一个专注于原信息,另一个专注于做请求处理

Hertz路由

Hertz提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由

image-20230122145937221.png

也可以使用提供的handle方法去自定义路由

Hertz支持路由组

image-20230122151319970.png

Hertz支持参数路由和通配路由,路由优先级为静态路由>命名路由>通配路由

image-20230122151444324.png

参数路由:version

通配路由:*version

Hertz参数绑定

可以把http请求的参数转到结构体中

Hertz提供了Bind、Validate、BindAndValidate 函数用于进行参数绑定和校验

image-20230122151823236.png

使用go tag进行绑定

如果是query参数就用query,如果是url参数就用path,其他同理

校验用vd

Hertz中间件

主要分为客户端中间件和服务端中间件

使用场景:许多地方需要同一种操作,比如计算服务耗时并输出日志

服务端简单的中间件示例:

image-20230122152226163.png

如果需要向下执行,必须调用Next

h.Use去注册一个全局中间件,每个路由前后都会打印上面的一句话

也可以单独注册到一个路由或者路由组上

Hertz Client

github.com/cloudwego/h…

提供了HTTP Client帮助用户发送HTTP请求

image-20230122152849920.png

其中dst用于有些结构体需要复用时,手动传入一个字节数组,这样就不用反复创建

Hertz代码生成工具

www.cloudwego.io/zh/docs/her…

提供了代码生成工具Hz,通过定义IDL文件可以生成基础服务的代码

并且Hertz5.0后不仅可以支持生成服务端代码也可以生成客户端代码

image-20230122153213308.png

目录结构

image-20230122153450531.png

handler是一些handle函数,model是一些结构体

router是方便注入中间件和注册路由的一些逻辑

生成代码:

image-20230122153721131.png

Hertz性能

使用字节内部的Netpoll,性能优于其他框架

Json编解码Sonic,使用sync.Pool复用对象协议层数据解析优化

Hertz生态

扩展仓库

github.com/cloudwego/h…

HTTP2扩展 github.com/hertz-contr…

opentelemetry扩展 github.com/hertz-contr…

国际化扩展 github.com/hertz-contr… 反向代理扩展 github.com/hertz-contr… JWT鉴权扩展 github.com/hertz-contr… Websocket扩展 github.com/hertz-contr… 丰富的示例代码与业 Demo github.com/cloudwego/h…

项目实践

项目简介 :

image-20230122154453719.png

在本项目传输协议上,用于演示,采用立刻PB和Thrift两种,实际开发时统一使用一种即可

项目示例地址:

https://github.com/cloudwego/kitex-examples/tree/main/bizdemo/easy_note

各模块介绍:

image-20230122154838567.png

调用关系图:

image-20230122154932979.png

demouser和demonote通过mysql操作,注册进etcd,再通过demoapi的发现去操作对应服务

IDL介绍

1.User

这里是PB的IDL,和刚刚讲的Thrift略有不同

image-20230122155241750.png

2.Note

使用Thriftt

image-20230122155347946.png

技术栈介绍:

image-20230122155431604.png

关键代码讲解(Create)

image-20230122155535066.png

1.声明结构体并绑定

2.参数校验,判断title和content是否非法

3.jwt用户数据处理

4.使用Kitex提供的方法创建数据

image-20230122155837089.png

1.初始化etcd的res对象,注入中间件

2.调用CreateNote

Kitex Server

image-20230122160358064.png

Gorm

数据库操作

image-20230122160532369.png

WithContxt传递上下文