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

news/2024/11/8 17:50:39/

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)
}

http://www.ppmy.cn/news/34611.html

相关文章

Vue3 学习总结补充(一)

文章目录1、Vue3中为什么修改变量的值后,视图不更新?2、使用 ref 还是 reactive?3、reactive 为什么会有响应性连接丢失情况?4、watch的不同使用方法5、watchEffect和 watch 的区别区别1:数据源的区别区别2&#xff1a…

第十三届蓝桥杯省赛 python B组复盘

文章目录前言主要内容🦞试题 A:排列字母思路代码🦞试题 B:寻找整数思路代码🦞试题 C:纸张尺寸思路代码🦞试题 D:数位排序思路代码🦞试题 E:蜂巢思路代码&…

day74【代码随想录】二刷链表

文章目录前言一、重排链表(力扣143)二、旋转链表(力扣61)三、删除排序链表中的重复元素 II(力扣82)四、重复的DNA序列(力扣187)【滑动窗口】前言 1、重排链表 2、旋转链表 3、删除排…

第十四届蓝桥杯三月真题刷题训练——第 21 天

目录 第 1 题:灭鼠先锋 问题描述 运行限制 代码: 思路: 第 2 题:小蓝与钥匙 问题描述 答案提交 运行限制 代码: 思路 : 第 3 题:李白打酒加强版 第 4 题:机房 第 1 题&#xff1…

Java基础知识之HashMap的使用

一、HashMap介绍 HashMap是Map接口的一个实现类(HashMap实现了Map的接口),它具有Map的特点。HashMap的底层是哈希表结构。 Map是用于保存具有映射关系的数据集合,它具有双列存储的特点,即一次必须添加两个元素&#xf…

JavaScript传参的6种方式

JavaScript传参的方式1. 传递基本类型参数2. 传递对象类型参数3. 使用解构赋值传递参数4. 使用展开运算符传递参数5. 使用可选参数6. 使用剩余参数JavaScript是一门非常灵活的语言,其参数传递方式也同样灵活。在本篇文章中,会详细介绍JavaScript中的参数…

传输层协议----UDP/TCP

文章目录前言一、再谈端口号端口号的划分认识知名端口号(Well-Know Port Number)两个问题nestatpidof二、UDP协议UDP协议端格式UDP的特点面向数据报UDP的缓冲区UDP使用注意事项基于UDP的应用层协议二、TCP协议TCP协议段格式可靠性问题确认应答(ACK)机制流量控制六个标志位PSHUG…

Vue趣味【Vue3+Element Plus+Canvas实现一个简易画板;支持导出为图片】

目录🌟前言🌟粉丝先看🌟创建Vue3项目🌟引入Element Plus🌟实现代码(详细注释)🌟写在最后🌟JSON包里写函数,关注博主不迷路🌟前言 哈喽小伙伴们&a…