ميكروسيرفيسات بلغة Go: الهندسة والتطبيق من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في الميكروسيرفيسات بلغة 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 جزء لا يتجزأ من الميكروسيرفيسات.

المدونات

توصيات الكتب