当前位置: 首页 > news >正文

go-zero学习及使用中遇到的问题

go-zero学习及使用中遇到的问题

  • 1 go-zero入门--单体服务demo
    • 1.1 单体服务【官方示例】
      • 1.1.1 创建greet服务
      • 1.1.2 目录结构
      • 1.1.3 编写逻辑
      • 1.1.4 启动并访问服务
    • 1.2 修改GET入参
      • 1.2.1 去除options限制的入参值
      • 1.2.2 重启并访问服务
    • 1.3 添加post请求【新增方法】
      • 1.3.1 修改 `greet/greet.api` 文件
      • 1.3.2 重新生成代码
      • 1.3.3 修改`logic/greetpostlogic.go`文件
      • 1.3.4 重启并访问服务
  • 2 go-zero入门--微服务demo
    • 2.1 新建微服务
    • 2.2 API接口模块添加后端模块
  • 3 go-zero 框架下swagger使用
  • 4 goctl 相关命令整理
    • 4.1 .api生成swagger的命令
    • 4.2 .api生成api模块的命令
    • 4.3 .proto生成rpc模块的命令
    • 4.4 sql文件生成model的命令
    • 4.5 docker启动swagger的命令
  • #####################################################
  • 1 field name set
  • 2 greet.api line 25:1 expecting 'http method', found input '@handler'

1 go-zero入门–单体服务demo

参考1:go-zero入门–单体服务demo
推荐先阅读参考1。

1.1 单体服务【官方示例】

1.1.1 创建greet服务

goctl api new greet

1.1.2 目录结构

.
├── go.mod
├── go.sum
├── etc
│   └── greet-api.yaml
├── greet.api
├── greet.go
└── internal├── config│   └── config.go├── handler│   ├── greethandler.go│   └── routes.go├── logic│   └── greetlogic.go├── svc│   └── servicecontext.go└── types└── types.go

1.1.3 编写逻辑

greet/internal/logic/greetlogic.go

func (l *GreetLogic) Greet(req *types.Request) (resp *types.Response, err error) {// todo: add your logic here and delete this linereturn &types.Response{Message: "Hello go-zero:" + req.Name,}, nil
}

1.1.4 启动并访问服务

启动:在greet目录下执行:

go run greet.go -f etc/greet-api.yaml

访问:http://localhost:8888/from/you

注意

  1. 端口的设置是在etc/greet-api.yaml中。
  2. 访问地址中的最后资源只能是youme,否则会报错,这个是在 greet.api 中配置的。

1.2 修改GET入参

1.2.1 去除options限制的入参值

  1. 修改greet/greet.api文件
type Request {Name string `path:"name,options=you|me"`
}

改为

type Request {Name string `path:"name"`
}
  1. 重新生成代码
cd ~/go-zero-single_demo/greet
goctl api go -api greet.api -dir . -style gozero

注意:执行完goctl后会重新生成以下文件,如果没有新增的东西,可能会看不出来,具体可看执行日志。

  1. types/types.go
  2. handler/的文件
  3. logic/的文件

1.2.2 重启并访问服务

重启:

go run greet.go -f etc/greet-api.yaml

访问:http://localhost:8888/from/哈哈

1.3 添加post请求【新增方法】

1.3.1 修改 greet/greet.api 文件

注意:service里的api必须是handler和访问接口一一对应,放在一起,否则会报错。可看 2 greet.api line 25:1 expecting 'http method', found input '@handler'

type Request {Name string `path:"name"`
}type Response {Message string `json:"message"`
}//1、post 方法的请求内容
type RequestJson {Name string `json:"name"`
}service greet-api {@handler GreetHandlerget /from/:name(Request) returns (Response)//2、post 方法的处理器@handler GreetPostHandlerpost /from/:name(RequestJson) returns (Response)
}

1.3.2 重新生成代码

cd ~/go-zero-single_demo/greet
goctl api go -api greet.api -dir . -style gozero

