API Gateway 代码调用 user rpc 服务
有了前面文章的介绍,接下去我们将加快开发速度了。
编辑 api/internal/handler
下的 registerhandler.go
文件,新增如下代码
func RegisterHandler(ctx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.RegisterRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.OkJson(w, ningxi.FailureResponse(nil,err.Error(),1000))
return
}
l := logic.NewRegisterLogic(r.Context(), ctx)
resp, err := l.Register(req)
if err != nil {
httpx.OkJson(w, ningxi.FailureResponse(nil,err.Error(),1000))
} else {
httpx.OkJson(w, ningxi.SuccessResponse(resp,"注册成功"))
}
}
}
编辑 api/internal/logic
下的 registerlogic.go
文件,新增如下代码
func (l *RegisterLogic) Register(req types.RegisterRequest) (*types.RegisterResponse, error) {
resp,err := l.svcCtx.User.Register(l.ctx,&user.RegisterRequest{
Username: req.Username,
Email: req.Email,
Password: req.Password,
})
if err != nil {
return nil, err
}
token := types.JwtToken{
AccessToken: resp.AccessToken,
AccessExpire: resp.AccessExpire,
RefreshAfter: resp.RefreshAfter,
}
response := types.UserReply{
Id: resp.Id,
Email: resp.Email,
JwtToken: token,
}
return &types.RegisterResponse{
response,
},nil
}
rpc
代码调用 crud+cache
代码
编辑 rpc/user/internal/logic
下的 registerlogic.go
文件,新增如下代码
func (l *RegisterLogic) Register(in *user.RegisterRequest) (*user.Response, error) {
_, err := l.svcCtx.Model.FindOneByEmail(in.Email)
if err == model.ErrNotFound {
newuser := model.User{
Name: in.Username,
Email: in.Email,
Password: ningxi.PasswordEncrypt(l.svcCtx.Config.Salt,in.Password),
}
if result ,err := l.svcCtx.Model.Insert(newuser); err != nil {
return nil, err
} else {
newuser.Id , err = result.LastInsertId()
if err != nil {
return nil, err
} else {
now := time.Now().Unix()
accessExpire := l.svcCtx.Config.AccessExpire
jwtToken, err := ningxi.GetJwtToken(l.svcCtx.Config.AccessSecret, now, accessExpire, newuser.Id)
if err != nil {
return nil, err
}
response := user.Response{
Email: newuser.Email,
Id: newuser.Id,
AccessToken: jwtToken,
AccessExpire: now + accessExpire,
RefreshAfter: now + accessExpire/2,
}
return &response, nil
}
}
} else if err == nil {
return nil, errors.New("该用户已存在")
} else {
return nil, err
}
}
GetJwtToken
方法是个常用的方法,于是我们把他写到了 ningxi.go
里面
package ningxi
import (
"fmt"
"github.com/dgrijalva/jwt-go"
"golang.org/x/crypto/scrypt"
)
type HttpResponse struct {
Code int `json:"code"`
Message string `json:"message"`
Result interface{} `json:"result"`
}
func SuccessResponse(resData interface{},message string) HttpResponse {
return HttpResponse{Code:1,Message: message,Result: resData}
}
func FailureResponse(resData interface{},message string,code int) HttpResponse {
return HttpResponse{Code:code,Message: message,Result: resData}
}
func PasswordEncrypt(salt,password string) string {
dk,_ := scrypt.Key([]byte(password), []byte(salt), 32768, 8, 1, 32)
return fmt.Sprintf("%x",string(dk))
}
func GetJwtToken(secretKey string, iat, seconds, userId int64) (string, error) {
claims := make(jwt.MapClaims)
claims["exp"] = iat + seconds
claims["iat"] = iat
claims["userId"] = userId
token := jwt.New(jwt.SigningMethodHS256)
token.Claims = claims
return token.SignedString([]byte(secretKey))
}
启动服务
启动服务,注意 在启动服务前,需要确保 先前文章用到的 ningxi-compose
正常运行起来。
启动 user rpc
服务, 运行成功后,user rpc
则运行在本机的 8080
端口
➜ FoodGuides git:(master) ✗ go run usermanage/rpc/user/user.go -f usermanage/rpc/user/etc/user.yaml
Starting rpc server at 127.0.0.1:8080...
启动 user api
服务, 运行成功后,user api
则运行在本机的 8888
端口
➜ FoodGuides git:(master) ✗ go run usermanage/api/user.go -f usermanage/api/etc/user-api.yaml
Starting server at 0.0.0.0:8888...
api
测试 得到如下数据则说明 服务运行正常
➜ ~ curl http://localhost:8888/users/register -X POST -d '{"username": "ningxi3","email": "ningxi3@ningxi.com","password": "ningixi3"}' --header "Content-Type: application/json"
{"code":1,"message":"注册成功","result":{"id":3,"username":"","email":"ningxi3@ningxi.com","accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTE1NTM5MjAsImlhdCI6MTYxMTQ2NzUyMCwidXNlcklkIjozfQ.exhP3C79W35OlSHL4JFsCgpWdebtuCQzxJGsYQWI3xo","accessExpire":1611553920,"refreshAfter":1611510720}}%
➜ ~
这样,User rpc - Register
就开发完成了。