121 行
2.8 KiB
Go
121 行
2.8 KiB
Go
|
package cmd
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"crypto/md5"
|
||
|
"fmt"
|
||
|
"net"
|
||
|
"strings"
|
||
|
"sync"
|
||
|
|
||
|
pb "code.widuu.com/widuu/micro_service/demo1/proto"
|
||
|
"google.golang.org/grpc"
|
||
|
"google.golang.org/grpc/codes"
|
||
|
"google.golang.org/grpc/status"
|
||
|
"google.golang.org/protobuf/types/known/emptypb"
|
||
|
)
|
||
|
|
||
|
type UserServer struct {
|
||
|
// 继承 UnimplementedUserServer 实现的 mustEmbedUnimplementedUserServer
|
||
|
pb.UnimplementedUserServer
|
||
|
// 创建 map 用户信息模拟数据库存储
|
||
|
User map[string]string
|
||
|
// 加锁
|
||
|
l sync.Mutex
|
||
|
}
|
||
|
|
||
|
// 获取用户信息,正常需要传入token 而不是 empty 这里主要
|
||
|
// 为了演示服务里使用 google.protobuf.Empty 类型
|
||
|
func (u *UserServer) GetUserInfo(ctx context.Context, r *emptypb.Empty) (*pb.Response, error) {
|
||
|
// 模拟登录
|
||
|
u.l.Lock()
|
||
|
defer u.l.Unlock()
|
||
|
// 判断是否存在数据
|
||
|
if _, ok := u.User["username"]; !ok {
|
||
|
return nil, status.Error(codes.Aborted, "user not login")
|
||
|
}
|
||
|
return &pb.Response{
|
||
|
Code: 1,
|
||
|
Msg: "get user info success",
|
||
|
Data: &pb.Response_Token{
|
||
|
Token: u.User["token"],
|
||
|
},
|
||
|
Info: u.User,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
func (u *UserServer) Login(ctx context.Context, r *pb.LoginRequest) (*pb.Response, error) {
|
||
|
// 模拟登录
|
||
|
u.l.Lock()
|
||
|
defer u.l.Unlock()
|
||
|
// 判断是否存在
|
||
|
if _, ok := u.User["username"]; !ok {
|
||
|
return nil, status.Error(codes.Aborted, "user not exists")
|
||
|
}
|
||
|
if pass, ok := u.User["password"]; !ok || pass != r.Password {
|
||
|
return nil, status.Error(codes.Aborted, "user password error")
|
||
|
}
|
||
|
// 完全是为了解析 any 类型演示使用
|
||
|
info := map[string]string{"username": u.User["username"]}
|
||
|
// 如果有Code
|
||
|
if r.Other != nil {
|
||
|
var code pb.Code
|
||
|
if err := r.Other.UnmarshalTo(&code); err == nil {
|
||
|
info["code"] = code.Code
|
||
|
}
|
||
|
}
|
||
|
hash := md5.New()
|
||
|
hash.Write([]byte(r.Password))
|
||
|
u.User["token"] = fmt.Sprintf("%x", hash.Sum(nil))
|
||
|
return &pb.Response{
|
||
|
Code: 1,
|
||
|
Msg: "resgister success",
|
||
|
Data: &pb.Response_Token{
|
||
|
Token: u.User["token"],
|
||
|
},
|
||
|
Info: info,
|
||
|
}, nil
|
||
|
}
|
||
|
func (u *UserServer) Register(ctx context.Context, r *pb.RegisterRequest) (*pb.Response, error) {
|
||
|
u.l.Lock()
|
||
|
defer u.l.Unlock()
|
||
|
// 判断是否存在
|
||
|
if _, ok := u.User["username"]; ok {
|
||
|
return nil, status.Error(codes.Aborted, "user already exists")
|
||
|
}
|
||
|
// 注册
|
||
|
u.User["username"] = r.Username
|
||
|
u.User["password"] = r.Password
|
||
|
u.User["email"] = r.Email
|
||
|
u.User["mobile"] = r.Mobile
|
||
|
u.User["hobbies"] = strings.Join(r.Hobbies, ",")
|
||
|
return &pb.Response{
|
||
|
Code: 1,
|
||
|
Msg: "resgister success",
|
||
|
Data: &pb.Response_Message{
|
||
|
Message: "ok",
|
||
|
},
|
||
|
Info: u.User,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
func RunServer(port string, ctx context.Context) {
|
||
|
srv := grpc.NewServer()
|
||
|
pb.RegisterUserServer(srv, &UserServer{
|
||
|
User: make(map[string]string, 6),
|
||
|
})
|
||
|
l, err := net.Listen("tcp", port)
|
||
|
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
go func() {
|
||
|
<-ctx.Done()
|
||
|
srv.GracefulStop()
|
||
|
}()
|
||
|
if err := srv.Serve(l); err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
}
|