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) } }