الخدمات المصغرة بلغة Go: الهندسة والتطبيق للمطورين

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

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

ابدأ الدورة

مقدمة في الخدمات المصغرة باستخدام Go

أصبحت بنية الخدمات المصغرة (Microservices) المعيار لبناء تطبيقات قابلة للتوسع ومتسامحة مع الأخطاء. لغة Go (Golang) مثالية لتطوير الخدمات المصغرة بفضل أدائها العالي، ودعمها المدمج للتوازي (Concurrency)، وسهولة نشرها. في هذه المقالة، سنستعرض المبادئ الأساسية لبناء الخدمات المصغرة باستخدام Go، وسننشئ خدمة بسيطة مع REST API، ونتصل بقاعدة بيانات، ونوضح كيفية حاوية التطبيق باستخدام Docker.



أساسيات بنية الخدمات المصغرة

الخدمات المصغرة هي نهج يتم فيه تقسيم التطبيق إلى خدمات صغيرة ومستقلة قابلة للنشر. كل خدمة مسؤولة عن منطق أعمالها الخاص وتتفاعل مع الخدمات الأخرى عبر بروتوكولات خفيفة (عادةً HTTP/REST أو gRPC).



مزايا الخدمات المصغرة باستخدام Go

  • الأداء: يتم ترجمة Go إلى كود آلة، مما يعطي سرعة تنفيذ عالية.
  • التوازي: تسمح Goroutines و Channels بمعالجة آلاف الطلبات بكفاءة.
  • سهولة النشر: الملف الثنائي (Binary) لا يتطلب تبعيات خارجية.
  • المكتبة القياسية المدمجة: حزم مثل net/http و encoding/json وغيرها تغطي معظم المهام.


المبادئ الأساسية للتصميم

  • المسؤولية الواحدة: كل خدمة تحل مشكلة واحدة.
  • الاستقلالية: يمكن تطوير الخدمات واختبارها ونشرها بشكل منفصل.
  • الترابط الضعيف: التغييرات في خدمة واحدة يجب ألا تعطل الخدمات الأخرى.
  • تحمل الأخطاء: فشل خدمة واحدة يجب ألا ينهار النظام بأكمله.


تطبيق عملي: إنشاء خدمة مصغرة باستخدام Go

لنقم بإنشاء خدمة مصغرة بسيطة لإدارة المستخدمين. ستوفر REST API لإنشاء وقراءة وتحديث وحذف المستخدمين (CRUD).



الخطوة 1: تهيئة المشروع

قم بإنشاء دليل المشروع وتهيئة وحدة Go:

mkdir user-servicecd user-servicego mod init github.com/yourusername/user-service


الخطوة 2: هيكل المشروع

نظم الكود في حزم (Packages):

user-service/├── cmd/│   └── main.go├── internal/│   ├── handler/│   │   └── user.go│   ├── model/│   │   └── user.go│   └── repository/│       └── user.go├── go.mod└── go.sum


الخطوة 3: تعريف نموذج البيانات

لنقم بإنشاء هيكل المستخدم في ملف internal/model/user.go:

package model

type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"`}


الخطوة 4: تنفيذ التخزين (المستودع)

للبساطة، سنستخدم تخزينًا في الذاكرة (in-memory). لنقم بإنشاء internal/repository/user.go:

package repository

import ( "sync" "user-service/internal/model")

type UserRepository struct { mu sync.RWMutex users map[int]model.User nextID int}

func NewUserRepository() *UserRepository { return &UserRepository{ users: make(map[int]model.User), nextID: 1, }}

func (r *UserRepository) Create(user model.User) model.User { r.mu.Lock() defer r.mu.Unlock() user.ID = r.nextID r.nextID++ r.users[user.ID] = user return user}

func (r *UserRepository) GetByID(id int) (model.User, bool) { r.mu.RLock() defer r.mu.RUnlock() user, ok := r.users[id] return user, ok}

func (r *UserRepository) GetAll() []model.User { r.mu.RLock() defer r.mu.RUnlock() result := make([]model.User, 0, len(r.users)) for _, user := range r.users { result = append(result, user) } return result}

func (r *UserRepository) Update(id int, user model.Us

المدونات

توصيات الكتب