مقدمة في الميكروسيرفيسات بلغة Go
أصبحت هندسة الميكروسيرفيسات المعيار الفعلي لبناء الأنظمة الموزعة الحديثة. لغة Go (Golang) مع goroutines خفيفة الوزن، والأداء العالي، وسهولة النشر، مثالية لتنفيذ الميكروسيرفيسات. في هذه المقالة، سنحلل هندسة الميكروسيرفيسات بلغة Go من المفهوم إلى التنفيذ العملي مع أمثلة الكود.
تقدم Go دعمًا مدمجًا للتزامن، بدءًا سريعًا، وحجم ملفات ثنائية صغير - كل هذا مهم بشكل حاسم للميكروسيرفيسات. سننظر في كيفية تصميم الخدمة، وتنفيذ REST API، وإضافة middleware، وتجهيز التطبيق للحاويات.
هندسة الميكروسيرفيس بلغة Go
1. هيكل المشروع
التنظيم الصحيح للكود هو أساس الميكروسيرفيس القابل للصيانة. الهيكل الموصى به:
myservice/├── cmd/│ └── server/│ └── main.go # نقطة الدخول├── internal/│ ├── handler/ # معالجات HTTP│ ├── service/ # منطق الأعمال│ ├── repository/ # التعامل مع البيانات│ └── middleware/ # معالجات وسيطة├── pkg/│ └── models/ # نماذج البيانات العامة├── config/│ └── config.go # الإعدادات├── go.mod└── Dockerfileيتوافق هذا الهيكل مع مبادئ Clean Architecture: handler → service → repository. وهذا يسمح باختبار كل طبقة بشكل مستقل بسهولة.
2. الإعداد والتشغيل
لنبدأ بخادم HTTP بسيط باستخدام المكتبة القياسية net/http:
// cmd/server/main.gopackage main
import ( "fmt" "log" "net/http" "os")
func main() { port := os.Getenv("PORT") if port == "" { port = "8080" }
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, `{"status": "ok"}`) })
log.Printf("Server starting on :%s", port) log.Fatal(http.ListenAndServe(":"+port, nil))}هذا هو الحد الأدنى للميكروسيرفيس. للإنتاج، استخدم موجهًا يدعم middleware، مثل gorilla/mux أو chi.
التنفيذ العملي للميكروسيرفيس
3. REST API مع gorilla/mux
لنقم بتثبيت gorilla/mux وتنفيذ CRUD لكيان "المستخدم":
// go.modmodule github.com/youruser/userservice
go 1.21
require github.com/gorilla/mux v1.8.1// internal/handler/user.gopackage handler
import ( "encoding/json" "net/http" "github.com/gorilla/mux")
type User struct { ID string `json:"id"` Name string `json:"name"` Age int `json:"age"`}
var users = []User{ {ID: "1", Name: "Alice", Age: 30},}
func GetUsers(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(users)}
func CreateUser(w http.ResponseWriter, r *http.Request) { var newUser User if err := json.NewDecoder(r.Body).Decode(&newUser); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } users = append(users, newUser) w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(newUser)}// cmd/server/main.go (تابع)package main
import ( "log" "net/http" "github.com/gorilla/mux" "yourproject/internal/handler")
func main() { r := mux.NewRouter() r.HandleFunc("/users", handler.GetUsers).Methods("GET") r.HandleFunc("/users", handler.CreateUser).Methods("POST")
log.Println("Server started on :8080") log.Fatal(http.ListenAndServe(":8080", r))}4. Middleware: التسجيل والمصادقة
Middleware جزء لا يتجزأ من الميكروسيرفيسات.