go-zero 介绍和使用
一、什么是 go-zero?
go-zero 是一个基于 Go 语言的微服务框架,提供了高效、简单并易于扩展的 API 设计和开发模式。它主要目的是为开发者提供一种简单的方式来构建和管理云原生应用。
1.go-zero 的核心特性
-
高性能:
- go-zero 采用了 Go 语言的高并发特性,具有很高的性能,适合处理大量请求。
-
代码生成:
- 通过
goctl
工具,开发者可以根据定义的 API 规范自动生成相应的代码,包括路由、处理逻辑、数据模型等,提高开发效率。
- 通过
-
微服务架构:
- 适合构建微服务架构的应用,支持服务的拆分、组合及独立开发部署。
-
中间件支持:
- 提供了灵活的中间件机制,可以用于日志、认证、限流、跨域等功能。
-
丰富的文档与社区支持:
- 提供完善的文档和示例,社区活跃,易于获取支持。
2. 总体架构
go-zero 的总体架构包括几个主要部分:
- Framework(框架):提供服务的基本功能,包括 HTTP、RPC、API 网关等。
- Config(配置):支持读取配置文件并提供配置管理。
- Model(模型):与数据库交互的模型层,支持 ORM(对象关系映射)。
- Middleware(中间件):提供各种中间件功能(如日志、认证等)。
- Log(日志):集中管理日志功能的模块。
- Gateway(网关):API 网关的实现,用于转发请求。
- Etcd:支持服务注册和发现,基于 Etcd 实现微服务架构。
二、环境搭建
默认go为1.16以及之后的版本
1. 安装 goctl
工具
goctl
是go-zeron的开发利器,可以根据api文件生成代码和文档,可以根据sql生成model,以及生成部署k8s yaml、dockerfile等
go install github.com/zeromicro/go-zero/tools/goctl@latest
2. 安装 protoc
protoc
用来根据 proto 文件生成RPC代码
goctl env check --install --verbose --force
3. 安装 go-zero
使用以下命令安装 go-zero:
go get -u github.com/zeromicro/go-zero
三、构建第一个 API
1.hello word
在实际开发中,我们通常是根据 API 文件,使用 goctl 工具生成项目代码。为更好地了解 Go-Zero 的执行过程,我们首先使用 Go-Zero 创建一个简单的 HTTP 服务,输出一个 Hello World。。
创建一个hellowrod
目录,先创建hello.yaml
的配置文件
Name: HelloWorld.api # 服务名
Host: 127.0.0.1 # host地址
Port: 8080 #端口
然后创建 hello.go
文件:
package mainimport ("github.com/zeromicro/go-zero/core/conf""github.com/zeromicro/go-zero/rest""github.com/zeromicro/go-zero/rest/httpx""log""net/http"
)func main() {var restConf rest.RestConf //rest.RestConf 是一个http服务配置结构体conf.MustLoad("helloword/hello.yaml", &restConf) //用来读取并解析配置s, err := rest.NewServer(restConf) //根据配置启动一个新的服务if err != nil {log.Fatal(err)return}s.AddRoute(rest.Route{ // 添加路由Method: http.MethodGet, //使用get方法Path: "/hello/world", //路径Handler: func(writer http.ResponseWriter, request *http.Request) { // 处理函数httpx.OkJson(writer, "Hello World!") //返回一个Hello World!的json信息},})defer s.Stop()s.Start() // 启动服务
}
2. 启动服务
运行 go-zero 服务:
go run hello.go
使用 Postman 或 curl 进行 API 测试。
3.代码简单分析
初始化配置
var restConf rest.RestConf //声明一个restConf变量,用于保存HTTP服务的配置
RestConf
是一个http服务配置结构体,在go-zero中具体实现为:
RestConf struct {service.ServiceConfHost string `json:",default=0.0.0.0"`Port int/*省略掉未用到的参数*/}
需要注意的是,YAML 配置文件的字段名必须与结构体字段一致,但不区分大小写。
go-zero能够自动将配置文件解析到结构体中:
conf.MustLoad("helloword/hello.yaml", &restConf) //加载并解析配置文件hello.yaml
从go-zero代码中可以看到 ,它支持json
、toml
、 yaml
、yml
等四种格式。
var (fillDefaultUnmarshaler = mapping.NewUnmarshaler(jsonTagKey, mapping.WithDefault())loaders = map[string]func([]byte, any) error{".json": LoadFromJsonBytes,".toml": LoadFromTomlBytes,".yaml": LoadFromYamlBytes,".yml": LoadFromYamlBytes,}
)
创建HTTP服务器
`s, err := rest.NewServer(restConf)`//使用加载的配置创建新的HTTP服务器实例
添加路由
例如,以是一个简单的路由实现:
s:= rest.NewServer()
s.AddRoutes(routes) // routes 是定义好的路由
s.Start()
go-zero 支持 RESTful 路由方式,可以在路由中定义处理的 HTTP 方法(GET、POST 等)。
s.AddRoute(rest.Route{ Method: http.MethodGet, //指定请求方法为GETPath: "/hello/world", //定义请求路径。Handler: func(writer http.ResponseWriter, request *http.Request) { // 处理函数httpx.OkJson(writer, "Hello World!") //返回一个Hello World!的json信息},})
启动服务
s.Start()//启动HTTP服务器,开始监听和处理传入的请求。
4.go-zero服务执行流程
-
启动服务器: 通常在
main.go
中,您会初始化rest.Server
实例,并调用RegisterHandlers
函数来注册路由。 -
路由注册: 在
RegisterHandlers
中调用AddRoutes
方法来将路由添加到服务器。这里注册的路由将用于处理特定的 HTTP 请求。 -
接收请求: 当客户端发送一个请求到 服务器会根据路径和请求方法查找对应的路由。
-
调用处理程序: 如果找到匹配的路由,服务器将会调用
UserHandler(serverCtx)
。这个处理程序通常会接收http.ResponseWriter
和*http.Request
参数。 -
执行业务逻辑: 在
UserHandler
函数内部,使用serverCtx
访问全局配置、并执行相应的业务逻辑。 -
返回响应: 最后,处理程序会通过
http.ResponseWriter
返回相应的 HTTP 响应,包括设置状态码、响应头和响应体。