注意:执行完goctl后会重新生成以下文件。

  1. types/types.go
  2. handler/routes.go:增加了的访问接口的路由。

同时会新增以下文件:

  1. handler/greetposthandler.go
  2. logic/greetpostlogic.go

1.3.3 修改logic/greetpostlogic.go文件

func (l *GreetPostLogic) GreetPost(req *types.RequestJson) (resp *types.Response, err error) {// todo: add your logic here and delete this linereturn &types.Response{Message: "Hello go-zero name:" + req.Name,}, nil
}

1.3.4 重启并访问服务

重启:

cd ~/go-zero-single_demo/greet
go run greet.go -f etc/greet-api.yaml

POST方式访问:

POST http://127.0.0.1:8888/from/哈哈 HTTP/1.1
Content-Type: application/json
{"name":"post 哈哈"
}

返回结果:

{"message": "Hello go-zero name:post 哈哈"
}

2 go-zero入门–微服务demo

2.1 新建微服务

参考1:go-zero入门–微服务demo

2.2 API接口模块添加后端模块

API接口模块添加后端模块需要改动3个地方。

  1. etc/xxx.yaml
    主要是配置后端模块的Etcd服务发现。
    示例:
Name: order
Host: 0.0.0.0
Port: 8889
UserRpc:Etcd:Hosts:- 192.168.13.3:2379Key: user.rpc
  1. internal/config/config.go
    主要是配置后端调用的模块RPC。
    示例:
package configimport ("github.com/zeromicro/go-zero/rest""github.com/zeromicro/go-zero/zrpc"
)type Config struct {rest.RestConfUserRpc zrpc.RpcClientConf
}
  1. internal/svc/servicecontext.go
    主要是将 2 配置的后端服务模块加入到 API接口模块的ServiceContext中。
    示例:
package svcimport ("github.com/zeromicro/go-zero/zrpc""go-zero-micro-demo/mall/order/api/internal/config""go-zero-micro-demo/mall/user/rpc/userclient"
)type ServiceContext struct {Config  config.ConfigUserRpc userclient.User
}func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{Config:  c,UserRpc: userclient.NewUser(zrpc.MustNewClient(c.UserRpc)),}
}

3 go-zero 框架下swagger使用

参考1:goctl-swagger
看参考1 中README.md,里面有下载及使用的操作流程。

生成swagger.json文件的命令:

goctl api plugin -plugin goctl-swagger="swagger -filename user.json" -api user.api -dir .

4 goctl 相关命令整理

4.1 .api生成swagger的命令

示例:

goctl api plugin -plugin goctl-swagger="swagger -filename tracksourcetask.json" -api tracksourcetask.api -dir .

4.2 .api生成api模块的命令

示例:

goctl api go -api ./doc/admin.api -dir .

4.3 .proto生成rpc模块的命令

示例:

goctl rpc protoc tracksource.proto --go_out=./ --go-grpc_out=./ --zrpc_out=.

4.4 sql文件生成model的命令

goctl model mysql ddl -src="./rpc/doc/sql/appsystem/dsms*.sql" -dir="./rpc/model/appsystemodel"

4.5 docker启动swagger的命令

docker run -d -p 9981:8080 --name=swagger-tracksourcetask -v /root/doc:/tmp -e SWAGGER_FILE=/tmp/tracksourcetask-v2.json swaggerapi/swagger-editor

#####################################################


1 field name set

要修改设置结构体的变量,应该在greet.api中,然后再使用下面的命令生成对应的结构体和业务类。

goctl api go -api greet.api -dir . -style gozero

2 greet.api line 25:1 expecting ‘http method’, found input ‘@handler’

源码:

service greet-api {@handler GreetHandler@handler GreetCustomizedHandlerget /from/:name/:age(Request) returns (Response)get /customized/:address/:phone(CustomizedRequest) returns (CustomizedResponse)
}

错误写法:一个@handler对应一个api,但是两者需要紧挨着。@handler@handler放一块、apiapi放一块的写法是错误的。

