go-zero入门

本文简单介绍了go-zero,以及go-zero相关的安装配置。通过go-zero的hello world级别的一个的单体应用和一个包含两个服务的微服务应用,以实践的方式展示了go-zero项目的入门级搭建。

文章目录

      • 1. 简介
      • 2. 快速开发单体应用
      • 3. 微服务应用搭建
        • 3.1 用户服务 user rpc
        • 3.2 订单服务order api
        • 3.3 启动项目

1. 简介

https://go-zero.dev/
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。
go-zero 包含极简的 API定义和生成工具 goctl,可以根据定义的 api 文件一键生成 Go,ios,Android,Kotlin, Dart, TypeScript, JavaScript 代码,并可直接运行。

goctl -h
A cli tool to generate api, gRPC, model codeGitHub: https://github.com/zeromicro/go-zero
Site:   https://go-zero.devUsage:goctl [command]Available Commands:api               Generate api related filesbug               Report a bugcompletion        Generate the autocompletion script for the specified shelldocker            Generate Dockerfileenv               Check or edit goctl environmenthelp              Help about any commandkube              Generate kubernetes filesmigrate           Migrate from tal-tech to zeromicromodel             Generate model codequickstart        quickly start a projectrpc               Generate rpc codetemplate          Template operationupgrade           Upgrade goctl to latest versionFlags:-h, --help      help for goctl-v, --version   version for goctlUse "goctl [command] --help" for more information about a command.

架构图如下:
image.png

2. 快速开发单体应用

在上一节安装gRPC相关包的基础上

  1. 新建项目go_zero_demo
  2. go基础配置
go env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn,direct

检查配置

$ go env GO111MODULE
on
$ go env GOPROXY
https://goproxy.cn,direct
  1. 在项目目录通过下面命令安装
go get -u github.com/zeromicro/go-zero@latest
  1. 安装goctl、确保goctl可执行
go install github.com/zeromicro/go-zero/tools/goctl@latest
  1. 快速生成api服务
goctl api new hellocd hellogo mod tidygo run hello.go -f .\etc\hello-api.yaml

测试访问:http://localhost:8888/from/you
修改 /logic/hellologic.go

package logicimport ("context""go_zero_demo/hello/internal/svc""go_zero_demo/hello/internal/types""github.com/zeromicro/go-zero/core/logx"
)type HelloLogic struct {logx.Loggerctx    context.ContextsvcCtx *svc.ServiceContext
}func NewHelloLogic(ctx context.Context, svcCtx *svc.ServiceContext) *HelloLogic {return &HelloLogic{Logger: logx.WithContext(ctx),ctx:    ctx,svcCtx: svcCtx,}
}func (l *HelloLogic) Hello(req *types.Request) (resp *types.Response, err error) {// todo: add your logic here and delete this linereturn &types.Response{Message: "hello, go-zero",}, nil
}

image.png

3. 微服务应用搭建

假设我们在开发一个商城项目,而开发者小明负责用户模块(user)和订单模块(order)的开发,我们姑且将这两个模块拆分成两个微服务
演示功能目标

  • 订单服务(order)提供一个查询接口
  • 用户服务(user)提供一个方法供订单服务获取用户信息

根据情景提要我们可以得知,订单是直接面向用户,通过http协议访问数据,而订单内部需要获取用户的一些基础数据,既然我们的服务是采用微服务的架构设计,那么两个服务(user,order)就必须要进行数据交换,服务间的数据交换即服务间的通讯,到了这里,采用合理的通讯协议也是一个开发人员需要考虑的事情,可以通过http,rpc等方式来进行通讯,这里我们选择rpc来实现服务间的通讯,相信这里我已经对"rpc服务存在有什么作用?"已经作了一个比较好的场景描述。当然,一个服务开发前远不止这点设计分析,我们这里就不详细描述了。从上文得知,我们
需要一个

  • user rpc
  • order api

两个服务来初步实现这个小demo。

3.1 用户服务 user rpc
  1. 创建相应文件目录,创建proto文件并写入代码:

image.png

syntax = "proto3";package template;option go_package = "./user";message IdRequest {string id = 1;
}message UserResponse {string id = 1;string name = 2;string gender = 3;
}service User {rpc getUser(IdRequest) returns(UserResponse);
}
  1. 执行命令生成代码
