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
注意:
- 端口的设置是在
etc/greet-api.yaml中。 - 访问地址中的最后资源只能是
you或me,否则会报错,这个是在greet.api中配置的。
1.2 修改GET入参
1.2.1 去除options限制的入参值
- 修改
greet/greet.api文件
type Request {Name string `path:"name,options=you|me"`
}
改为:
type Request {Name string `path:"name"`
}
- 重新生成代码
cd ~/go-zero-single_demo/greet
goctl api go -api greet.api -dir . -style gozero
注意:执行完goctl后会重新生成以下文件,如果没有新增的东西,可能会看不出来,具体可看执行日志。
types/types.gohandler/的文件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后会重新生成以下文件。
types/types.gohandler/routes.go:增加了的访问接口的路由。
同时会新增以下文件:
handler/greetposthandler.gologic/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个地方。
- etc/xxx.yaml
主要是配置后端模块的Etcd服务发现。
示例:
Name: order
Host: 0.0.0.0
Port: 8889
UserRpc:Etcd:Hosts:- 192.168.13.3:2379Key: user.rpc
- 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
}
- 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放一块、api和api放一块的写法是错误的。
正确写法:
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 田地丈量(矩阵面积交) 矩阵面积交x轴线段交长度*y轴线段交长度 线段交长度,相交的时候是min右端点-max左端点,不相交的时候是0 #include<bits/stdc.h> using namespace std; int n,a,b,ans,x,y,x2,y2; int f(in…...
板内盘中孔设计狂飙,细密间距线路中招
一博高速先生成员:王辉东大风起兮云飞扬,投板兮人心舒畅。赵理工打了哈欠,伸了个懒腰,看了看窗外,对林如烟说道:“春天虽美,但是容易让人沉醉。如烟,快女神节了,要不今晚…...
面试热点题:回溯算法 递增子序列与全排列 II
前言: 如果你一点也不了解什么叫做回溯算法,那么推荐你看看这一篇回溯入门,让你快速了解回溯算法的基本原理及框架 递增子序列 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两…...
怎么找回回收站删除的文件
我们都知道,电脑文件都是放在桌面上的,单独存放或者一起存放在文件夹里。但总会有已用完或者是没用的文件,这让我们不得不对其进行清理。而清空回收站也是不可避免的。如果出现了清空文件中还有我们需要的文件,怎么找回回收站删除…...
dp-打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非…...
C++预处理连接
目录定义常量字符串前缀定义枚举类型Boost C库中常常使用预处理连接来定义宏和模板类Google开源的C单元测试框架gtest,使用预处理连接技术创建测试用例和测试方法C预处理连接(Preprocessor Concatenation)是一种宏定义技巧,用于将…...
3、DRF实战总结:基于类的视图APIView, GenericAPIView和GenericViewSet视图集(附源码)
前面介绍了什么是符合RESTful规范的API接口,以及使用了基于函数的视图(FBV)编写了对文章进行增删查改的API。在本篇文章将使用基于类的视图(Class-based View, CBV)重写之前的接口。 参考: 1、Django开发总结: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 插件(ChatGPT plugins)——ChatGPT生态建设的开端ChatGPT插件是什么OpenAI最新官方blog资料表示,已经在ChatGPT中实现了对插件的初步支持。插件是专门为以安全为核心原则的语言模型设计的工具,可帮助ChatGPT…...
脉诊(切脉、诊脉、按脉、持脉)之法——入门篇
认识脉诊何谓脉诊?脉诊的渊源脉诊重要吗?脉诊确有其事,还是故弄玄虚?中医科学吗?如何脉诊?寸口脉诊法何谓脉诊? 所谓脉诊,就是通过把脉来诊断身体健康状况的一种必要手段。 …...
【十二天学java】day09常用api介绍
1.API 1.1API概述 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这…...
软件测试 - 测试用例常见面试题
1.测试用例的要素测试用例是为了实施测试而向被测试的系统提供的一组集合, 这组集合包含 : 测试环境, 操作步骤, 测试数据, 预期结果等要素.例如 : 在 B 站输入框输入一个空格, 检查结果测试用例标题 : 输入框输入空格测试环境 : Windows 系统, 谷歌浏览器-版本 111.0.5563.65&…...
几种常见的API接口分页方案
文章目录1 概述2 分页方案2.1 基于偏移量2.2 基于游标3 重复数据处理3.1 基于时间3.2 基于热度3.3 基于推荐1 概述 列表是互联网产品中很常见的一种内容排列形式,而且列表的数据集往往成千上万,一次性返回全量数据集的场景几乎不存在,所以出…...
【Object 类的方法】
在 Java 中,所有类都继承了 Object 类,因此 Object 类中的方法可以在所有 Java 对象中使用。下面是 Object 类中的一些常用方法介绍: equals(Object obj): 用于判断两个对象是否相等。默认情况下,该方法比较的是两个对象的地址是…...
留用户、补内容,在线音乐暗战不停
在线音乐在人们的日常生活中扮演着愈发重要的角色,尤其是在面临巨大压力时,人们往往更倾向于通过倾听一段音乐来缓解内心的紧张与焦虑。而随着在线音乐用户数量的增长以及付费意愿的增强,在线音乐行业也实现了稳步发展。 经过多年的发展&…...
python--exec
在Python中,eval和exec都是用来执行动态代码的内置函数,但它们的作用和使用方式有所不同。 eval(): 将字符串作为Python表达式进行求值,并返回结果。 exec(): 将字符串作为Python语句进行执行,没有返回值。 eval()的使用范围通常限…...
干货分享!这6个高效率办公软件,总有一个值得你收藏!
分享6款高效办公软件,可以解决你很多需求,职场人一定要知道。每一款都是精挑细的,可能有的已经很大众了,但肯定还有小伙伴不知道,废话不多说,直接看!! 1、Flomo笔记:记录…...
代码随想录刷题-链表总结篇
文章目录链表理论基础单链表双链表循环链表其余知识点链表理论基础单链表双链表循环链表其余知识点移除链表元素习题我的解法虚拟头结点解法设计链表习题我的解法代码随想录代码反转链表习题双指针递归两两交换链表中的节点习题我的解法代码随想录解法删除链表的倒数第N个节点习…...
C++:指针:什么是野指针
野指针目录1:定义2:野指针常见情形2.1 :未初始化的野指针2.2 所指的对象已经消亡2.3 指针释放之后未置空3:避免野指针1:定义 指向非法的内存地址的指针叫做野指针(Wild Pointer),也…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
