go-zero(一) 介绍和使用

go-zero 介绍和使用

一、什么是 go-zero?

go-zero 是一个基于 Go 语言的微服务框架,提供了高效、简单并易于扩展的 API 设计和开发模式。它主要目的是为开发者提供一种简单的方式来构建和管理云原生应用。

1.go-zero 的核心特性

  1. 高性能

    • go-zero 采用了 Go 语言的高并发特性,具有很高的性能,适合处理大量请求。
  2. 代码生成

    • 通过 goctl 工具,开发者可以根据定义的 API 规范自动生成相应的代码,包括路由、处理逻辑、数据模型等,提高开发效率。
  3. 微服务架构

    • 适合构建微服务架构的应用,支持服务的拆分、组合及独立开发部署。
  4. 中间件支持

    • 提供了灵活的中间件机制,可以用于日志、认证、限流、跨域等功能。
  5. 丰富的文档与社区支持

    • 提供完善的文档和示例,社区活跃,易于获取支持。

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等

bash 复制代码
go install github.com/zeromicro/go-zero/tools/goctl@latest

2. 安装 protoc

protoc 用来根据 proto 文件生成RPC代码

bash 复制代码
goctl env check --install --verbose --force

3. 安装 go-zero

使用以下命令安装 go-zero:

bash 复制代码
go get -u github.com/zeromicro/go-zero

三、构建第一个 API

1.hello word

在实际开发中,我们通常是根据 API 文件,使用 goctl 工具生成项目代码。为更好地了解 Go-Zero 的执行过程,我们首先使用 Go-Zero 创建一个简单的 HTTP 服务,输出一个 Hello World。。

创建一个hellowrod 目录,先创建hello.yaml的配置文件

yaml 复制代码
Name: HelloWorld.api  # 服务名
Host: 127.0.0.1     # host地址
Port: 8080   #端口

然后创建 hello.go 文件:

go 复制代码
package main

import (
	"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 服务:

bash 复制代码
go run hello.go

使用 Postman 或 curl 进行 API 测试。

3.代码简单分析

初始化配置

go 复制代码
var restConf rest.RestConf  //声明一个restConf变量,用于保存HTTP服务的配置

RestConf 是一个http服务配置结构体,在go-zero中具体实现为:

go 复制代码
RestConf struct {
		service.ServiceConf
		Host     string `json:",default=0.0.0.0"`
		Port     int
		/*
		省略掉未用到的参数
		*/
	}

需要注意的是,YAML 配置文件的字段名必须与结构体字段一致,但不区分大小写。

go-zero能够自动将配置文件解析到结构体中:

go 复制代码
	conf.MustLoad("helloword/hello.yaml", &restConf) //加载并解析配置文件hello.yaml

从go-zero代码中可以看到 ,它支持jsontomlyamlyml等四种格式。

go 复制代码
var (
	fillDefaultUnmarshaler = mapping.NewUnmarshaler(jsonTagKey, mapping.WithDefault())
	loaders                = map[string]func([]byte, any) error{
		".json": LoadFromJsonBytes,
		".toml": LoadFromTomlBytes,
		".yaml": LoadFromYamlBytes,
		".yml":  LoadFromYamlBytes,
	}
)

创建HTTP服务器

go 复制代码
`s, err := rest.NewServer(restConf)`//使用加载的配置创建新的HTTP服务器实例

添加路由

例如,以是一个简单的路由实现:

go 复制代码
s:= rest.NewServer()
s.AddRoutes(routes) // routes 是定义好的路由
s.Start() 

go-zero 支持 RESTful 路由方式,可以在路由中定义处理的 HTTP 方法(GET、POST 等)。

go 复制代码
	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信息
		},
	})

启动服务

go 复制代码
s.Start()//启动HTTP服务器,开始监听和处理传入的请求。

4.go-zero服务执行流程

  1. 启动服务器 : 通常在 main.go 中,您会初始化 rest.Server 实例,并调用 RegisterHandlers 函数来注册路由。

  2. 路由注册 : 在 RegisterHandlers 中调用 AddRoutes 方法来将路由添加到服务器。这里注册的路由将用于处理特定的 HTTP 请求。

  3. 接收请求: 当客户端发送一个请求到 服务器会根据路径和请求方法查找对应的路由。

  4. 调用处理程序 : 如果找到匹配的路由,服务器将会调用 UserHandler(serverCtx)。这个处理程序通常会接收 http.ResponseWriter*http.Request 参数。

  5. 执行业务逻辑 : 在 UserHandler 函数内部,使用 serverCtx 访问全局配置、并执行相应的业务逻辑。

  6. 返回响应 : 最后,处理程序会通过 http.ResponseWriter 返回相应的 HTTP 响应,包括设置状态码、响应头和响应体。

相关推荐
Iceberg_wWzZ9 分钟前
C++(Day35)
开发语言·c++
mit6.82414 分钟前
[Docker#8] 容器配置 | Mysql | Redis | C++ | 资源控制 | 命令对比
linux·后端·docker·云原生·架构
江河湖海20 分钟前
2. 用JavaScript和Node.js实现一个简单的聊天应用
开发语言·javascript·node.js
Want59524 分钟前
Python绘制雪花
开发语言·python
潜洋29 分钟前
掌握 Spring Boot 的最佳方法 – 学习路线图
java·spring boot·后端·学习
weixin_4284984932 分钟前
Lua资料
开发语言·lua
Peter_chq44 分钟前
【计算机网络】协议定制
linux·c语言·开发语言·网络·c++·后端·网络协议
_小柏_1 小时前
C/C++基础知识复习(19)
c语言·开发语言·c++
江凡心1 小时前
Qt 每日面试题 -10
开发语言·qt·学习·面试
灼华十一1 小时前
算法编程题-golang语言协程池
算法·面试·golang