PHP Academy · पाठ

API गेटवे और सेवा खोज

सेवाओं को गतिशील रूप से रूट, एकत्र और खोजें।

पाठ 3, कुल 4 में से13 चरण

API गेटवे और सेवा खोज, CoddyKit पर PHP Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह PHP Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। PHP Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

गेटवे और सेवा-खोज

जब आपके पास दर्जन भर सेवाएँ हो जाती हैं, तो दो समस्याएँ सामने आती हैं। क्लाइंट को हर सेवा का पता जानने या एक स्क्रीन दिखाने के लिए पाँच सेवाओं को कॉल करने की ज़रूरत नहीं होनी चाहिए—यह एपीआई गेटवे का काम है। और जो सेवाएँ बढ़ती-घटती हैं तथा अपने आईपी पते बदलती हैं, उन्हें एक-दूसरे को खोजने का कोई तरीका चाहिए—इसे सेवा-खोज कहते हैं।

इस पाठ में दोनों विषय शामिल हैं, जिसमें गेटवे के बाहरी स्तर पर PHP का उपयोग किया गया है।

एपीआई गेटवे क्या करता है

एपीआई गेटवे आपकी सेवाओं के सामने स्थित एकल प्रवेश-बिंदु है। इसकी सामान्य ज़िम्मेदारियाँ हैं:

  • सही बैकएंड तक अनुरोधों का मार्ग-निर्देशन करना।
  • साझी चिंताएँ: प्रमाणीकरण, दर-सीमा निर्धारण, CORS और TLS समापन।
  • एकत्रीकरण: कई बैकएंड कॉल को एक क्लाइंट प्रतिक्रिया में संयोजित करना।
  • प्रोटोकॉल रूपांतरण: बाहरी REST से अनुरोध लेना और आंतरिक gRPC में भेजना।

यह क्लाइंट को सरल रखता है और उन नीतियों को केंद्रीकृत करता है जिन्हें अन्यथा आप हर सेवा में दोहराते।

एज स्तर पर मार्ग-निर्देशन

मूल रूप से, गेटवे आने वाले पथ को किसी अपस्ट्रीम सेवा से जोड़ता है। प्रोडक्शन गेटवे (Kong, Traefik, Nginx, AWS API Gateway) यह काम घोषणात्मक रूप से करते हैं, लेकिन इसे PHP में समझाने के लिए तर्क पर्याप्त रूप से सरल है।

<?php
$routes = [
    '#^/api/orders#'    => 'http://orders-svc',
    '#^/api/customers#' => 'http://customers-svc',
    '#^/api/catalog#'   => 'http://catalog-svc',
];

function resolveUpstream(string $path, array $routes): ?string {
    foreach ($routes as $pattern => $upstream) {
        if (preg_match($pattern, $path)) {
            return $upstream . $path;
        }
    }
    return null; // 404 at the gateway
}

echo resolveUpstream('/api/orders/42', $routes), "\n";

प्रमाणीकरण का केंद्रीकरण

गेटवे पर कॉल करने वाले की एक बार जाँच करें, फिर विश्वसनीय पहचान को डाउनस्ट्रीम भेजें, ताकि हर सेवा को मूल टोकन की दोबारा जाँच न करनी पड़े। गेटवे JWT के हस्ताक्षर और समाप्ति की जाँच करता है तथा आंतरिक अनुरोध में X-User-Id जैसे हेडर जोड़ता है (विश्वसनीय नेटवर्क के माध्यम से)।

<?php
function authenticate(string $authHeader): ?array {
    if (!str_starts_with($authHeader, 'Bearer ')) return null;
    $jwt = substr($authHeader, 7);
    $claims = verifyJwt($jwt);            // signature + exp check
    if ($claims === null) return null;
    // Forward minimal trusted identity to internal services
    return ['X-User-Id' => $claims['sub'], 'X-Scopes' => implode(',', $claims['scopes'])];
}
function verifyJwt(string $j): ?array { return ['sub' => 'u-7', 'scopes' => ['orders:read']]; }
print_r(authenticate('Bearer abc.def.ghi'));

प्रतिक्रिया का एकत्रीकरण

मोबाइल स्क्रीन को ऑर्डर, ग्राहक और कैटलॉग का डेटा चाहिए हो सकता है। क्लाइंट से तीन कॉल करवाने के बजाय गेटवे कई दिशाओं में अनुरोध भेजता है, प्रतीक्षा करता है और परिणामों को मिला देता है। इसे तेज़ रखने के लिए अपस्ट्रीम कॉल क्रमिक रूप से करने के बजाय समवर्ती रूप से करें (Guzzle के वादे / curl_multi)।

