मेरे प्रकाशनों के पाठक संभवतः माइक्रोसर्विस विकसित करने के लिए API फर्स्ट दृष्टिकोण को लागू करने के विचार से परिचित होंगे। अनगिनत बार, मैंने किसी भी विकास की शुरुआत से पहले प्रत्याशित URI और अंतर्निहित ऑब्जेक्ट मॉडल का वर्णन करने के लाभों को महसूस किया है।
हालाँकि, प्रौद्योगिकी के क्षेत्र में 30 से अधिक वर्षों के अनुभव के बाद, मैं वैकल्पिक प्रवाह की वास्तविकताओं की अपेक्षा करने लगा हूँ। दूसरे शब्दों में, मुझे पूरी उम्मीद है कि ऐसी परिस्थितियाँ होंगी जहाँ API फर्स्ट संभव नहीं होगा।
इस लेख के लिए, मैं एक उदाहरण के माध्यम से यह बताना चाहता था कि कैसे माइक्रोसर्विसेस का उत्पादन करने वाली टीमें, openapi.json फ़ाइल को मैन्युअल रूप से परिभाषित किए बिना भी दूसरों के उपयोग के लिए OpenAPI विनिर्देश प्रदान करने में सफल हो सकती हैं।
मैं अपने सुविधा क्षेत्र से बाहर निकलकर जावा, .NET या यहां तक कि जावास्क्रिप्ट का उपयोग किए बिना भी ऐसा करना चाहता था।
अपने अधिकांश लेखों के अंत में, मैं अक्सर अपने व्यक्तिगत मिशन वक्तव्य का उल्लेख करता हूँ:
"अपना समय उन सुविधाओं/कार्यक्षमताओं को प्रदान करने पर केंद्रित करें जो आपकी बौद्धिक संपदा के मूल्य को बढ़ाती हैं। बाकी सभी चीज़ों के लिए फ्रेमवर्क, उत्पादों और सेवाओं का लाभ उठाएँ।" - जे. वेस्टर
इस मिशन वक्तव्य में मेरा उद्देश्य उच्च स्तर पर निर्धारित लक्ष्यों और उद्देश्यों तक पहुँचने का प्रयास करते समय अपने समय का सर्वोत्तम उपयोग करने के लिए खुद को उत्तरदायी बनाना है। मूल रूप से, यदि हमारा ध्यान अधिक विजेट बेचने पर है, तो मेरा समय इसे संभव बनाने के तरीके खोजने में व्यतीत होना चाहिए - उन चुनौतियों से दूर रहना जो पहले से ही मौजूदा ढाँचों, उत्पादों या सेवाओं द्वारा हल की जा चुकी हैं।
मैंने अपने नए माइक्रोसर्विस के लिए प्रोग्रामिंग भाषा के रूप में पायथन को चुना। आज तक, मैंने अपने पिछले लेखों के लिए जो पायथन कोड लिखा है, उसका 99% स्टैक ओवरफ्लो ड्रिवेन डेवलपमेंट (SODD) या चैटGPT-संचालित उत्तरों का परिणाम है। स्पष्ट रूप से, पायथन मेरे आराम क्षेत्र से बाहर है।
अब जब मैंने यह तय कर लिया है कि चीजें कहाँ खड़ी हैं, तो मैं एक नया पायथन-आधारित RESTful माइक्रोसर्विस बनाना चाहता था जो स्रोत भाषा में न्यूनतम अनुभव के साथ मेरे व्यक्तिगत मिशन वक्तव्य का पालन करता हो।
तभी मुझे FastAPI मिला।
FastAPI 2018 से मौजूद है और यह Python-प्रकार के संकेतों का उपयोग करके RESTful API देने पर केंद्रित एक फ्रेमवर्क है। FastAPI के बारे में सबसे अच्छी बात यह है कि डेवलपर के दृष्टिकोण से बिना किसी अतिरिक्त प्रयास के OpenAPI 3 विनिर्देशों को स्वचालित रूप से उत्पन्न करने की क्षमता है।
इस लेख के लिए, मेरे मन में आर्टिकल एपीआई का विचार आया, जो एक RESTful एपीआई उपलब्ध कराता है, जो उपभोक्ताओं को मेरे हाल ही में प्रकाशित लेखों की सूची प्राप्त करने की अनुमति देता है।
चीजों को सरल रखने के लिए, मान लें कि किसी दिए गए Article
में निम्नलिखित गुण हैं:
id
- सरल, अद्वितीय पहचानकर्ता गुण (संख्या)title
- लेख का शीर्षक (स्ट्रिंग)url
– लेख का पूरा URL (स्ट्रिंग)year
- वह वर्ष जब लेख प्रकाशित हुआ (संख्या)
आलेख API में निम्नलिखित URI शामिल होंगे:
/articles
– लेखों की सूची प्राप्त करेगा/articles/{article_id}
– id प्रॉपर्टी द्वारा एकल आलेख प्राप्त करेगा/articles
– एक नया लेख जोड़ता हैअपने टर्मिनल में, मैंने fast-api-demo नाम से एक नया पायथन प्रोजेक्ट बनाया और फिर निम्नलिखित कमांड निष्पादित किए:
$ pip install --upgrade pip $ pip install fastapi $ pip install uvicorn
मैंने api.py
नाम से एक नई पायथन फ़ाइल बनाई और कुछ आयात जोड़े, साथ ही एक app
वैरिएबल भी स्थापित किया:
from fastapi import FastAPI, HTTPException from pydantic import BaseModel app = FastAPI() if __name__ == "__main__": import uvicorn uvicorn.run(app, host="localhost", port=8000)
इसके बाद, मैंने आर्टिकल एपीआई उपयोग मामले से मेल खाने के लिए एक Article
ऑब्जेक्ट परिभाषित किया:
class Article(BaseModel): id: int title: str url: str year: int
मॉडल स्थापित होने के बाद, मुझे URI जोड़ने की आवश्यकता थी... जो काफी आसान निकला:
# Route to add a new article @app.post("/articles") def create_article(article: Article): articles.append(article) return article # Route to get all articles @app.get("/articles") def get_articles(): return articles # Route to get a specific article by ID @app.get("/articles/{article_id}") def get_article(article_id: int): for article in articles: if article.id == article_id: return article raise HTTPException(status_code=404, detail="Article not found")
किसी बाहरी डेटा भण्डार को शामिल करने से बचने के लिए, मैंने अपने हाल ही में प्रकाशित कुछ लेखों को प्रोग्रामेटिक रूप से जोड़ने का निर्णय लिया:
articles = [ Article(id=1, title="Distributed Cloud Architecture for Resilient Systems: Rethink Your Approach To Resilient Cloud Services", url="https://dzone.com/articles/distributed-cloud-architecture-for-resilient-syste", year=2023), Article(id=2, title="Using Unblocked to Fix a Service That Nobody Owns", url="https://dzone.com/articles/using-unblocked-to-fix-a-service-that-nobody-owns", year=2023), Article(id=3, title="Exploring the Horizon of Microservices With KubeMQ's New Control Center", url="https://dzone.com/articles/exploring-the-horizon-of-microservices-with-kubemq", year=2024), Article(id=4, title="Build a Digital Collectibles Portal Using Flow and Cadence (Part 1)", url="https://dzone.com/articles/build-a-digital-collectibles-portal-using-flow-and-1", year=2024), Article(id=5, title="Build a Flow Collectibles Portal Using Cadence (Part 2)", url="https://dzone.com/articles/build-a-flow-collectibles-portal-using-cadence-par-1", year=2024), Article(id=6, title="Eliminate Human-Based Actions With Automated Deployments: Improving Commit-to-Deploy Ratios Along the Way", url="https://dzone.com/articles/eliminate-human-based-actions-with-automated-deplo", year=2024), Article(id=7, title="Vector Tutorial: Conducting Similarity Search in Enterprise Data", url="https://dzone.com/articles/using-pgvector-to-locate-similarities-in-enterpris", year=2024), Article(id=8, title="DevSecOps: It's Time To Pay for Your Demand, Not Ingestion", url="https://dzone.com/articles/devsecops-its-time-to-pay-for-your-demand", year=2024), ]
मानो या न मानो, इससे आर्टिकल एपीआई माइक्रोसर्विस का विकास पूरा हो गया है।
त्वरित जांच के लिए, मैंने अपनी API सेवा को स्थानीय स्तर पर शुरू किया:
$ python api.py INFO: Started server process [320774] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://localhost:8000 (Press CTRL+C to quit)
फिर, एक अन्य टर्मिनल विंडो में, मैंने एक कर्ल अनुरोध भेजा (और इसे json_pp
पर पाइप किया):
$ curl localhost:8000/articles/1 | json_pp { "id": 1, "title": "Distributed Cloud Architecture for Resilient Systems: Rethink Your Approach To Resilient Cloud Services", "url": "https://dzone.com/articles/distributed-cloud-architecture-for-resilient-syste", "year": 2023 }
आर्टिकल एपीआई को स्थानीय रूप से चलाने के बजाय, मैंने सोचा कि मैं देखूंगा कि मैं कितनी आसानी से माइक्रोसर्विस को तैनात कर सकता हूं। चूंकि मैंने पहले कभी Heroku में पायथन माइक्रोसर्विस को तैनात नहीं किया था, इसलिए मुझे लगा कि अब कोशिश करने का एक बढ़िया समय होगा।
Heroku में गोता लगाने से पहले, मुझे सेवा के लिए निर्भरता का वर्णन करने के लिए एक requirements.txt
फ़ाइल बनाने की आवश्यकता थी। ऐसा करने के लिए, मैंने pipreqs
स्थापित और निष्पादित किया:
$ pip install pipreqs $ pipreqs
इससे मेरे लिए एक requirements.txt
फ़ाइल बन गई, जिसमें निम्नलिखित जानकारी थी:
fastapi==0.110.1 pydantic==2.6.4 uvicorn==0.29.0
मुझे Procfile
नाम की एक फ़ाइल की भी ज़रूरत थी जो Heroku को बताती है कि uvicorn
के साथ मेरी माइक्रोसर्विस को कैसे स्पिन अप करना है। इसकी सामग्री इस तरह दिखती थी:
web: uvicorn api:app --host=0.0.0.0 --port=${PORT}
आपमें से जो लोग पायथन में नए हैं (जैसे मैं हूं), उनके लिए मैंने एक सहायक मार्गदर्शिका के रूप में 'हेरोकू पर पायथन के साथ आरंभ करना' दस्तावेज़ का उपयोग किया है।
चूंकि मेरे पास पहले से ही Heroku CLI स्थापित थी, मुझे बस अपने टर्मिनल से Heroku इकोसिस्टम में लॉग इन करना था:
$ heroku login
मैंने यह सुनिश्चित किया कि मैं अपने सभी अपडेट्स को GitLab पर अपने रिपॉजिटरी में जांच लूं।
इसके बाद, Heroku में एक नए ऐप का निर्माण निम्नलिखित कमांड के माध्यम से CLI का उपयोग करके पूरा किया जा सकता है:
$ heroku create
CLI ने एक अद्वितीय ऐप नाम के साथ प्रतिक्रिया दी, साथ ही ऐप के लिए URL और ऐप से संबद्ध git-आधारित रिपोजिटरी भी दी:
Creating app... done, powerful-bayou-23686 https://powerful-bayou-23686-2d5be7cf118b.herokuapp.com/ | https://git.heroku.com/powerful-bayou-23686.git
कृपया ध्यान दें - जब तक आप यह लेख पढ़ेंगे, तब तक मेरा ऐप ऑनलाइन नहीं रहेगा।
इसे देखें। जब मैं git remote कमांड जारी करता हूँ, तो मैं देख सकता हूँ कि एक रिमोट स्वचालित रूप से Heroku इकोसिस्टम में जुड़ गया है:
$ git remote heroku origin
fast-api-demo
ऐप को हेरोकू पर तैनात करने के लिए, मुझे बस निम्नलिखित कमांड का उपयोग करना होगा:
$ git push heroku main
सब कुछ सेट होने के बाद, मैं यह सत्यापित करने में सक्षम था कि मेरी नई पायथन-आधारित सेवा हेरोकू डैशबोर्ड में चालू है:
सेवा चालू होने पर, निम्नलिखित कर्ल कमांड जारी करके आर्टिकल एपीआई से id = 1
वाले Article
पुनः प्राप्त करना संभव है:
$ curl --location 'https://powerful-bayou-23686-2d5be7cf118b.herokuapp.com/articles/1'
कर्ल कमांड 200 OK प्रतिक्रिया और निम्नलिखित JSON पेलोड लौटाता है:
{ "id": 1, "title": "Distributed Cloud Architecture for Resilient Systems: Rethink Your Approach To Resilient Cloud Services", "url": "https://dzone.com/articles/distributed-cloud-architecture-for-resilient-syste", "year": 2023 }
FastAPI की अंतर्निहित OpenAPI कार्यक्षमता का लाभ उठाने से उपभोक्ताओं को स्वचालित रूप से उत्पन्न /docs
URI पर नेविगेट करके पूरी तरह कार्यात्मक v3 विनिर्देश प्राप्त करने की अनुमति मिलती है:
https://powerful-bayou-23686-2d5be7cf118b.herokuapp.com/docs
इस URL को कॉल करने पर व्यापक रूप से अपनाए गए Swagger UI का उपयोग करके Article API माइक्रोसर्विस लौटता है:
जो लोग आर्टिकल एपीआई का उपयोग करने के लिए क्लाइंट उत्पन्न करने हेतु openapi.json
फ़ाइल की तलाश कर रहे हैं, उनके लिए /openapi.json
URI का उपयोग किया जा सकता है:
https://powerful-bayou-23686-2d5be7cf118b.herokuapp.com/openapi.json
मेरे उदाहरण के लिए, JSON-आधारित OpenAPI v3 विनिर्देश नीचे दिखाए अनुसार दिखाई देता है:
{ "openapi": "3.1.0", "info": { "title": "FastAPI", "version": "0.1.0" }, "paths": { "/articles": { "get": { "summary": "Get Articles", "operationId": "get_articles_articles_get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { } } } } } }, "post": { "summary": "Create Article", "operationId": "create_article_articles_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Article" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/articles/{article_id}": { "get": { "summary": "Get Article", "operationId": "get_article_articles__article_id__get", "parameters": [ { "name": "article_id", "in": "path", "required": true, "schema": { "type": "integer", "title": "Article Id" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } } }, "components": { "schemas": { "Article": { "properties": { "id": { "type": "integer", "title": "Id" }, "title": { "type": "string", "title": "Title" }, "url": { "type": "string", "title": "Url" }, "year": { "type": "integer", "title": "Year" } }, "type": "object", "required": [ "id", "title", "url", "year" ], "title": "Article" }, "HTTPValidationError": { "properties": { "detail": { "items": { "$ref": "#/components/schemas/ValidationError" }, "type": "array", "title": "Detail" } }, "type": "object", "title": "HTTPValidationError" }, "ValidationError": { "properties": { "loc": { "items": { "anyOf": [ { "type": "string" }, { "type": "integer" } ] }, "type": "array", "title": "Location" }, "msg": { "type": "string", "title": "Message" }, "type": { "type": "string", "title": "Error Type" } }, "type": "object", "required": [ "loc", "msg", "type" ], "title": "ValidationError" } } } }
परिणामस्वरूप, निम्नलिखित विनिर्देश का उपयोग OpenAPI जेनरेटर के माध्यम से कई अलग-अलग भाषाओं में क्लाइंट उत्पन्न करने के लिए किया जा सकता है।
इस लेख की शुरुआत में, मैं लड़ाई के लिए तैयार था और किसी भी ऐसे व्यक्ति का सामना करने के लिए तैयार था जो API First दृष्टिकोण का उपयोग करने में रुचि नहीं रखता था। इस अभ्यास से मैंने जो सीखा वह यह है कि FastAPI जैसा उत्पाद एक कार्यशील RESTful माइक्रोसर्विस को जल्दी से परिभाषित करने और बनाने में मदद कर सकता है जबकि एक पूरी तरह से उपभोग योग्य OpenAPI v3 विनिर्देश भी शामिल है ... स्वचालित रूप से।
पता चला कि, FastAPI टीमों को एक ऐसे ढांचे का लाभ उठाकर अपने लक्ष्यों और उद्देश्यों पर ध्यान केंद्रित करने की अनुमति देता है जो दूसरों के लिए भरोसा करने के लिए एक मानकीकृत अनुबंध प्रदान करता है। नतीजतन, मेरे व्यक्तिगत मिशन वक्तव्य का पालन करने के लिए एक और रास्ता सामने आया है।
इस दौरान, मैंने पहली बार पाइथन-आधारित सेवा को तैनात करने के लिए Heroku का उपयोग किया। इसके लिए मुझे कुछ अच्छी तरह से लिखे गए दस्तावेज़ों की समीक्षा करने के अलावा, बहुत कम प्रयास करने पड़े। इसलिए Heroku प्लेटफ़ॉर्म के लिए एक और मिशन स्टेटमेंट बोनस का उल्लेख किया जाना चाहिए।
यदि आप इस लेख के स्रोत कोड में रुचि रखते हैं, तो आप इसे GitLab पर पा सकते हैं।
आपका दिन सचमुच बहुत अच्छा हो!