这是我参与「第五届青训营 」伴学笔记创作活动的第 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
Kitex生成代码
使用命令
kitex -module example -service example echo.thrift
build.sh :构建脚本 kitex _gen :IDL内容相关的生成代码,主要是基础的Server/Client代码。 main.go程序入口 handler.go用户在该文件里实现IDLservice定义的方法
Kitex的基本使用
需要在handler.go实现echo方法,kitex默认监听8888端口
将代码逻辑填在Echo里面
Kitex Client发起请求
创建Client
New Client传递目标服务名(可用于构建微服务时使用),后面为指定ip端口,指定完后,服务发现就不会生效
发起请求
Kitex服务注册与发现
Kitex 的服务注册与发现已经对接了主流了服务注册与发现中心,如ETCD,Nacos等。
注册逻辑:
上面echo的实现handler已经帮我们写好
下面主函数需要导入etcd的扩展,后面是etcd集群的地址
然后初始化server,并指定服务名,在此处可以指定微服务的权重占比等
接下来就可以run服务了,默认8888端口
相关文档:
https://www.cloudwego.io/zh/docs/kitex/tutorials/service-governance/discovery/
发现逻辑:
第六行通过服务名进行过滤,获取对象
然后发送请求
示例代码:
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/
先初始化一个Hertz对象,Default可以设置监听端口和超时
也可以使用New初始化,但是Default会继承一个recover中间件,根据需求选择
然后创建一个GET路由
开启Spin可以在服务停止之前,程序一直停在这个地方
Hertz在这里用到了两个上下文,一个专注于原信息,另一个专注于做请求处理
Hertz路由
Hertz提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由
也可以使用提供的handle方法去自定义路由
Hertz支持路由组
Hertz支持参数路由和通配路由,路由优先级为静态路由>命名路由>通配路由
参数路由:version
通配路由:*version
Hertz参数绑定
可以把http请求的参数转到结构体中
Hertz提供了Bind、Validate、BindAndValidate 函数用于进行参数绑定和校验
使用go tag进行绑定
如果是query参数就用query,如果是url参数就用path,其他同理
校验用vd
Hertz中间件
主要分为客户端中间件和服务端中间件
使用场景:许多地方需要同一种操作,比如计算服务耗时并输出日志
服务端简单的中间件示例:
如果需要向下执行,必须调用Next
h.Use去注册一个全局中间件,每个路由前后都会打印上面的一句话
也可以单独注册到一个路由或者路由组上
Hertz Client
提供了HTTP Client帮助用户发送HTTP请求
其中dst用于有些结构体需要复用时,手动传入一个字节数组,这样就不用反复创建
Hertz代码生成工具
提供了代码生成工具Hz,通过定义IDL文件可以生成基础服务的代码
并且Hertz5.0后不仅可以支持生成服务端代码也可以生成客户端代码
目录结构
handler是一些handle函数,model是一些结构体
router是方便注入中间件和注册路由的一些逻辑
生成代码:
Hertz性能
使用字节内部的Netpoll,性能优于其他框架
Json编解码Sonic,使用sync.Pool复用对象协议层数据解析优化
Hertz生态
扩展仓库
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…
项目实践
项目简介 :
在本项目传输协议上,用于演示,采用立刻PB和Thrift两种,实际开发时统一使用一种即可
项目示例地址:
https://github.com/cloudwego/kitex-examples/tree/main/bizdemo/easy_note
各模块介绍:
调用关系图:
demouser和demonote通过mysql操作,注册进etcd,再通过demoapi的发现去操作对应服务
IDL介绍
1.User
这里是PB的IDL,和刚刚讲的Thrift略有不同
2.Note
使用Thriftt
技术栈介绍:
关键代码讲解(Create)
1.声明结构体并绑定
2.参数校验,判断title和content是否非法
3.jwt用户数据处理
4.使用Kitex提供的方法创建数据
1.初始化etcd的res对象,注入中间件
2.调用CreateNote
Kitex Server
Gorm
数据库操作
WithContxt传递上下文