<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Promise\Utils;

$http = new Client(['timeout' => 2.0]);
$promises = [
    'order'    => $http->getAsync('http://orders-svc/orders/42'),
    'customer' => $http->getAsync('http://customers-svc/customers/7'),
    'catalog'  => $http->getAsync('http://catalog-svc/items?order=42'),
];
$results = Utils::settle($promises)->wait(); // run in parallel
// merge the fulfilled bodies into one response for the client

फ्रंटएंड के लिए बैकएंड

एक सामान्य गेटवे वेब ऐप, मोबाइल ऐप और साझेदारों की ज़रूरतों को समान रूप से पूरा नहीं कर पाता—हर किसी को अलग-अलग एकत्रीकरण और डेटा-रूप चाहिए होते हैं। बैकएंड-फॉर-फ्रंटएंड (BFF) प्रतिरूप हर क्लाइंट प्रकार को उसकी ज़रूरत के अनुसार बनाया गया अपना छोटा गेटवे देता है, जबकि साझा सेवाएँ सामान्य बनी रहती हैं।

इससे एक अत्यधिक बड़ा सर्वशक्तिमान गेटवे बनाने से बचा जा सकता है और हर क्लाइंट टीम स्वतंत्र रूप से आगे बढ़ सकती है।

सेवा-खोज की समस्या

गतिशील परिवेश में इंस्टेंस आते-जाते रहते हैं और उनके आईपी पते बदलते रहते हैं। http://10.0.3.14:8080 को स्थायी रूप से लिख देना अस्थिर होता है। सेवा-खोज इस बात की सक्रिय रजिस्ट्री बनाए रखती है कि "इस समय सेवा X के कौन-से स्वस्थ इंस्टेंस मौजूद हैं", ताकि कॉल करने वाले कॉल के समय किसी तार्किक नाम को वास्तविक पते में बदल सकें।

क्लाइंट-पक्षीय बनाम सर्वर-पक्षीय सेवा-खोज

दो मॉडल हैं:

  • क्लाइंट-पक्षीय — कॉल करने वाला रजिस्ट्री (Consul, etcd) से पूछता है और स्वयं एक इंस्टेंस चुनता है तथा अपना लोड संतुलन करता है।
  • सर्वर-पक्षीय — कॉल करने वाला एक स्थिर आभासी पते (लोड बैलेंसर / Kubernetes Service) पर जाता है, जो उसके लिए इंस्टेंस खोजकर लोड संतुलित करता है।

Kubernetes में आपको आमतौर पर सर्वर-पक्षीय सेवा-खोज बिना किसी अतिरिक्त प्रयास के मिल जाती है: http://customers-svc को कॉल करें और क्लस्टर DNS तथा Service बाकी काम संभालते हैं। Kubernetes के बाहर Consul जैसी रजिस्ट्रियाँ आम हैं।

रजिस्ट्री से पूछताछ

क्लाइंट-पक्षीय सेवा-खोज में PHP कॉल करने वाला स्वस्थ इंस्टेंस के लिए रजिस्ट्री से पूछता है और उनमें से एक चुनता है। रजिस्ट्री केवल स्वास्थ्य-जाँच में सफल इंस्टेंस लौटाती है, इसलिए मृत नोड अपने-आप बाहर रह जाते हैं।

<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;

function discover(Client $http, string $service): string {
    // Consul: only passing-health instances
    $res = $http->get("http://consul:8500/v1/health/service/$service?passing=true");
    $nodes = json_decode((string) $res->getBody(), true);
    if (!$nodes) throw new \RuntimeException("No healthy $service");
    $pick = $nodes[array_rand($nodes)]['Service']; // simple LB
    return "http://{$pick['Address']}:{$pick['Port']}";
}

स्वास्थ्य-जाँच और पंजीकरण

सेवा-खोज उतनी ही अच्छी होती है जितना उसका स्वास्थ्य डेटा। हर सेवा एक /health एंडपॉइंट उपलब्ध कराती है, जो उसकी वास्तविक निर्भरताओं (डेटाबेस, कैश) की जाँच करता है, और शुरुआत में स्वयं को रजिस्टर करती है (या प्लेटफ़ॉर्म उसे रजिस्टर करता है)। रजिस्ट्री उस एंडपॉइंट की जाँच करती है और विफल इंस्टेंस हटा देती है।

