demo
该文章只是记录如何搭建一个go-zero demo
,可以根据官方文档搭建
首先在根目录下创建目录:
/user/rpc
创建文件夹
user.proto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19syntax = "proto3";
package user;
option go_package = "./user";
message IdRequest {
string id = 1;
}
message UserResponse{
string id = 1;
string name = 2;
string password = 4;
}
service UserService {
rpc GetUserById(IdRequest) returns (UserResponse);
}进入
rpc
目录并生成代码goctl rpc protoc user.proto --go_out=types --go-grpc_out=types --zrpc_out=.
如果是根目录使用
得到下面这个目录和文件
进入
user/rpc/etc/user.yaml
可以发现我们还需要搭建一个etcd
的服务器我们使用
docker-compose.yaml
进行搭建1
2
3
4
5
6
7
8
9
10
11etcd:
image: bitnami/etcd:latest # 使用Bitnami的etcd Docker镜像
container_name: etcd
environment:
- ALLOW_NONE_AUTHENTICATION=yes # 允许无需认证的连接
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379 # 客户端访问地址
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 # 监听客户端的地址
ports:
- "2379:2379" # 映射容器的2379端口到宿主机的2379端口
networks:
- backend启动容器
进入
user/rpc/internal/logic/getuserbyidlogic.go
中有个func GetUserById
进行修改这里的结构体字段的填写根据之前
user.proto
中的message UserResponse
来填写1
2
3
4
5
6
7func (l *GetUserByIdLogic) GetUserById(in *user.IdRequest) (*user.UserResponse, error) {
return &user.UserResponse{
Id: "2",
Name: "test",
Password: "123456",
}, nil
}下载依赖
go mod tidy
启动服务
go run user.go
得到下面命令
1
2
3Starting rpc server at 0.0.0.0:8080...
{"@timestamp":"2024-06-03T11:45:38.101+08:00","caller":"stat/usage.go:61","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=5.1Mi, Sys=13.5Mi, NumGC=2","level":"stat"}
{"@timestamp":"2024-06-03T11:45:38.116+08:00","caller":"load/sheddingstat.go:61","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0","level":"stat"}测试:
- 打开
apifox
或者postman
- 创建一个
rpc
项目 - 导入
user.proto
- 打开
测试成功
下面进行
api
文件的编写首先也是创建一个
video/api/video.api
文件编写
video.api
文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15type(
VideoReq {
Id string `path:"id"`
}
VideoRes{
Id string `json:"id"`
Name string `json:"name"`
}
)
service VideoService {
@handler getVideo
get /api/videos/:id (VideoReq) returns (VideoRes)
}
下面开始生成api的文件
在
greet/greet.api
的文件中设置:1
2
3
4
5
6
7
8
9
10
11
12
13
14syntax = "v1"
type Request {
Name string `path:"name,options=you|me"`
}
type Response {
Message string `json:"message"`
}
service greet-api {
@handler GreetHandler
get /from/:name (Request) returns (Response)
}生成代码:
goctl api go -api greet.api -dir greet
然后运行
main.go
,记得修改一下路径,要不然会报错找不到/etc/greet-api.yaml
测试:
成功了
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Echin の 博客!