go-zero(一) 介绍和使用

news2024/11/19 15:58:45

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等

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 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 服务:

go run hello.go

使用 Postman 或 curl 进行 API 测试。

在这里插入图片描述

3.代码简单分析

初始化配置

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

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

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

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

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

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

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

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,   //指定请求方法为GET
		Path:   "/hello/world",   //定义请求路径。
		Handler: func(writer http.ResponseWriter, request *http.Request) { 				// 处理函数
			httpx.OkJson(writer, "Hello World!")   //返回一个Hello World!的json信息
		},
	})

启动服务

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 响应,包括设置状态码、响应头和响应体。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2243482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3. Sharding-Jdbc核⼼流 程+多种分⽚策略

1. Sharding-Jdbc 分库分表执⾏核⼼流程 Sharding-JDBC执行流程 1. SQL解析 -> SQL优化 -> SQL路由 -> SQL改写 -> SQL执⾏-> 结果归并 ->返回结果简写为:解析->路由->改写->执⾏->结果归并1.1 SQL解析 1. SQL解析过程分为词法解析…

编程之路,从0开始:结构体详解

目录 前言 正文 1、结构体引入 2、结构体的声明 3、typedef 4、结构体的匿名声明 5、结构的自引用 (1)链表 (2)自引用 6、结构体内存对齐 (1)对齐规则 (2)题目 &#x…

01_MinIO部署(Windows单节点部署/Docker化部署)

单节点-Windows环境安装部署 在Windows环境安装MinIO,主要包含两个东西: MinIO Server(minio.exe):应用服务本身MinIO Client(mc.exe):MinIO客户端工具(mc)…

qt5半成品飞机大战小游戏

最近在学Qt,心血来潮做了个飞机大战小游戏,由于一些资源比较难找,就做了个半成品。效果图如下: 目前已做功能:人物飞机的自由移动,子弹的发射,子弹与敌机的物体碰撞,碰撞特效。 缺少功能&#x…

html 图片转svg 并使用svg路径来裁剪html元素

1.png转svg 工具地址: Vectorizer – 免费图像矢量化 打开svg图片,复制其中的path中的d标签的路径 查看生成的svg路径是否正确 在线SVG路径预览工具 - UU在线工具 2.在html中使用svg路径 <svg xmlns"http://www.w3.org/2000/svg" width"318px" height…

Android OpenGL ES详解——几何着色器

目录 一、概念 1、图元 2、几何着色器 1、输入类型 2、输出类型 3、输出顶点数量最大值限制 二、使用几何着色器 三、应用举例——造几个房子 四、应用举例——爆破物体 1、获取法向量 2、显示法线 五、应用举例——细分三角形 六、应用举例——广告牌技术 一、概…

基因组之全局互作热图可视化

引言 PlotHiC 是一个专为 Hi-C 数据可视化分析而设计的 Python 包。Hi-C 技术是一种能够检测染色体三维结构的实验方法&#xff0c;它能揭示 DNA 在细胞核内的三维组织结构。为了更好地展示和解释这些复杂的数据&#xff0c;PlotHiC[1] 可以帮助用户方便地绘制Hi-C 数据的热图。…

JVM详解:类的加载过程

JVM中类的加载主要分为三个部分&#xff0c;分别为加载&#xff08;loading&#xff09;&#xff0c;链接&#xff08;linking&#xff09;&#xff0c;初始化&#xff08;initing&#xff09;。其中加载负责的主要是讲类文件加载到内存中变为类对象&#xff0c;不过此时只有基…

FPGA开发流程

注&#xff1a;开发板&#xff1a;小梅哥的ACX720。本实验可直接运行在小梅哥的ACX720开发板上&#xff0c;后续的实验都可直接运行在小梅哥的ACX720上。 一、打开VIVADO并创建工程 1、双击VIVADO图标&#xff0c;打开vivado。 2、打开vivado界面打&#xff0c;点击有 Create …

免费开源!DBdoctor推出开源版系统诊断工具systool