स्वास्थ्य-जाँच को सार्थक बनाएँ: डेटाबेस बंद होने पर 200 लौटाना बेकार से भी बदतर है—इससे ट्रैफ़िक एक खराब नोड पर भेजा जाता है।

<?php
// GET /health
function health(PDO $db, Redis $cache): array {
    $checks = [
        'db'    => safe(fn() => $db->query('SELECT 1') !== false),
        'cache' => safe(fn() => $cache->ping() === '+PONG'),
    ];
    $ok = !in_array(false, $checks, true);
    http_response_code($ok ? 200 : 503);
    return ['status' => $ok ? 'pass' : 'fail', 'checks' => $checks];
}
function safe(callable $c): bool { try { return (bool) $c(); } catch (\Throwable) { return false; } }

जीवंतता बनाम तत्परता

एक स्वास्थ्य एंडपॉइंट पर्याप्त नहीं है—दो अलग-अलग सवालों में अंतर करें:

  • जीवंतता: "क्या प्रक्रिया जीवित है?" इसके विफल होने पर ऑर्केस्ट्रेटर कंटेनर को फिर से शुरू करता है। इसे सस्ता और निर्भरता-रहित रखें, वरना अस्थिर डेटाबेस बेवजह पुनःआरंभ करवा सकता है।
  • तत्परता: "क्या यह अभी ट्रैफ़िक संभाल सकता है?" इसके विफल होने पर ट्रैफ़िक रोक दिया जाता है, लेकिन प्रक्रिया चलती रहती है (जैसे कैश तैयार करना या डेटाबेस का अस्थायी रूप से पहुँच से बाहर होना)।

इन दोनों को एक मान लेने से पुनःआरंभ का चक्र शुरू हो सकता है या अभी तैयार न हुए नोड्स पर ट्रैफ़िक भेजा जा सकता है।

<?php
// GET /livez  - is the process itself healthy? (no external deps)
function livez(): void { http_response_code(200); echo 'alive'; }

// GET /readyz - should we receive traffic? (checks dependencies)
function readyz(PDO $db): void {
    try { $db->query('SELECT 1'); http_response_code(200); echo 'ready'; }
    catch (\Throwable) { http_response_code(503); echo 'not ready'; }
}

त्वरित जाँच

क्लाइंट के बार-बार आने-जाने वाले अनुरोध घटाना।

पुनरावलोकन

सेवाओं का मार्ग-निर्देशन और सेवा-खोज:

  • एपीआई गेटवे मार्ग-निर्देशन, प्रमाणीकरण, दर-सीमा निर्धारण, TLS और एकत्रीकरण को केंद्रीकृत करता है।
  • समवर्ती रूप से एकत्र करें; क्लाइंट की ज़रूरतें अलग हों तो BFF का उपयोग करें।
  • सेवा-खोज तार्किक नामों को सक्रिय, स्वस्थ इंस्टेंस में बदलती है।
  • क्लाइंट-पक्षीय (रजिस्ट्री से पूछताछ) बनाम सर्वर-पक्षीय (स्थिर LB / Kubernetes सेवा) सेवा-खोज।
  • सार्थक स्वास्थ्य-जाँच खराब नोड्स से ट्रैफ़िक दूर रखती है।

अगला विषय: जब कुछ हिस्से अनिवार्य रूप से विफल हों, तब इन सभी कॉल को लचीला बनाए रखना।

शुरुआत निःशुल्क

एआई शिक्षक के साथ PHP सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
49
पाठ
195

अक्सर पूछे जाने वाले प्रश्न

क्या “API गेटवे और सेवा खोज” पाठ निःशुल्क है?

हाँ—“API गेटवे और सेवा खोज” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और PHP Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। PHP Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“API गेटवे और सेवा खोज” में मैं क्या सीखूँगा?

सेवाओं को गतिशील रूप से रूट, एकत्र और खोजें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ PHP Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या PHP Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर PHP Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“API गेटवे और सेवा खोज” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस PHP Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर PHP Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. मोनोलिथ से माइक्रोसर्विसेज़ तक
  2. सेवा संचार: REST और gRPC
  3. API गेटवे और सेवा खोज
  4. लचीलापन: सर्किट ब्रेकर और पुनःप्रयास
← PHP Academy पर वापस जाएँ