Raziščite razvoj prehodov API v Pythonu z integracijo omrežja storitev. Naučite se o mikrostoritvah, usmerjanju, avtentikaciji in opazljivosti.
Prehod API Python: Implementacija omrežja storitev za sodobne arhitekture
V današnjem hitro razvijajočem se digitalnem okolju so arhitekture mikrostoritev postale norma za izgradnjo razširljivih, odpornih in vzdržljivih aplikacij. V središču teh arhitektur je potreba po učinkoviti in varni komunikaciji med storitvami. Tu nastopijo prehodi API in omrežja storitev. Ta članek raziskuje, kako zgraditi prehod API, ki temelji na Pythonu, in ga integrirati z omrežjem storitev, kar zagotavlja robustno rešitev za upravljanje komunikacije mikrostoritev v globalnem kontekstu.
Razumevanje prehodov API in omrežij storitev
Kaj je prehod API?
Prehod API deluje kot ena točka vstopa za vse zahteve odjemalcev do zaledja mikrostoritev. Obravnava naloge, kot so:
- Usmerjanje: Preusmerjanje zahtev v ustrezno mikrostoritev.
- Avtentikacija in avtorizacija: Preverjanje identitete odjemalca in zagotavljanje, da ima potrebna dovoljenja.
- Omejevanje hitrosti: Preprečevanje zlorabe in zagotavljanje poštene uporabe storitev.
- Transformacija zahtev: Spreminjanje zahtev pred pošiljanjem v zaledje.
- Agregacija odzivov: Združevanje odgovorov iz več mikrostoritev v en sam odgovor.
- Predpomnjenje: Zmanjševanje zakasnitve in izboljšanje zmogljivosti.
Predstavljajte si ga kot prefinjeno recepcijo za vašo aplikacijo, ki obravnava ves dohodni promet in zagotavlja, da pride na pravo mesto varno in učinkovito. Na primer, mobilna aplikacija v Avstraliji lahko pošlje zahtevo v prehod API, ki jo nato usmeri v storitev za določanje cen v Singapurju in storitev inventarja v Nemčiji, pri čemer agregira rezultate, preden jih vrne uporabniku.
Kaj je omrežje storitev?
Omrežje storitev je infrastrukturna plast, ki obravnava komunikacijo med storitvami v arhitekturi mikrostoritev. Zagotavlja funkcije, kot so:
- Odkrivanje storitev: Samodejno lociranje razpoložljivih primerkov storitve.
- Upravljanje prometa: Nadzor nad pretokom prometa med storitvami, vključno z uravnoteženjem obremenitve, usmerjanjem in prekinitvami vezij.
- Opazljivost: Zagotavljanje vpogledov v zmogljivost in zdravje storitev.
- Varnost: Šifriranje komunikacije med storitvami in uveljavljanje varnostnih politik.
Omrežje storitev običajno sestavljajo kontrolna ravnina (npr. Istio) in podatkovna ravnina (npr. Envoy). Podatkovna ravnina prestreže vso komunikacijo med storitvami in uporabi politike, ki jih določa kontrolna ravnina. Predstavljajte si omrežje nevidnih kurirjev, ki obravnavajo vso interno komunikacijo in zagotavljajo varno, zanesljivo in učinkovito dostavo sporočil. Omrežje storitev privzeto omogoča omrežje z ničelno zaupanjem – vsaka storitev avtentificira vsako drugo storitev, ne glede na to, kje se nahajajo. To je še posebej pomembno v multinacionalnih korporacijah s storitvami, razporejenimi po različnih geografskih regijah.
Zakaj združiti prehod API in omrežje storitev?
Medtem ko tako prehodi API kot omrežja storitev obravnavajo komunikacijo mikrostoritev, delujejo na različnih ravneh in rešujejo različne težave. Prehod API se osredotoča na upravljanje zunanjega prometa, medtem ko se omrežje storitev osredotoča na upravljanje notranjega prometa. Združitev obeh zagotavlja celovito rešitev za zaščito, upravljanje in opazovanje komunikacije mikrostoritev znotraj in zunaj gruče.
Na primer, razmislite o platformi za e-trgovino. Prehod API obravnava zahteve iz spletnih in mobilnih aplikacij, avtentificira uporabnike, uporablja omejitve hitrosti in usmerja zahteve v ustrezne storitve zaledja. Omrežje storitev upravlja komunikacijo med storitvami zaledja in zagotavlja varno in zanesljivo komunikacijo med katalogom izdelkov, upravljanjem naročil in storitvami obdelave plačil. Prehod API lahko uporablja zunanje storitve avtentikacije, kot sta Okta ali Auth0, medtem ko omrežje storitev zagotavlja varno komunikacijo med notranjimi storitvami z uporabo medsebojnega TLS (mTLS).
Izdelava prehoda API v Pythonu
Python je s svojim bogatim ekosistemom knjižnic in ogrodij odlična izbira za izgradnjo prehodov API. Uporabili bomo kombinacijo ogrodij za ustvarjanje razširljivega in vzdržljivega prehoda.
Izbira ogrodja
- FastAPI: Sodobno, visoko zmogljivo spletno ogrodje za izgradnjo API-jev. FastAPI omogoča samodejno preverjanje podatkov, serijsko obdelavo in ustvarjanje dokumentacije.
- Uvicorn: Strežnik ASGI za zagon asinhronih aplikacij Python.
- Requests: Knjižnica za pošiljanje zahtev HTTP v storitve zaledja. Za bolj zapletene scenarije razmislite o uporabi `httpx`, ki omogoča asinhrono podporo.
- PyJWT: Knjižnica za delo z žetoni JSON Web Tokens (JWT) za avtentikacijo.
Struktura projekta
api_gateway/ ├── main.py # Glavna datoteka aplikacije ├── config.py # Nastavitve konfiguracije ├── routes.py # Definicije usmerjanja API ├── auth.py # Logika avtentikacije ├── utils.py # Pomožne funkcije └── requirements.txt # Odvisnosti projekta
Primer kode: main.py
from fastapi import FastAPI, Depends, HTTPException, Request
from fastapi.responses import JSONResponse
import uvicorn
import requests
import jwt
from config import settings
from auth import verify_jwt
from routes import router
app = FastAPI()
app.include_router(router)
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
response = await call_next(request)
return response
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
Primer kode: routes.py
from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi.responses import JSONResponse
import requests
import jwt
from config import settings
from auth import verify_jwt
router = APIRouter()
@router.get("/products/{product_id}")
async def get_product(product_id: int, request: Request, is_authenticated: bool = Depends(verify_jwt)):
# Posreduj zahtevo storitvi izdelka
product_service_url = f"{settings.product_service_url}/products/{product_id}"
try:
response = requests.get(product_service_url)
response.raise_for_status() # Sproži HTTPError za slabe odgovore (4xx ali 5xx)
return response.json()
except requests.exceptions.RequestException as e:
raise HTTPException(status_code=500, detail=f"Napaka pri komunikaciji s storitvijo izdelka: {e}")
@router.post("/orders")
async def create_order(request: Request, is_authenticated: bool = Depends(verify_jwt)):
# Posreduj zahtevo storitvi naročil
order_service_url = f"{settings.order_service_url}/orders"
body = await request.json()
try:
response = requests.post(order_service_url, json=body)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
raise HTTPException(status_code=500, detail=f"Napaka pri komunikaciji s storitvijo naročil: {e}")
Primer kode: auth.py
from fastapi import HTTPException, Depends, Header
import jwt
from config import settings
from typing import Optional
async def verify_jwt(authorization: Optional[str] = Header(None)) -> bool:
if not authorization:
raise HTTPException(status_code=401, detail="Zahtevan je glavnik Authorization")
try:
token = authorization.split(" ")[1]
jwt.decode(token, settings.jwt_secret, algorithms=[settings.jwt_algorithm])
return True
except jwt.ExpiredSignatureError:
raise HTTPException(status_code=401, detail="Žeton je potekel")
except jwt.InvalidTokenError:
raise HTTPException(status_code=401, detail="Neveljaven žeton")
Primer kode: config.py
import os
from typing import Optional
from pydantic import BaseSettings
class Settings(BaseSettings):
product_service_url: str = os.getenv("PRODUCT_SERVICE_URL", "http://localhost:8001")
order_service_url: str = os.getenv("ORDER_SERVICE_URL", "http://localhost:8002")
jwt_secret: str = os.getenv("JWT_SECRET", "secret")
jwt_algorithm: str = os.getenv("JWT_ALGORITHM", "HS256")
settings = Settings()
Konfiguracija
Shranjujte nastavitve konfiguracije, kot so URL-ji storitev zaledja in avtentikacijski ključi, v ločeni konfiguracijski datoteki (npr. `config.py`). Uporabite spremenljivke okolja za konfiguracijo različnih okolij (razvoj, testiranje, produkcija).
Avtentikacija
Izvedite avtentikacijo z uporabo JWT-jev. Prehod API preveri JWT, preden posreduje zahtevo storitvi zaledja. Ta pristop spodbuja varnost in decentralizacijo. Za večje organizacije razmislite o integraciji s ponudnikom identitete, kot sta Keycloak ali Azure AD. S tem lahko centralizirate politike avtentikacije in avtorizacije.
Usmerjanje
Določite poti v ločeni datoteki (npr. `routes.py`). Uporabite funkcionalnost usmerjevalnika FastAPI za preslikavo dohodnih zahtev v ustrezne storitve zaledja. Izvedite usmerjanje na podlagi poti zahteve, metode HTTP in glav.
Primer: Dockerizacija prehoda API
Ustvarite `Dockerfile` za pakiranje prehoda API v posodo.
FROM python:3.9-slim-buster WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Integracija omrežja storitev
Integracija prehoda API v Pythonu z omrežjem storitev, kot je Istio, izboljša varnost, opazljivost in upravljanje prometa. Osredotočili se bomo na to, kako konfigurirati Istio za upravljanje prometa, ki teče skozi prehod API.
Namestitev Istia
Pred nadaljevanjem se prepričajte, da je Istio nameščen v vaši gruči Kubernetes. Za navodila za namestitev glejte uradno dokumentacijo Istia. Mnogi ponudniki storitev v oblaku, kot so AWS, Google Cloud in Azure, ponujajo upravljane storitve Istio, ki poenostavljajo uvajanje in upravljanje.
Vstavljanje pomožne datoteke
Istio uporablja pomožni proxy (Envoy) za prestrezanje vsega prometa v in iz storitve. Če želite omogočiti Istio za prehod API, morate vstaviti pomožni proxy v pod prehoda API. To običajno storite tako, da v uvajanje poda dodate opombo:
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-gateway
labels:
app: api-gateway
spec:
replicas: 1
selector:
matchLabels:
app: api-gateway
template:
metadata:
labels:
app: api-gateway
annotations:
sidecar.istio.io/inject: "true" # Omogoči vstavljanje pomožne datoteke Istio
spec:
containers:
- name: api-gateway
image: your-api-gateway-image:latest
ports:
- containerPort: 8000
Navidezna storitev in prehodi
Istio uporablja navidezne storitve in prehode za upravljanje usmerjanja prometa. Prehod določa vstopno točko za promet v mrežo, medtem ko navidezna storitev določa, kako je promet usmerjen v storitve znotraj mreže.
Ustvarjanje prehoda Istio
Določite prehod Istio za izpostavljanje prehoda API zunanjemu prometu.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: api-gateway-gateway
spec:
selector:
istio: ingressgateway # Uporabite privzeti vhodni prehod Istio
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*" # Zamenjajte z vašo domeno
Ustvarjanje navidezne storitve
Določite navidezno storitev za usmerjanje prometa iz prehoda v storitev prehoda API.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: api-gateway-virtualservice
spec:
hosts:
- "*" # Zamenjajte z vašo domeno
gateways:
- api-gateway-gateway
http:
- route:
- destination:
host: api-gateway # Ime storitve v Kubernetesu
port:
number: 8000 # Vrata, na katerih posluša prehod API
Upravljanje prometa z Istiom
Istio ponuja zmogljive zmožnosti upravljanja prometa, kot so:
- Uravnoteženje obremenitve: Porazdelitev prometa med več primerki storitve. Istio podpira različne algoritme uravnoteženja obremenitve, vključno z okroglo vrsto, najmanj povezav in doslednim razprševanjem.
- Razdeljevanje prometa (uvajanje kanarčkov): Postopno uvajanje novih različic storitve s pošiljanjem majhnega odstotka prometa v novo različico. To vam omogoča, da testirate nove funkcije v produkciji, ne da bi vplivali na vse uporabnike.
- Prekinitev vezja: Preprečevanje kaskadnih napak z avtomatičnim zaustavljanjem prometa do nezdravih storitev.
- Vstavljanje napak: Vstavljanje zamud ali napak v promet, da preizkusite odpornost vaše aplikacije.
Primer: uvajanje kanarčkov z Istiom
Če želite izvesti uvajanje kanarčka, lahko konfigurirate Istio, da pošlje majhen odstotek prometa (npr. 10 %) v novo različico prehoda API.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: api-gateway-virtualservice
spec:
hosts:
- "*" # Zamenjajte z vašo domeno
gateways:
- api-gateway-gateway
http:
- route:
- destination:
host: api-gateway # Različica 1
port:
number: 8000
weight: 90
- destination:
host: api-gateway-v2 # Različica 2 (Kanarček)
port:
number: 8000
weight: 10
Opazljivost
Nadzor in beleženje sta ključnega pomena za razumevanje zmogljivosti in zdravja vašega prehoda API in storitev zaledja. Implementirajte celovito opazljivost z uporabo orodij, kot so:
- Prometej: Sistem spremljanja za zbiranje in shranjevanje meritev. Istio se integrira s Prometejem za zagotavljanje meritev o prometu storitev, zakasnitvi in napakah.
- Grafana: Orodje za vizualizacijo podatkov za ustvarjanje nadzornih plošč za spremljanje vaše aplikacije.
- Jaeger: Sistem za distribuirano sledenje za sledenje zahtevam med njihovim pretokom skozi vaše mikrostoritve. Istio lahko samodejno ustvari sledi za vso komunikacijo med storitvami.
- Fluentd/Elasticsearch/Kibana (EFK Stack): Založnik zapisov za zbiranje, shranjevanje in analizo zapisov.
Telemetrija Istia
Istio samodejno zbira telemetrične podatke o prometu storitev, vključno z meritvami, dnevniki in sledmi. Te podatke lahko uporabite za spremljanje zmogljivosti in zdravja vašega prehoda API in storitev zaledja. Konfigurirajte Istio za izvoz telemetričnih podatkov v Prometheus, Grafano in Jaeger.
Meritve, specifične za prehod API
Poleg telemetričnih podatkov Istia morate zbirati tudi meritve, specifične za prehod API, kot so:
- Hitrost zahtev: Število zahtev na sekundo.
- Čas odziva: Povprečni čas, ki je potreben za obdelavo zahteve.
- Stopnja napak: Odstotek zahtev, ki povzročijo napako.
- Stopnja uspeha/neuspeha avtentikacije: Število uspešnih in neuspešnih poskusov avtentikacije.
- Hitrost zadetkov predpomnilnika: Odstotek zahtev, ki se postrežejo iz predpomnilnika.
Varnostni vidiki
Varnost je najpomembnejša pri izgradnji prehoda API. Upoštevajte naslednje varnostne ukrepe:
- Avtentikacija in avtorizacija: Izvedite robustne mehanizme za avtentikacijo in avtorizacijo, da zaščitite svoje storitve zaledja. Uporabite JWT, OAuth 2.0 ali druge industrijske standardne protokole.
- Preverjanje vnosa: Preverite vse dohodne zahteve, da preprečite napade z vbrizgavanjem.
- Omejevanje hitrosti: Uvedite omejevanje hitrosti, da preprečite zlorabo in napade zavrnitve storitve.
- Šifriranje TLS: Šifrirajte vso komunikacijo med prehodom API in storitvami zaledja z uporabo TLS. Istio zagotavlja samodejno šifriranje TLS z uporabo medsebojnega TLS (mTLS).
- Požarni zid spletne aplikacije (WAF): Uporabite WAF za zaščito pred običajnimi napadi spletnih aplikacij, kot sta vbrizgavanje SQL in skriptiranje med spletnimi mesti (XSS).
- Redne varnostne revizije: Izvajajte redne varnostne revizije, da prepoznate in odpravite ranljivosti.
Medsebojni TLS (mTLS) z Istiom
Istio lahko samodejno uveljavlja mTLS za vso komunikacijo med storitvami, s čimer zagotavlja, da je vsa komunikacija šifrirana in avtentificirana. To zagotavlja močno plast varnosti pred prisluškovanjem in posegi.
Napredne teme
Prehod GraphQL
Namesto API-jev REST razmislite o uporabi GraphQL za učinkovitejše pridobivanje podatkov. Izvedite prehod GraphQL z uporabo knjižnic, kot sta Graphene in Ariadne. GraphQL omogoča strankam, da zahtevajo samo podatke, ki jih potrebujejo, kar zmanjšuje prekomerno pridobivanje in izboljšuje zmogljivost.
Prehod gRPC
Za visoko zmogljivo komunikacijo med storitvami razmislite o uporabi gRPC. Izvedite prehod gRPC, da izpostavite storitve gRPC zunanjim strankam. Uporabite orodja, kot je grpc-gateway, za ustvarjanje API-jev RESTful iz definicij gRPC.
Brezzračni prehod API
Uvedite svoj prehod API kot brezzračno funkcijo z uporabo platform, kot so AWS Lambda, Google Cloud Functions ali Azure Functions. Brezzračni prehodi API ponujajo razširljivost, stroškovno učinkovitost in zmanjšano operativno režijo. Na primer, prehod API je mogoče integrirati z funkcijami AWS Lambda, napisanimi v Pythonu, za obdelavo zahtev. Ta brezzračni pristop lahko znatno zmanjša stroške infrastrukture.
Zaključek
Izdelava prehoda API v Pythonu z integracijo omrežja storitev ponuja robustno in razširljivo rešitev za upravljanje komunikacije mikrostoritev. Z združitvijo prednosti prehodov API in omrežij storitev lahko dosežete izboljšano varnost, opazljivost in upravljanje prometa. Ta arhitektura je primerna za sodobne aplikacije v oblaku, ki zahtevajo visoko razpoložljivost, razširljivost in varnost. Ne pozabite upoštevati svojih posebnih zahtev in izbrati orodja in tehnologije, ki najbolje ustrezajo vašim potrebam. Na primer, manjše podjetje bi lahko raje imelo Kong kot prehod API in Linkerd kot omrežje storitev zaradi relativne enostavnosti uporabe, medtem ko bi se večje podjetje morda odločilo za Istio in prehod API v Pythonu, ki je ustvarjen po meri, da bi imeli natančen nadzor nad vsakim vidikom njihove arhitekture. Izbira pravih orodij in skrbna izvedba varnostnih premislekov, omenjenih zgoraj, sta najpomembnejša za uspeh. Poleg tega sta nenehno spremljanje in prilagajanje ključna za vzdrževanje robustnega in varnega prehoda API v nenehno razvijajočem se tehnološkem okolju.