​前言 在开发和运维过程中&#xff0c;经常会遇到难以定位的应用问题&#xff0c;我们通常需要借助Linux系统资源监控工具来辅助诊断。然而&#xff0c;系统的IO、网络、CPU使用率以及文件句柄等信息通常需要通过多个独立的命令工具来获取。在没有部署如Prometheus这样的综合…

Restful API接⼝简介及为什么要进⾏接⼝压测

一、RESTful API简介 在现代Web开发中&#xff0c;RESTful API已经成为一种标准的设计模式&#xff0c;用于构建和交互网络应用程序。本文将详细介绍RESTful API的基本概念、特点以及如何使用它来设计高效的API接口。 1. 基于协议 HTTP 或 HTTPS RESTful API通常使用HTTP&am…

R语言统计分析与MATLAB数学建模书籍推荐

文章目录 一、《R语言统计分析与可视化》1.1 内容核心1.2 内容简介 二、《MATLAB数学建模从入门到精通》2.1 关键点2.2 内容简介2.3 作者简介 一、《R语言统计分析与可视化》 R语言统计分析与可视化从入门到精通。学R语言、练语法、取数据、预处理、可视化、回归分析、方差分析…

智慧社区平台系统提升物业管理效率与居民生活质量

内容概要 智慧社区平台系统是为应对现代城市管理挑战而诞生的重要工具。随着城市化进程的加快&#xff0c;传统的物业管理方式已经难以满足日益增长的居民需求和管理复杂性。因此&#xff0c;引入智能化管理手段显得尤为重要。这个系统不仅仅是一个简单的软件&#xff0c;它是…

【ASR技术】WhisperX安装使用

介绍 WhisperX 是一个开源的自动语音识别&#xff08;ASR&#xff09;项目&#xff0c;由 m-bain 开发。该项目基于 OpenAI 的 Whisper 模型&#xff0c;通过引入批量推理、强制音素对齐和语音活动检测等技术。提供快速自动语音识别&#xff08;large-v2 为 70 倍实时&#xf…

STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组

STM32CUBEIDE FreeRTOS操作教程&#xff08;九&#xff09;&#xff1a;eventgroup事件标志组 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为…

力扣(leetcode)题目总结——动态规划篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏&#xff1a;点击进入 leetcode题目分类 关注走一波 前言&#xff1a;本系列文章初衷是为了按类别整理出力扣&#xff08;leetcode&#xff09;最经典题目&#xff0c…

计算器的实现

计算器的实现 计算器实现思路 我们⽇常写的计算表达式都是中缀表达式&#xff0c;也就是运算符在中间&#xff0c;运算数在两边&#xff0c;但是直接读取⽆ 法⻢上进⾏运算因为⼀个计算表达式还涉及运算符优先级问题。如&#xff1a; 都⽆法运算&#xff0c;因为后⾯还有括号优…

Python蓝桥杯刷题1

1.确定字符串是否包含唯一字符 题解&#xff1a;调用count函数计算每一个字符出现的次数&#xff0c;如果不等于1就输出no&#xff0c;并且结束循环&#xff0c;如果等于1就一直循环直到计算到最后一个字符&#xff0c;若最后一个字符也满足条件&#xff0c;则输出yes import…

《基于 PySpark 的电影推荐系统分析及问题解决》

以下是一篇关于上述代码的博客文章&#xff1a; 基于PySpark的电影推荐系统实现与分析 在当今数字化时代&#xff0c;个性化推荐系统在各个领域中都发挥着至关重要的作用&#xff0c;尤其是在娱乐行业&#xff0c;如电影推荐。本文将详细介绍如何使用PySpark构建一个简单的电…

每天五分钟深度学习pytorch:批归一化全连接网络完成手写字体识别

本文重点 前面我们学习了普通的全连接神经网络,后面我们学习了带有激活层的全连接神经网络,本文我们继续进一步升级,我们学习带有批归一化的全连接神经网络,批归一化可以加快神经网络的训练速度,减少过拟合,具体它的原理,大家可以看我们的《每天五分钟深度学习》专栏,…