go-zero 微服务应用实践(二)

服务调用

完成rpc访问功能后,还需要进行客户端调用,会用到goctl 的api功能;创建api目录编写api文件;api相关语法可以参考官方文档:api语法介绍

1、API文件编写

其中 登录注册增加了参数验证,使用 validator 包进行验证详细使用方法可以到 github.com/go-playground/validator 查看

syntax = "v1"
type (
	LoginRequest {
		Email    string `json:"Email" validate:"required,email"`
		Password string `json:"password" validate:"required,gte=8"`
	}
	LoginResponse {
		AccessToken  string `json:"accessToken"`
		AccessExpire int64  `json:"accessExpire"`
	}
	RegisterRequest {
		Name     string `json:"name" validate:"required,gte=2,lte=20"`
		Gender   int64  `json:"gender" validate:"oneof=1 2"`
		Email    string `json:"Email" validate:"required,email"`
		Password string `json:"password" validate:"required,gte=8"`
	}
	RegisterResponse {
		Id     int64  `json:"id"`
		Name   string `json:"name"`
		Gender int64  `json:"gender"`
		Email  string `json:"Email"`
	}

	UserInfoRequest {
	}
	UserInfoResponse {
		Id     int64  `json:"id"`
		Name   string `json:"name"`
		Gender int64  `json:"gender"`
		Email  string `json:"Email"`
	}
)

service User {
	@handler Login
	post /api/user/login(LoginRequest) returns (LoginResponse)
	
	@handler Register
	post /api/user/register(RegisterRequest) returns (RegisterResponse)
}

@server(
	jwt: Auth
)
service User {
	@handler UserInfo
	post /api/user/userinfo(UserInfoRequest) returns (UserInfoResponse)
}

2、执行goctl命令

goctl api go -api ./api/user.api -dir ./api

执行后生成目录如下

api
├─etc
└─internal
    ├─config
    ├─handler
    ├─logic
    ├─svc
    └─types

3、Service 层增加 UserRpc

package svc

import (
	"github.com/zeromicro/go-zero/zrpc"
	"slowdown/user/api/internal/config"
	"slowdown/user/rpc/user"
)

type ServiceContext struct {
	Config config.Config

	UserRpc user.User
}

func NewServiceContext(c config.Config) *ServiceContext {
	return &ServiceContext{
		Config:  c,
		UserRpc: user.NewUser(zrpc.MustNewClient(c.UserRpc)),
	}
}

4、logic 业务逻辑层

注册逻辑

func (l *RegisterLogic) Register(req *types.RegisterRequest) (resp *types.RegisterResponse, err error) {
	validate := validator.New()
	err = validate.Struct(req)
	if err != nil {
		return nil, err
	}
	res, err := l.svcCtx.UserRpc.Register(l.ctx, &user.RegisterRequest{
		Name:     req.Name,
		Email:    req.Email,
		Gender:   req.Gender,
		Password: req.Password,
	})
	if err != nil {
		return nil, err
	}

	return &types.RegisterResponse{
		Id:     res.Id,
		Name:   res.Name,
		Gender: res.Gender,
		Email:  res.Email,
	}, nil
}

登录逻辑

func (l *LoginLogic) Login(req *types.LoginRequest) (resp *types.LoginResponse, err error) {
	res, err := l.svcCtx.UserRpc.Login(l.ctx, &user.LoginRequest{
		Email:    req.Email,
		Password: req.Password,
	})
	if err != nil {
		return nil, err
	}
	now := time.Now().Unix()

	accessToken, err := jwtx.GetToken(l.svcCtx.Config.Auth.AccessSecret, now, l.svcCtx.Config.Auth.AccessExpire, res.Id)
	if err != nil {
		return nil, err
	}
	return &types.LoginResponse{
		AccessExpire: l.svcCtx.Config.Auth.AccessExpire,
		AccessToken:  accessToken,
	}, nil
}

获取用户信息

func (l *UserInfoLogic) UserInfo() (resp *types.UserInfoResponse, err error) {
	uid, _ := l.ctx.Value("uid").(json.Number).Int64()
	res, err := l.svcCtx.UserRpc.UserInfo(l.ctx, &user.UserInfoRequest{
		Id: uid,
	})
	if err != nil {
		return nil, err
	}
	return &types.UserInfoResponse{
		Id:     res.Id,
		Name:   res.Name,
		Gender: res.Gender,
		Email:  res.Email,
	}, nil
}

5、启动服务测试

使用apifox进行测试
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Devin_S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值