正确写法:

service greet-api {@handler GreetHandlerget /from/:name/:age(Request) returns (Response)@handler GreetPostHandlerpost /from/:name(RequestJson) returns (Response)
}

相关文章:

go-zero学习及使用中遇到的问题

go-zero学习及使用中遇到的问题1 go-zero入门--单体服务demo1.1 单体服务【官方示例】1.1.1 创建greet服务1.1.2 目录结构1.1.3 编写逻辑1.1.4 启动并访问服务1.2 修改GET入参1.2.1 去除options限制的入参值1.2.2 重启并访问服务1.3 添加post请求【新增方法】1.3.1 修改 greet/…...

CCF-CSP认证 202303 500分题解

202303-1 田地丈量&#xff08;矩阵面积交&#xff09; 矩阵面积交x轴线段交长度*y轴线段交长度 线段交长度&#xff0c;相交的时候是min右端点-max左端点&#xff0c;不相交的时候是0 #include<bits/stdc.h> using namespace std; int n,a,b,ans,x,y,x2,y2; int f(in…...

板内盘中孔设计狂飙,细密间距线路中招

一博高速先生成员&#xff1a;王辉东大风起兮云飞扬&#xff0c;投板兮人心舒畅。赵理工打了哈欠&#xff0c;伸了个懒腰&#xff0c;看了看窗外&#xff0c;对林如烟说道&#xff1a;“春天虽美&#xff0c;但是容易让人沉醉。如烟&#xff0c;快女神节了&#xff0c;要不今晚…...

面试热点题:回溯算法 递增子序列与全排列 II

前言&#xff1a; 如果你一点也不了解什么叫做回溯算法&#xff0c;那么推荐你看看这一篇回溯入门&#xff0c;让你快速了解回溯算法的基本原理及框架 递增子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两…...

怎么找回回收站删除的文件

我们都知道&#xff0c;电脑文件都是放在桌面上的&#xff0c;单独存放或者一起存放在文件夹里。但总会有已用完或者是没用的文件&#xff0c;这让我们不得不对其进行清理。而清空回收站也是不可避免的。如果出现了清空文件中还有我们需要的文件&#xff0c;怎么找回回收站删除…...

dp-打家劫舍

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。给定一个代表每个房屋存放金额的非…...

C++预处理连接

目录定义常量字符串前缀定义枚举类型Boost C库中常常使用预处理连接来定义宏和模板类Google开源的C单元测试框架gtest&#xff0c;使用预处理连接技术创建测试用例和测试方法C预处理连接&#xff08;Preprocessor Concatenation&#xff09;是一种宏定义技巧&#xff0c;用于将…...

3、DRF实战总结:基于类的视图APIView, GenericAPIView和GenericViewSet视图集(附源码)

前面介绍了什么是符合RESTful规范的API接口&#xff0c;以及使用了基于函数的视图(FBV)编写了对文章进行增删查改的API。在本篇文章将使用基于类的视图(Class-based View, CBV)重写之前的接口。 参考&#xff1a; 1、Django开发总结&#xff1a;Django MVT与MVC设计模式&…...

AutoSAR PduR -AutoSAR PDU常用的使用方式【发送,接收,网关】

总目录链接==>> AutoSAR入门和实战系列总目录 @学前问答: AutoSAR PDU在哪里全局定义的? AutoSAR PDU涉及到哪些模块? AutoSAR PDU网关怎么使用? 文章目录 1 AutoSAR PDU发送2 AutoSAR PDU接收3 AutoSAR PDU网关转发4 答疑解析AutoSAR PDU 怎么样通过PduR 实现与其…...

瑟瑟发抖吧~OpenAI刚刚推出王炸——引入ChatGPT插件,开启AI新生态

5分钟学会使用ChatGPT 插件&#xff08;ChatGPT plugins&#xff09;——ChatGPT生态建设的开端ChatGPT插件是什么OpenAI最新官方blog资料表示&#xff0c;已经在ChatGPT中实现了对插件的初步支持。插件是专门为以安全为核心原则的语言模型设计的工具&#xff0c;可帮助ChatGPT…...

