本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
我弄了一上午终于把调试通了。接下来就是这个项目的最重要的一部分如何 api-rpc调试通了。
我的流程步骤 === api
- 初始化一个项目
mkdir go-zero-micro并且go mod init go-zero-micro - 创建一个服务
student的文件夹。mkdir student;进入到里面继续创建mkdir cmd;再进入里面继续创建mkdir api和mkdir rpc。 - 进入
cmd/api目录下创建desc文件夹;在里面创建一个user文件夹。在user文件夹里创建一个user.api文件。再在desc目录下创建一个student.api文件。
最终的目录结构
下面开始编写 user.api 文件
这是类型 请求体和返回体的所需要的数据
syntax = "v1"
type (
RegisterReq struct {
StudentNo string `json:"student_no,required"`
Password string `json:"password,required"`
Email string `json:"email"`
TeacherId uint64 `json:"teacher_id,required"`
CollegeId uint64 `json:"college_id,required"`
Name string `json:"name,required"`
Mobile string `json:"mobile,required"`
Sex uint `json:"sex,required"`
grade uint `json:"grade,required"`
}
RegisterResp struct {
}
)
我们继续编写 student.api文件
syntax = "v1"
import ("user/user.api")
//==========================> user v1 <==========================
// 不需要授权登录
@server(
prefix : /student/v1
group : user
)
service student-api {
@doc "register"
@handler register
post /user/register (RegisterReq) returns (RegisterResp)
}
好了到这一步;才刚刚完成了 10%。继续我们就是利用 goclt生的 对应代码了。在终端 切换到路径为student/cmd/api/desc目下使用 goctl 的命令.
goctl api go -api studentcenter.api -dir ../ -style=goZero
继续我们开始修改配置文件了。找到我们的cmd/api/etc/目录的配置文件。
Name: student-api
Host: 0.0.0.0
Port: 1004
Mode: dev
#jwtAuth
JwtAuth:
AccessSecret: ae0536f9-6450-4606-8e13-5a19ed505da0
AccessExpire: 36000
#监控
Prometheus:
Host: 0.0.0.0
Port: 4008
Path: /metrics
#链路追踪
Telemetry:
Name: studentCenter-api
Endpoint: http://jaeger:14268/api/traces
Sampler: 1.0
Batcher: jaeger
Log:
ServiceName: studentCenter-api
Level: error
#rpc服务
StudentRpcConf:
Endpoints:
- 127.0.0.1:2004
NonBlock: true
上面那些东西不懂;后面我会慢慢去研究弄明白这些的。
继续修改我们的配置;进入到cmd/api/internal/config/config.go目录下;继续修改我们配置文件。
package config
import (
"github.com/zeromicro/go-zero/rest"
"github.com/zeromicro/go-zero/zrpc"
)
type Config struct {
rest.RestConf
JwtAuth struct {
AccessSecret string
AccessExpire int64
}
StudentRpcConf zrpc.RpcClientConf
}
继续配置 svc 目录下的 serviceContext.go里参数数据
package svc
import (
"github.com/zeromicro/go-zero/zrpc"
"go-zero-micro/app/student/cmd/api/internal/config"
"go-zero-micro/app/student/cmd/rpc/student"
)
type ServiceContext struct {
Config config.Config
StudentRpc student.Student
}
func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
StudentRpc: student.NewStudent(zrpc.MustNewClient(c.StudentRpcConf)),
}
}
下面就是开始写我的业务代码了在cmd/api/inernal/logisterLogic.go里修改我们的业务,我们这边如何代用 Rpc 的业务呢
registerResp, err := l.svcCtx.StudentRpc.Register(l.ctx, &student.RegisterReq{
...里面参数
})
下面开始编写我们的 rpc的代码吧。
进入到我们的rpc目录下面;创建一个 pb 文件夹;在里面创建一个 student.proto。然后我们编写这个文件。
syntax = "proto3";
option go_package = "./pb";
package pb;
message RegisterReq {
string StudentNo = 1;
string password = 2;
.....
}
message RegisterResp {}
message LoginReq {
string StudentNo = 1;
string password = 2;
}
message LoginResp {
string accessToken = 1;
int64 accessExpire = 2;
int64 refreshAfter = 3;
}
service student{
rpc Register(RegisterReq) returns (RegisterResp) {}
}
我们利用 goctl 来生成grpc代码;终端命令进入studentcenter\cmd\rpc\pb>;然后终端命令输入进去:
goctl rpc protoc studentcenter.proto --go_out=../ --go-grpc_out=../ --zrpc_out=../;代码文件目录自动生成了。
开始我们配置我的rpc的配置文件。进入到 rpc/etc/stunde.yaml
Name: student-rpc
ListenOn: 0.0.0.0:2004
Model: dev
#Etcd:
# Hosts:
# - 127.0.0.1:2379
# Key: student.rpc
#jwtAuth
JwtAuth:
AccessSecret: ae0536f9-6450-4606-8e13-5a19ed505da0
AccessExpire: 31536000
#Monitoring
Prometheus:
Host: 0.0.0.0
Port: 4009
Path: /metrics
#Link Tracking
Telemetry:
Name: student-rpc
Endpoint: http://jaeger:14268/api/traces
Sampler: 1.0
Batcher: jaeger
Log:
ServiceName: student-rpc
Level: error
Redis:
Host: redis:6379
Type: node
Pass: password
DB:
DataSource: 1111111
Cache:
- Host: redis:6379
Pass: password
修改配置文件 在目录下 rpc/internal/config/config.go修改
package config
import (
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/zrpc"
)
type Config struct {
zrpc.RpcServerConf
JwtAuth struct {
AccessSecret string
AccessExpire int64
}
DB struct {
DataSource string
}
Redis struct {
Host string
Type string
Pass string
}
Cache cache.CacheConf
}
继续修改rpc/internal/svc/servicecontext.go文件内容
package svc
import (
"github.com/zeromicro/go-zero/core/stores/redis"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"go-zero-micro/app/student/cmd/rpc/internal/config"
"go-zero-micro/app/student/model"
)
type ServiceContext struct {
Config config.Config
RedisClient *redis.Redis
StudentModel model.StudentModel
}
func NewServiceContext(c config.Config) *ServiceContext {
sqlConn := sqlx.NewMysql(c.DB.DataSource)
return &ServiceContext{
Config: c,
RedisClient: redis.New(c.Redis.Host, func(r *redis.Redis) {
r.Type = c.Redis.Type
r.Pass = c.Redis.Pass
}),
StudentModel: model.NewStudentModel(sqlConn, c.Cache),
}
}
最后我的rpc的业务就在 rpc/inernal/logic/registerlogic.go页面业务逻辑。
其中里面的 in就是 api传过来的数据。
完了,休息会儿。太累了。