परिचय: माइक्रोसर्विसेज़ के लिए Go आदर्श भाषा क्यों है?
\n\nमाइक्रोसर्विस आर्किटेक्चर आधुनिक स्केलेबल एप्लिकेशन बनाने के लिए डी-फैक्टो मानक बन गया है। Google की प्रयोगशालाओं में बनाई गई Go भाषा (Golang) अपनी सरलता, प्रदर्शन और अंतर्निहित समवर्ती समर्थन के कारण इस कार्य के लिए आदर्श है। इस लेख में, हम Go में माइक्रोसर्विस बनाने के पूरे चक्र को समझेंगे: आर्किटेक्चर डिज़ाइन से लेकर प्रोडक्शन में डिप्लॉयमेंट तक।
\n\nGo तेज़ कंपाइलेशन, न्यूनतम मेमोरी खपत और गोरूटीन के साथ मूल कार्य प्रदान करता है - जो हल्के थ्रेड हैं। यह इसे उच्च-लोड वितरित सिस्टम के लिए एक उत्कृष्ट विकल्प बनाता है। हम प्रमुख अवधारणाओं पर चर्चा करेंगे, कोड उदाहरण लिखेंगे और सर्वोत्तम प्रथाओं पर चर्चा करेंगे।
\n\n1. Go में माइक्रोसर्विस आर्किटेक्चर डिज़ाइन करना
\n\n1.1. माइक्रोसर्विस आर्किटेक्चर के सिद्धांत
\n\nकोड लिखने से पहले, माइक्रोसर्विसेज़ की सीमाओं को परिभाषित करना आवश्यक है। मुख्य सिद्धांत:
\n\n- \n
- एकल जिम्मेदारी (Single Responsibility) — प्रत्येक सेवा एक व्यावसायिक कार्य के लिए जिम्मेदार है। \n
- स्वतंत्र डिप्लॉयमेंट — प्रत्येक माइक्रोसर्विस को पूरे सिस्टम को रोके बिना अपडेट किया जा सकता है। \n
- ढीला युग्मन (Loose Coupling) — सेवाएँ स्पष्ट रूप से परिभाषित API के माध्यम से संवाद करती हैं। \n
- डेटा प्रबंधन का विकेंद्रीकरण — प्रत्येक सेवा का अपना डेटाबेस होता है। \n
1.2. माइक्रोसर्विस के लिए Go प्रोजेक्ट संरचना
\n\nGo में माइक्रोसर्विस के लिए अनुशंसित फ़ोल्डर संरचना:
\n\nmy-service/\n├── cmd/\n│ └── server/\n│ └── main.go # प्रवेश बिंदु\n├── internal/\n│ ├── handler/ # HTTP/gRPC हैंडलर\n│ ├── service/ # व्यावसायिक तर्क\n│ ├── repository/ # DB के साथ कार्य\n│ └── model/ # डेटा संरचनाएँ\n├── pkg/\n│ └── api/ # सामान्य प्रोटो फ़ाइलें (gRPC)\n├── config/\n│ └── config.go # कॉन्फ़िगरेशन\n├── migrations/ # DB माइग्रेशन\n├── Dockerfile\n└── go.mod\n\n1.3. एक सरल माइक्रोसर्विस का उदाहरण
\n\nहम उपयोगकर्ताओं के प्रबंधन के लिए एक बुनियादी HTTP माइक्रोसर्विस बनाएंगे। मॉडल और रिपॉजिटरी को परिभाषित करके शुरू करें:
\n\n// internal/model/user.go\npackage model\n\ntype User struct {\n ID int64 `json:"id"`\n Name string `json:"name"`\n Email string `json:"email"`\n}\n\n// internal/repository/user_repo.go\npackage repository\n\nimport (\n "context"\n "my-service/internal/model"\n)\n\ntype UserRepository interface {\n GetByID(ctx context.Context, id int64) (*model.User, error)\n Create(ctx context.Context, user *model.User) (int64, error)\n}\n\ntype inMemoryRepo struct {\n users map[int64]*model.User\n nextID int64\n}\n\nfunc NewInMemoryRepo() UserRepository {\n return &inMemoryRepo{\n users: make(map[int64]*model.User),\n nextID: 1,\n }\n}\n\nfunc (r *inMemoryRepo) GetByID(ctx context.Context, id int64) (*model.User, error) {\n user, ok := r.users[id]\n if !ok {\n return nil, fmt.Errorf("user not found")\n }\n return user, nil\n}\n\nfunc (r *inMemoryRepo) Create(ctx context.Context, user *model.User) (int64, error) {\n user.ID = r.nextID\n r.users[user.ID] = user\n r.nextID++\n return user.ID, nil\n}\n\n2. माइक्रोसर्विसेज़ के बीच संचार: REST, gRPC और कतारें
\n\n2.1. Go में REST API
\n\nसिंक्रोनस इंटरैक्शन के लिए, आमतौर पर REST या gRPC का उपयोग किया जाता है। मानक लाइब्रेरी net/http और राउटर chi का उपयोग करके REST कंट्रोलर पर विचार करें:
// internal/handler/user_handler.go\npackage handler\n\nimport (\n "encoding/json"\n "net/http"\n "strconv"\n "my-service/internal/service"\n "github.com/go-chi/chi/v5"\n)\n\ntype UserHandler struct {\n svc *service.UserService\n}\n\nfunc NewUserHandler(svc *service.UserService) *UserHandler {\n