micro_service/demo1/cmd/server.go

121 行
2.8 KiB
Go

2024-09-24 16:56:54 +08:00
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)
}
}