feat: 完成用户微服务 gRPC 实现,包含数据库与服务启动逻辑

This commit is contained in:
fish
2026-03-28 18:11:15 +08:00
parent 911654b60b
commit 27da6939f4
6 changed files with 300 additions and 0 deletions

View File

@@ -0,0 +1,156 @@
package main
import (
"context"
"fmt"
"log"
"net"
"user-svc/user"
"google.golang.org/grpc"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type User struct {
ID string `json:"id" gorm:"primaryKey"`
Name string `json:"name"`
Email string `json:"email"`
Password string `json:"password"`
}
type UserServiceServer struct {
user.UnimplementedUserServiceServer
db *gorm.DB
}
func (s *UserServiceServer) CreateUser(ctx context.Context, req *user.CreateUserRequest) (*user.CreateUserResponse, error) {
newUser := User{
ID: fmt.Sprintf("%d", len(s.getAllUsers())+1),
Name: req.Name,
Email: req.Email,
Password: req.Password,
}
result := s.db.Create(&newUser)
if result.Error != nil {
return nil, result.Error
}
return &user.CreateUserResponse{
User: &user.User{
Id: newUser.ID,
Name: newUser.Name,
Email: newUser.Email,
Password: newUser.Password,
},
}, nil
}
func (s *UserServiceServer) GetUser(ctx context.Context, req *user.GetUserRequest) (*user.GetUserResponse, error) {
var user User
result := s.db.First(&user, "id = ?", req.Id)
if result.Error != nil {
return nil, result.Error
}
return &user.GetUserResponse{
User: &user.User{
Id: user.ID,
Name: user.Name,
Email: user.Email,
Password: user.Password,
},
}, nil
}
func (s *UserServiceServer) ListUsers(ctx context.Context, req *user.ListUsersRequest) (*user.ListUsersResponse, error) {
users := s.getAllUsers()
var protoUsers []*user.User
for _, u := range users {
protoUsers = append(protoUsers, &user.User{
Id: u.ID,
Name: u.Name,
Email: u.Email,
Password: u.Password,
})
}
return &user.ListUsersResponse{
Users: protoUsers,
}, nil
}
func (s *UserServiceServer) UpdateUser(ctx context.Context, req *user.UpdateUserRequest) (*user.UpdateUserResponse, error) {
var user User
result := s.db.First(&user, "id = ?", req.Id)
if result.Error != nil {
return nil, result.Error
}
if req.Name != "" {
user.Name = req.Name
}
if req.Email != "" {
user.Email = req.Email
}
if req.Password != "" {
user.Password = req.Password
}
s.db.Save(&user)
return &user.UpdateUserResponse{
User: &user.User{
Id: user.ID,
Name: user.Name,
Email: user.Email,
Password: user.Password,
},
}, nil
}
func (s *UserServiceServer) DeleteUser(ctx context.Context, req *user.DeleteUserRequest) (*user.DeleteUserResponse, error) {
result := s.db.Delete(&User{}, "id = ?", req.Id)
if result.Error != nil {
return nil, result.Error
}
return &user.DeleteUserResponse{
Success: true,
}, nil
}
func (s *UserServiceServer) getAllUsers() []User {
var users []User
s.db.Find(&users)
return users
}
func initDB() *gorm.DB {
db, err := gorm.Open(sqlite.Open("users.db"), &gorm.Config{})
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}
db.AutoMigrate(&User{})
return db
}
func main() {
db := initDB()
server := grpc.NewServer()
user.RegisterUserServiceServer(server, &UserServiceServer{db: db})
listener, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("Failed to listen: %v", err)
}
log.Println("User service starting on port 50051...")
if err := server.Serve(listener); err != nil {
log.Fatalf("Failed to serve: %v", err)
}
}