时长一周的golang萌新学习go-zero --- 进度四(调通Rpc)

977 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

我弄了一上午终于把调试通了。接下来就是这个项目的最重要的一部分如何 api-rpc调试通了。

我的流程步骤 === api
  • 初始化一个项目mkdir go-zero-micro并且go mod init go-zero-micro
  • 创建一个服务student的文件夹。mkdir student;进入到里面继续创建mkdir cmd;再进入里面继续创建mkdir apimkdir rpc
  • 进入 cmd/api 目录下创建desc文件夹;在里面创建一个 user 文件夹。在user文件夹里创建一个 user.api文件。再在desc目录下创建一个student.api文件。

最终的目录结构 image.png

下面开始编写 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传过来的数据。

完了,休息会儿。太累了。