脉诊(切脉、诊脉、按脉、持脉)之法——入门篇

认识脉诊何谓脉诊&#xff1f;脉诊的渊源脉诊重要吗&#xff1f;脉诊确有其事&#xff0c;还是故弄玄虚&#xff1f;中医科学吗&#xff1f;如何脉诊&#xff1f;寸口脉诊法何谓脉诊&#xff1f; 所谓脉诊&#xff0c;就是通过把脉来诊断身体健康状况的一种必要手段。 …...

【十二天学java】day09常用api介绍

1.API 1.1API概述 什么是API API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需要学习这…...

软件测试 - 测试用例常见面试题

1.测试用例的要素测试用例是为了实施测试而向被测试的系统提供的一组集合, 这组集合包含 : 测试环境, 操作步骤, 测试数据, 预期结果等要素.例如 : 在 B 站输入框输入一个空格, 检查结果测试用例标题 : 输入框输入空格测试环境 : Windows 系统, 谷歌浏览器-版本 111.0.5563.65&…...

几种常见的API接口分页方案

文章目录1 概述2 分页方案2.1 基于偏移量2.2 基于游标3 重复数据处理3.1 基于时间3.2 基于热度3.3 基于推荐1 概述 列表是互联网产品中很常见的一种内容排列形式&#xff0c;而且列表的数据集往往成千上万&#xff0c;一次性返回全量数据集的场景几乎不存在&#xff0c;所以出…...

【Object 类的方法】

在 Java 中&#xff0c;所有类都继承了 Object 类&#xff0c;因此 Object 类中的方法可以在所有 Java 对象中使用。下面是 Object 类中的一些常用方法介绍&#xff1a; equals(Object obj): 用于判断两个对象是否相等。默认情况下&#xff0c;该方法比较的是两个对象的地址是…...

留用户、补内容,在线音乐暗战不停

在线音乐在人们的日常生活中扮演着愈发重要的角色&#xff0c;尤其是在面临巨大压力时&#xff0c;人们往往更倾向于通过倾听一段音乐来缓解内心的紧张与焦虑。而随着在线音乐用户数量的增长以及付费意愿的增强&#xff0c;在线音乐行业也实现了稳步发展。 经过多年的发展&…...

python--exec

在Python中&#xff0c;eval和exec都是用来执行动态代码的内置函数&#xff0c;但它们的作用和使用方式有所不同。 eval(): 将字符串作为Python表达式进行求值&#xff0c;并返回结果。 exec(): 将字符串作为Python语句进行执行&#xff0c;没有返回值。 eval()的使用范围通常限…...

干货分享!这6个高效率办公软件,总有一个值得你收藏!

分享6款高效办公软件&#xff0c;可以解决你很多需求&#xff0c;职场人一定要知道。每一款都是精挑细的&#xff0c;可能有的已经很大众了&#xff0c;但肯定还有小伙伴不知道&#xff0c;废话不多说&#xff0c;直接看&#xff01;&#xff01; 1、Flomo笔记&#xff1a;记录…...

代码随想录刷题-链表总结篇

文章目录链表理论基础单链表双链表循环链表其余知识点链表理论基础单链表双链表循环链表其余知识点移除链表元素习题我的解法虚拟头结点解法设计链表习题我的解法代码随想录代码反转链表习题双指针递归两两交换链表中的节点习题我的解法代码随想录解法删除链表的倒数第N个节点习…...

C++:指针:什么是野指针

野指针目录1&#xff1a;定义2&#xff1a;野指针常见情形2.1 &#xff1a;未初始化的野指针2.2 所指的对象已经消亡2.3 指针释放之后未置空3&#xff1a;避免野指针1&#xff1a;定义 指向非法的内存地址的指针叫做野指针&#xff08;Wild Pointer&#xff09;&#xff0c;也…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...