待补充。。。
go-zero的是基于go的,所以首先需要安装配置go环境,go的安装配置可参考:Golang安装配置、GoLand安装配置 ,此处不再赘述。
注意:如果是更新go-zero相关组件的版本,建议先备份原来的组件,防止最新版本的组件出现不兼容的问题。
4.3 自动安装
和 4.4 手动安装
均能安装go-zero的环境,如果按照4.3 自动安装
某个组件失败,可按4.4 手动安装
来安装缺失的组件。
goctl
go install github.com/zeromicro/go-zero/tools/goctl@latest
goctl -v
D:\Software\Golang\GOPATH\bin>goctl -v
goctl version 1.5.3 windows/amd64
protoc
、protoc-gen-go
、protoc-gen-go-grpc
goctl env check --install --verbose --force
go install github.com/zeromicro/go-zero/tools/goctl@latest
protoc --version
Protobuf下Go、GRPC插件的安装
protoc-gen-go:Go专用的protoc的编译器插件,安装后会在GOPATH的bin目录下生成一个protoc-gen-go.exe
protoc-gen-go-grp:Go调用grpc的插件,安装后会在GOPATH的bin目录下生成一个protoc-gen-go-grpc.exe
go install google.golang.org/protobuf/cmd/[email protected]
go install google.golang.org/grpc/cmd/[email protected]
至此使用Protobuf的准备工作就做完了。
参考文档:api demo 代码生成
api
服务,api
服务就是网关服务,如果不与Service
端【RPC端
】交互,则可以独立成一个单独的服务。goctl api new greet
.
│ go.mod
│ greet.api
│ greet.go
│
├─etc
│ greet-api.yaml
│
└─internal
├─config
│ config.go
│
├─handler
│ greethandler.go
│ routes.go
│
├─logic
│ greetlogic.go
│
├─svc
│ servicecontext.go
│
└─types
types.go
cd greet
go mod init
go mod tidy
go run greet.go -f etc/greet-api.yaml
curl -i http://localhost:8888/from/you
返回如下:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Traceparent: 00-0c577bd0a5d96c7b9669d3bba60d6b09-5f4e42e62eb6a79e-00
Date: Mon, 19 Jun 2023 14:25:01 GMT
Content-Length: 4
null
参考:api语法
参考:api 文件格式化
在 api 文件编写完之后,我们的 api 内容参差不齐,就有如下内容:
# 格式化前
syntax = "v1"
type User {
Id int64 `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
Description string `json:"description"`
}
type Student {
Id int64 `json:"id"`
No int64 `json:"no"`
Name string `json:"name"`
Age int `json:"age"`
Description string `json:"description"`
}
service User {
@handler ping
get /ping
}
这样的 api
文件不够美观,不便于阅读,可以使用 goctl api format
命令对 api
文件进行格式化。
# 格式化后
syntax = "v1"
type User {
Id int64 `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
Description string `json:"description"`
}
type Student {
Id int64 `json:"id"`
No int64 `json:"no"`
Name string `json:"name"`
Age int `json:"age"`
Description string `json:"description"`
}
service User {
@handler ping
get /ping
}
参考文档:gRPC demo 代码生成
goctl rpc new demo
.
│ demo.go
│ demo.proto
│ go.mod
│
├─demo
│ demo.pb.go
│ demo_grpc.pb.go
│
├─democlient
│ demo.go
│
├─etc
│ demo.yaml
│
└─internal
├─config
│ config.go
│
├─logic
│ pinglogic.go
│
├─server
│ demoserver.go
│
└─svc
servicecontext.go
/demo/internal/logic/demologic.go
文件,编辑该文件,将 29 行替换为如下代码:return &demo.Response{
Pong:"pong",
}, nil
/demo/etc/demo.yaml
,删除 3 至 7 行使用Etcd注册服务的内容
,然后在追加内容 Mode: dev
至末尾:goctl 生成最小化 gRPC 服务默认启动会向 ETCD 注册中心注册当前服务的信息,本次演示就不需要注册中心,所以删除了配置文件中的注册中心配置。
原始配置:
Name: demo.rpc
ListenOn: 0.0.0.0:8080
Etcd:
Hosts:
- 127.0.0.1:2379
Key: demo.rpc
更改后的配置:
Name: demo.rpc
ListenOn: 0.0.0.0:8080
Mode: dev
# 进入服务目录
$ cd /demo
# 整理依赖文件
$ go mod tidy
# 启动 go 程序
$ go run demo.go
当控制台有如下输出 Starting rpc server at 0.0.0.0:8080...
,说明服务已经启动成功,接着我们来访问一下该 gRPC 服务。
当在 Postman 中看到如下输出内容时,代表你的服务已经启动,并能成功访问。
{
"pong": "pong"
}
参考:proto 语法
example
├── etc
│ └── example.yaml
├── main.go
└── internal
├── config
│ └── config.go
├── handler
│ ├── xxxhandler.go
│ └── xxxhandler.go
├── logic
│ └── xxxlogic.go
├── svc
│ └── servicecontext.go
└── types
└── types.go
example
:单个服务目录,一般是某微服务名称。etc
:静态配置文件目录。main.go
:程序启动入口文件。internal
:单个服务内部文件,其可见范围仅限当前服务。config
:静态配置文件对应的结构体声明目录。handler
:handler 目录,可选,一般 http 服务会有这一层做路由管理,handler 为固定后缀。logic
:业务目录,所有业务编码文件都存放在这个目录下面,logic 为固定后缀。svc
:依赖注入目录,所有 logic 层需要用到的依赖都要在这里进行显式注入。types
:结构体存放目录。