浪起网站建设,盐城代运营,wordpress kindeditor,宁波网站制作与推广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/…
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/greet.api 文件1.3.2 重新生成代码1.3.3 修改logic/greetpostlogic.go文件1.3.4 重启并访问服务2 go-zero入门--微服务demo2.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 set2 greet.api line 25:1 expecting http method, found input handler1 go-zero入门–单体服务demo
参考1go-zero入门–单体服务demo 推荐先阅读参考1。
1.1 单体服务【官方示例】
1.1.1 创建greet服务
goctl api new greet1.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.go1.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,optionsyou|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.yamlPOST方式访问
POST http://127.0.0.1:8888/from/哈哈 HTTP/1.1
Content-Type: application/json
{name:post 哈哈
}返回结果
{message: Hello go-zero namepost 哈哈
}2 go-zero入门–微服务demo
2.1 新建微服务
参考1go-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.rpcinternal/config/config.go 主要是配置后端调用的模块RPC。 示例
package configimport (github.com/zeromicro/go-zero/restgithub.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/zrpcgo-zero-micro-demo/mall/order/api/internal/configgo-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使用
参考1goctl-swagger 看参考1 中README.md里面有下载及使用的操作流程。
生成swagger.json文件的命令
goctl api plugin -plugin goctl-swaggerswagger -filename user.json -api user.api -dir .4 goctl 相关命令整理
4.1 .api生成swagger的命令
示例
goctl api plugin -plugin goctl-swaggerswagger -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/appsystemodel4.5 docker启动swagger的命令
docker run -d -p 9981:8080 --nameswagger-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 gozero2 greet.api line 25:1 expecting ‘http method’, found input ‘handler’
源码
service greet-api {handler GreetHandlerhandler 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)
}