cd mall\user\rpcgoctl rpc protoc user.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.

image.png

  1. 完善rpc服务端业务逻辑

这里提供给订单服务调用时返回用户id为1,名字是acezsq
image.png

3.2 订单服务order api
  1. 回到go_zero_demo/mall目录
  2. 创建order api服务目录
mkdir -p order/apicd order/api
  1. 添加api文件order.api
type(OrderReq {Id string `path:"id"`}OrderReply {Id string `json:"id"`Name string `json:"name"`}
)service order {@handler getOrderget /api/order/get/:id (OrderReq) returns (OrderReply)
}  
  1. 返回go_zero_demo\mall\order\api目录执行命令生成api服务代码
goctl api go -api order.api -dir .

image.png

  1. 配置etcd的服务发现

修改config文件
image.png
修改order.yaml文件,用于服务发现
image.png

  1. 将user用户服务的service添加到order订单服务image.png
  2. 完善业务逻辑

oder服务通过rpc获取user用户信息,然后进行处理
image.png

3.3 启动项目
  1. 启动etcd
  2. 启动用户服务

进入user目录的user.go

go mod tidy
go run user.go -f etc/user.yaml

image.png

  1. 启动订单服务

进入订单目录的order.go

go run order.go -f etc/order.yaml

image.png
在浏览器中访问订单服务
image.png
image.png
完整的项目代码链接:https://github.com/acezsq/go_zero_demo

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

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

相关文章

一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读书籍【送书活动】

目录 前言一、内容简介二、作者简介三、专家推荐四、读者对象五、目录福利总结 前言 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景,在多项专业和学术基准测试中表现出的智力水平,不仅接近甚至有时超越了人类的平均水平…

【Docker】Windows11操作系统下安装、使用Docker保姆级教程

【Docker】Windows11操作系统下安装、使用Docker保姆级教程 大家好 我是寸铁👊 总结了一篇【Docker】Windows11操作系统下安装、使用Docker保姆级教程的文章✨ 喜欢的小伙伴可以点点关注 💝 前言 什么是 Docker? Docker 是一个开源平台&…

linux实现远程文件夹共享-samba

目录 问题描述Samba如何挂载常用参数临时挂载实例一种长期挂载方法(已失败,仅供参考)查看挂载取消挂载umount失败 问题描述 我的代码需要访问存在于两个系统(win和linux)的文件夹,我不是文件夹的创建者&am…

中国电子学会(CEIT)2023年09月真题C语言软件编程等级考试二级(含解析答案)

中国电子学会(CEIT)考评中心历届真题(含解析答案) C语言软件编程等级考试二级 2023年09月 编程题五道 总分:100分一、数组指定部分逆序重放(20分) 将一个数组中的前k项按逆序重新存放。例如,将数组8、6、5、4、1,前3项逆序重放得到5、6、8、4、1。 时间限制: 1…

STM32基础--什么是寄存器

STM32 长啥样 我使用的芯片是 144pin 的 STM32F103ZET6,具体见图 STM32F103ZET6 实物图。这个就是我们接下来要学习的 STM32,它将带领我们进入嵌入式的殿堂。芯片正面是丝印,ARM 应该是表示该芯片使用的是 ARM 的内核,STM32F103Z…

【操作系统学习笔记】文件管理2.4

【操作系统学习笔记】文件管理2.4 参考书籍: 王道考研 视频地址: Bilibili 缓冲区管理 介绍 缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区有。使用硬件作为缓冲区的成本较高,容量也较小,一般仅用…

three.js如何实现简易3D机房?(一)基础准备-上

目录 一、tips 二、功能说明 1.模型初始化 2.功能交互 三、初始化准备 1.目录结构 2.创建三要素 3.创建轨道控制器 4.初始化灯光 5.适配 6.循环渲染 一、tips 1.three.js入门的相关基础性知识就不在此过多赘述了,可以自行提前了解 three.js docs&…

Pytest框架中的测试用例执行方式!

