这是我参与「第五届青训营 」笔记创作活动的第9天
Hertz环境安装详细见
架构设计
Hertz从上到下分为:应用层、路由层、协议层和传输层,每一层各司其职,同时公共能力被统一抽象到公共层(Common)
应用层
应用层是和用户直接交互的一层,提供丰富易用的 API,主要包括 Server、Client 和一些其他通用抽象
Server 提供了注册 HandlerFunc、Binding、Rendering 等能力
Client 提供了调用下游和服务发现等能力,以及抽象一个 HTTP 请求所必须涉及到的请求(Request)、响应(Response)、上下文(RequestContext)、中间件(Middleware)等等
Hertz的Server和Client都能够提供中间件这样的扩展能力
应用层中一个非常重要的抽象就是对 Server HandlerFunc 的抽象
路由层
路由层负责根据 URI 匹配对应的处理函数。
协议层
传输层
Hz脚手架
与 Hertz 一并开源的还有一个易用的命令行工具 Hz,用户只需提供一个 IDL,根据定义好的接口信息,Hz 便可以一键生成项目脚手架,让 Hertz 达到开箱即用的状态
尝试之前
IDL 是什么
Hz 运行的整个流程如下:
- 当用户使用了 Hz 命令后,Hz 工具本身会被系统调用,生成一些 Layout 相关代码,比如 Main 函数、Gomod 等文件。同时,Hz 会拼接 Thriftgo 命令调用 Thriftgo 来生成与 IDL 定义相关的代码;
- Thriftgo 会解析 IDL 并生成对应的语法树,然后将语法树以及透传给插件的选项一起写入到标准输入中;
- 当插件得到了这些语法树以及选项之后,插件会先在标准输入中读取到 Thriftgo 传过来的内容,然后解析语法树,并根据用户在 IDL 中拓展的相关 HTTP 注解来生成目标文件的内容;
- 当 thrift-gen-hertz 插件执行完毕后,会通过标准输出的形式将结果返回,Thriftgo 会从中读入插件的执行结果,并生成目标文件;
- 将整个流程执行的结果返回给我们的命令行 Hz 工具,命令行工具会将最终的结果呈现给用户。
一个简单Demo
1.首先定义IDL,这里使用Thrift作为IDL的定义,编写一个名为 Demo 的 service
这个服务有一个 API: Hello,它的请求参数是一个 query,响应是一个包含一个 RespBody 字段的 Json。
虽然语法还没有学(
2.利用Hz来生成代码,并整理和拉取依赖
命令:
// GOPATH 下执行
hz new -idl idl/hello.thrift
// 整理 & 拉取依赖
go mod tidy
注意这里的命令要以管理员权限来执行,否则会报错并生成hz new的那个pingpong框架
一位大佬的笔记:
自动生成的代码
3.修改hander,添加自己的逻辑,如图,一个简单的回复逻辑
4.编译运行项目
为啥Goland中就会失败呢???
5.测试
curl http://127.0.0.1:8888/hello?name=cjy
终于成功了,如图