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

Posted 西木Qi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go-zero学习及使用中遇到的问题相关的知识,希望对你有一定的参考价值。

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

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 line
	return &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 GreetHandler
	get /from/:name(Request) returns (Response)

    //2、post 方法的处理器
	@handler GreetPostHandler
	post /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 line
	return &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:2379
    Key: user.rpc
  1. internal/config/config.go
    主要是配置后端调用的模块RPC。
    示例:
package config

import (
	"github.com/zeromicro/go-zero/rest"
	"github.com/zeromicro/go-zero/zrpc"
)

type Config struct 
	rest.RestConf
	UserRpc zrpc.RpcClientConf

  1. internal/svc/servicecontext.go
    主要是将 2 配置的后端服务模块加入到 API接口模块的ServiceContext中。
    示例:
package svc

import (
	"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.Config
	UserRpc 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 GreetCustomizedHandler
	get /from/:name/:age(Request) returns (Response)
	get /customized/:address/:phone(CustomizedRequest) returns (CustomizedResponse)

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

正确写法:

service greet-api 
	@handler GreetHandler
	get /from/:name/:age(Request) returns (Response)
	
	@handler GreetPostHandler
	post /from/:name(RequestJson) returns (Response)

汇总篇--学习及练习过程中遇到过的问题

1. 报不可见异常Element is not currently visible and so may not be interacted with(单选题的答案设置)

就是元素的样式或父级及以上元素含有不可显示属性,以致在有些浏览器中(FirefoxDriver)不能操作,但在正常的浏览器中它是可见和可用的。可通过元素对象的方法isDisplayed()检测元素是否可显示的

在定位的时候前端里看到了是隐藏的样子,但是没意识到,报错后,去掉定位里最后一段隐藏的那个标签,就可以操作了

2. 日期控件的赋值(课程开始学习时间)

日期弹窗控件是iframe,但是通过switch_to.frame后操作总是不成功,所以开发给了另一个思路,写js直接赋值,还能避免操作日期控件会出现的问题。查询百度里给出的解决办法都是去掉input的readonly属性,看了看前端里readonly属性赋值是空,不是true,所以我试了试,不用去掉readonly直接赋值也OK,但是一获得焦点,日期控件就弹出,赋值后失去焦点就会出现undefined,看了看前端input的onfocus属性有值,所以去掉了这个属性再赋值,没有再弹出日期控件,OK成功赋值

1 #建议学习时间
2 timejs = "var setDate=document.getElementById(\"StudyTime\");setDate.removeAttribute(‘onfocus‘);"
3 driver.execute_script(timejs)
4 driver.find_element_by_id("StudyTime").send_keys("2016-08-22")

 

以上是关于go-zero学习及使用中遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

go-zero微服务框架rpc的使用

window10下go语言开发环境搭建,及体验go-zero框架,及解决command not found: goctl

vscode+golang遇到的问题及解决方法

Golang学习-第一篇 Golang的简单介绍及Windows环境下安装部署

Golang学习 - errors 包

怎么学习golang