Go-Zero 是一个开源的微服务开发框架,专注于提高 Go 语言项目的开发效率。该框架由美团点评开源,旨在解决微服务架构下常见的问题,如服务注册与发现、配置管理、服务调用等。它提供了一套完整的解决方案,包括微服务的开发、部署和监控等方面。
Go-Zero 的核心特点包括:
- 高性能:Go-Zero 使用了 Go 语言的高效特性,具有出色的性能表现。
- 易用性:Go-Zero 提供了丰富的组件和工具,使得微服务开发变得更加简单和高效。
- 一站式解决方案:Go-Zero 提供了服务注册与发现、配置管理、调用链监控、接口文档生成等一系列功能,使得开发者可以专注于业务逻辑而不必花费过多精力在基础设施上。
- 规范化:Go-Zero 遵循了一定的开发规范,使得团队合作更加顺畅,降低了项目维护的难度。
- 可扩展性:Go-Zero 的组件可以根据实际需求进行定制和扩展,适用于各种规模的项目。
总的来说,Go-Zero 是一个面向 Go 语言微服务开发的优秀框架,可以帮助开发者快速搭建和部署高性能、可靠的微服务应用。
Go微服务精讲:Go-Zero全流程实战即时通讯 - Go-Zero快速入门
开发 golang 程序,必然少不了对其环境的安装,我们这里选择以 1.16.13 为例。并且使用 Go Module 作为管理依赖的方式,与 PHP 中 composer 管理依赖类似。 首先安装 goctl(go control)工具:
goctl 是 go-zero 微服务框架下的代码生成工具。使用 goctl 可显著提升开发效率,让开发人员将时间重点放在业务开发上,其功能有:
api 服务生成 rpc 服务生成 model 代码生成 模板管理
Go 1.16 及以后版本
GOPROXY=goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest 通过此命令可以将 goctl 工具安装到 $GOPATH/bin 目录下。 我们以 api 服务为例进行操作,使用 go mod 安装:
// 创建项目目录 mkdir zero-demo cd zero-demo // 初始化go.mod文件 go mod init zero-demo // 快捷创建api服务 goctl api new greet // 安装依赖 go mod tidy // 复制依赖到vender目录 go mod vendor 到此一个简单的 api 服务就初始化完成了。 启动服务:
// 默认开启8888端口 go run greet/greet.go -f greet/etc/greet-api.yaml 代码分析 HTTP SERVER go 有自己实现的 http 包,大多 go 框架也是基于这个 http 包,所以看 go-zero 之前我们先补充或者复习下这个知识点。如下: GO 如何启动一个 HTTP SERVER
// main.go package main
import ( // 导入net/http包 "net/http" )
func main() { // ------------------ 使用http包启动一个http服务 方式一 ------------------ // *http.Request http请求内容实例的指针 // http.ResponseWriter 写http响应内容的实例 http.HandleFunc("/v1/demo", func(w http.ResponseWriter, r *http.Request) { // 写入响应内容 w.Write([]byte("Hello World !n")) }) // 启动一个http服务并监听8888端口 这里第二个参数可以指定handler http.ListenAndServe(":8888", nil) }
// 测试我们的服务 // -------------------- // 启动:go run main.go // 访问: curl "http://127.0.0.1:8888/v1/demo" // 响应结果:Hello World ! ListenAndServe 是对 http.Server 的进一步封装,除了上面的方式,还可以使用 http.Server 直接启服务,这个需要设置 Handler,这个 Handler 要实现 Server.Handler 这个接口。当请求来了会执行这个 Handler 的 ServeHTTP 方法,如下:
// main.go package main
// 导入net/http包 import ( "net/http" )
// DemoHandle server handle示例 type DemoHandle struct { }
// ServeHTTP 匹配到路由后执行的方法 func (DemoHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello World !n")) }
func main() { // ------------------ 使用http包的Server启动一个http服务 方式二 ------------------ // 初始化一个http.Server server := &http.Server{} // 初始化handler并赋值给server.Handler server.Handler = DemoHandle{} // 绑定地址 server.Addr = ":8888"