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.go
handler/的文件
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.go
handler/routes.go
:增加了的访问接口的路由。
同时会新增以下文件:
handler/greetposthandler.go
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个地方。
- 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)
}