前言 本文将针对pytest的核心特性之一——测试用例的执行方式展开深入探讨,并通过详尽的实战示例展示如何在不同环境下灵活操控测试运行,同时全面解析pytest中常见的且极具实用价值的命令行选项。 一、从基础到进阶:pytest在命令行下的测试用…

苹果电脑专业的Mac垃圾清理工具CleanMyMac X4.14.7

CleanMyMac X是一款专业的Mac清理工具,它具有强大的功能和易用的界面,可以帮助用户快速清理Mac上的无用文件和垃圾,优化系统性能,提升电脑运行速度。 该软件的核心功能包括智能扫描与清理、应用程序管理、隐私保护和系统维护等。…

LeetCode217. Contains Duplicate

文章目录 一、题目二、题解 一、题目 Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct. Example 1: Input: nums [1,2,3,1] Output: true Example 2: Input: nums [1,2,3,4…

简单介绍SpeechPrompt、SpeechPrompt V2、SpeechGen

主要介绍SpeechPrompt、SpeechPrompt V2、SpeechGen SpeechPrompt 模型结构和原理(语音到符号) 整体思路:音频特征提取(HuBert/CPC),离散–》deep prompt speechLM(GSLM)—》概率映射–>目标Verbaliz…

代码随想录刷题笔记-Day28

1. 重新安排行程 332. 重新安排行程https://leetcode.cn/problems/reconstruct-itinerary/给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯…

计算题--时标网络图

时标网络图相当于是双代号网络图和横道图的结合体,特点是多了虚线和波浪线〰️,虚线代表虚工作(只能竖着画),波浪线代表自由时差(横着画)。 在时标网络图中 找关键路径,没有波浪线的…

07_mdioLinux内核模块

01_basicLinux内核模块-CSDN博客文章浏览阅读316次&#xff0c;点赞3次&#xff0c;收藏3次。环境IDubuntuMakefilemodules:clean:basic.creturn 0;运行效果。https://blog.csdn.net/m0_37132481/article/details/136157384my_mdio.c #include <linux/kernel.h> #includ…

【数据结构与算法】深入浅出:单链表的实现和应用

&#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 目录 前言 单链表的基本概念 节点 头节点 尾节点 单链表的基本操作 创建单链表 头插法&#xff1a; 尾插法&#…

【数据结构】 简单认识包装类与泛型

文章目录 包装类基本数据类型和对应的包装类拆箱和装箱自动装箱和自动拆箱包装类面试题 什么是泛型为什么要使用泛型泛型类的创建语法泛型类的使用语法示例类型推导(Type Inference) 裸类型(Raw Type)泛型如何编译的擦除机制为什么不能实例化泛型类型数组 泛型的上界语法示例复…

第五讲:使用blockscout对链上数据可视化

blockscout 拉代码&#xff1a; git clone gitgithub.com:blockscout/blockscout.git 启动docker&#xff1a; cd ./docker make start 进入blockscout网址&#xff1a; http://localhost 注意&#xff1a;blockscout默认会去 http://127.0.0.1:8545/ 查询以太坊信息&am…

论交谈中的不自觉要求及其影响

在人际交往的过程中&#xff0c;交谈作为一种基本而又复杂的沟通方式&#xff0c;往往伴随着各种未明示的要求与期待。实际上&#xff0c;人们在谈话中经常不自觉地对他人的行为或思想提出要求&#xff0c;这种现象虽常见却容易被忽视&#xff0c;它不仅影响了交流的有效性&…

【C语言】Leetcode 876. 链表的中间节点

主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《Leetcode》 题目 通过题目的要求可以判断出有两种示例要解决&#xff0c;一种是偶数节点的链表&#xff0c;一种是奇数节点的链表&#xff0c;应对这两种情况我们需要使程序对二者都可以兼容。 解决思路 struct ListNode…

03. Nginx入门-Nginx虚拟主机

Nginx虚拟主机简介 yum安装与源码安装一样&#xff0c;只是Nginx配置文件路径不一致&#xff0c;这里用的yum安装的配置文件路径。 利用虚拟主机的功能&#xff0c;可以在一台Nginx服务器上部署一个或多个虚拟主机。 虚拟主机主配置文件 注意&#xff1a;配置完成Nginx主配置…