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等

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代码中可以看到 ,它支持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,   //指定请求方法为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服务执行流程

  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.rhkb.cn/news/474763.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Orcad 输出有链接属性的PDF

安装adobe pdf安装Ghostscript修改C:\Cadence\SPB_16.6\tools\capture\tclscripts\capUtils\capPdfUtil.tcl ​ 设置默认打印机为 Adobe PDF ​ 将Ghostscript的路径修改正确 打开cadence Orcad ,accessories->candece Tcl/Tk Utilities-> Utilities->PD…

.NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】

一、使用VSCode开发.NET项目 1、创建文件夹,使用VSCode打开 2、安装扩展工具 1>C# 2>安装NuGet包管理工具,外部dll包依靠它来加载 法1》:NuGet Gallery,注意要启动科学的工具 法2》NuGet Package Manager GUl&#xff0c…

#define定义宏(3)

大家好,今天来给大家介绍一下宏实现的原理以及缺点,还有宏和函数的一些区别(下一期给大家详细介绍宏和函数的区别),那么话不多说,我们现在开始。 1.宏和参数不是计算之后传进去,而是替换进去的…

AJAX笔记 (速通精华版)

AJAX(Asynchronous Javascript And Xml) 此笔记来自于动力节点最美老杜 传统请求及缺点 传统的请求都有哪些? 直接在浏览器地址栏上输入URL。点击超链接提交 form 表单使用 JS 代码发送请求 window.open(url)document.location.href urlwi…

3D Gaussian Splatting 代码层理解之Part2

现在让我们来谈谈高斯分布。我们已经在Part1介绍了如何根据相机的位置获取 3D 点并将其转换为 2D。在本文中,我们将继续处理高斯泼溅的高斯部分,这里用到的是代码库 GitHub 中part2。 我们在这里要做的一个小改动是,我们将使用透视投影,它利用与上一篇文章中所示的内参矩阵…

【YOLOv8】安卓端部署-2-项目实战

文章目录 1 准备Android项目文件1.1 解压文件1.2 放置ncnn模型文件1.3 放置ncnn和opencv的android文件1.4 修改CMakeLists.txt文件 2 手机连接电脑并编译软件2.1 编译软件2.2 更新配置及布局2.3 编译2.4 连接手机 3 自己数据集训练模型的部署4 参考 1 准备Android项目文件 1.1…

进程其他知识点

/* #include <stdlib.h> void exit(int status); #include <unistd.h> void _exit(int status); status 参数&#xff1a;是进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取到。 */ #include <stdio.h> #include <stdlib.h> #include &…

深度解析FastDFS:构建高效分布式文件存储的实战指南(上)

文章目录 一、FastDFS简介1.1 概述1.2 特性 二、FastDFS原理架构2.1 FastDFS角色2.2 存储策略2.3 上传过程2.4 文件同步2.5 下载过程 三、FastDFS适用场景四、同类中间件对比4.1 FastDFS和集中存储方式对比4.2 FastDFS与其他文件系统的对比 五、FastDFS部署5.1 单机部署5.1.1 使…

hhdb数据库介绍(9-21)

计算节点参数说明 checkClusterBeforeDnSwitch 参数说明&#xff1a; PropertyValue参数值checkClusterBeforeDnSwitch是否可见否参数说明集群模式下触发数据节点高可用切换时&#xff0c;是否先判断集群所有成员正常再进行数据节点切换默认值falseReload是否生效是 参数设…

每日一练:【动态规划算法】斐波那契数列模型之第 N 个泰波那契数(easy)

1. 第 N 个泰波那契数&#xff08;easy&#xff09; 1. 题目链接&#xff1a;1137. 第 N 个泰波那契数 2. 题目描述 3.题目分析 这题我们要求第n个泰波那契Tn的值&#xff0c;很明显的使用动态规划算法。 4.动态规划算法流程 1. 状态表示&#xff1a; 根据题目的要求及公…

网页抓取API,让数据获取更简单

网页抓取的过程通常分为以下步骤&#xff0c;尤其是在面对静态网页时&#xff1a; 获取页面 HTML&#xff1a;使用 HTTP 客户端下载目标页面的 HTML 内容。解析 HTML&#xff1a;将下载的 HTML 输入解析器&#xff0c;准备提取内容。提取数据&#xff1a;利用解析器功能&#…

D3中颜色的表示方法大全

d3-color 是 D3.js 库中的一个模块&#xff0c;用于处理颜色。它提供了多种方式来表示和操作颜色。下面是一些常见的颜色表示方法及示例代码&#xff1a; 1. CSS颜色关键字 CSS 颜色关键字是一种简单的方式来指定颜色。例如&#xff1a; const color d3.color("steelbl…

IDEA2023 创建SpringBoot项目(一)

一、Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。 二、快速开发 1.打开IDEA选择 File->New->Project 2、…

下一代以区域为导向的电子/电气架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

详细解析STM32 GPIO引脚的8种模式

目录 一、输入浮空&#xff08;Floating Input&#xff09;&#xff1a;GPIO引脚不连接任何上拉或下拉电阻&#xff0c;处于高阻态 1.浮空输入的定义 2.浮空输入的特点 3.浮空输入的应用场景 4.浮空输入的缺点 5.典型配置方式 6.注意事项 二、输入上拉&#xff08;Inpu…

第8章 硬件维护-8.6 产品变更管理(PCN)

8.6 产品变更管理&#xff08;PCN&#xff09; PCN是Product Change Notice&#xff08;产品变更管理&#xff09;的缩写。PCN是厂商为了提高质量、降低成本主动向客户发起的产品变更。一般涉及如下变更的&#xff0c;需要发布PCN公告。 &#xff08;1&#xff09;生产地址变更…

关于安卓模拟器或手机设置了BurpSuite代理和安装证书后仍然抓取不到APP数据包的解决办法

免责申明 本文仅是用于学习研究安卓系统设置代理后抓取不到App数据包实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法时习之丨网络安全在身边一…

【小程序】dialog组件

这个比较简单 我就直接上代码了 只需要传入title即可&#xff0c; 内容部分设置slot 代码 dialog.ttml <view class"dialog-wrapper" hidden"{{!visible}}"><view class"mask" /><view class"dialog"><view …

问:Spring MVC DispatcherServlet流程步骤梳理

DispatcherServlet是Spring MVC框架中的核心组件&#xff0c;负责接收客户端请求并将其分发到相应的控制器进行处理。作为前端控制器&#xff08;Front Controller&#xff09;的实现&#xff0c;DispatcherServlet在整个请求处理流程中扮演着至关重要的角色。本文将探讨Dispat…

uni-app快速入门(十)--常用内置组件(下)

本文介绍uni-app的textarea多行文本框组件、web-view组件、image图片组件、switch开关组件、audio音频组件、video视频组件。 一、textarea多行文本框组件 textarea组件在HTML 中相信大家非常熟悉&#xff0c;组件的官方介绍见&#xff1a; textarea | uni-app官网uni-app,un…