7 ting du bør vite når du komme i gang med Serverless Api

0
16

Jeg vil at du skal ta et sekund og tenker på , og tenke på det i form av skalaen. har 326 millioner brukere. Kollektivt, vi skaper ~for 6000 tweets i sekundet. Hvert minutt, og det er 360,000 tweets opprettet. Som summerer opp til nesten 200 milliarder kroner tweets i året. Nå, hva om skaperne av hadde blitt lammet av hvordan skalaen, og de hadde ikke engang begynne?

Det er meg på hver eneste oppstart ideen jeg noen gang har hatt, noe som er grunnen til at jeg elsker serverless så mye: det takler problemene av skalering forlater meg å bygge den neste !

Live beregninger med Programmet Innsikt

Som du kan se ovenfor, har vi skalert fra en til sju servere i løpet av sekunder, som flere brukeren forespørsler kommer inn. Du kan skalere som på en enkel måte, også.

Så la oss bygge et API som vil skalere umiddelbart som flere og flere brukere kommer i og vår arbeidsmengde. Vi kommer til å gjøre det på er ved å svare på følgende spørsmål:

  • Hvordan oppretter jeg en ny serverless prosjektet?
  • Hvordan kan jeg kjøre og feilsøke kode lokalt?
  • Hvordan installerer jeg avhengigheter?
  • Hvordan kobler jeg meg til tredjeparts tjenester?
  • Der kan jeg lagre forbindelse strenger?
  • Hvordan kan jeg tilpasse URL-banen?
  • Hvordan kan jeg distribuere den til nettskyen?

Hvordan oppretter jeg en ny serverless prosjektet?

Med hver ny teknologi, vi trenger å finne ut hvilke verktøy som er tilgjengelig for oss, og hvordan vi kan integrere dem i våre eksisterende verktøyet. Når du komme i gang med serverless, vi har noen alternativer å vurdere.

Først, kan vi bruke den gode gamle nettleser for å opprette, skrive og teste funksjoner. Det er kraftig, og det gjør oss i stand til å kode uansett hvor vi er, alt vi trenger er en datamaskin og en nettleser som kjører. Nettleseren er et godt utgangspunkt for å skrive vår første serverless funksjon.

Serverless i nettleseren

Neste, som du blir mer vant til den nye konsepter og bli mer produktive, du ønsker kanskje å bruke ditt lokale miljø for å fortsette med din utvikling. Vanligvis vil du ønsker støtte for en par ting:

  • Du skriver koden i din redaktør av valg
  • Verktøy som gjør den tunge løft og generere standardteksten koden for deg
  • Kjøre og feilsøke kode lokalt
  • Støtte for raskt å distribuere din kode

Microsoft er min arbeidsgiver, og jeg har for det meste bygget serverless programmer ved hjelp av Azure Funksjoner slik for resten av denne artikkelen jeg vil fortsette å bruke dem som et eksempel. Med Azure Funksjoner, vil du ha støtte for alle disse funksjonene når du arbeider med Azure Funksjoner Core Verktøy som du kan installere fra npm.

npm installere -g azure-funksjoner-core-tools

Neste, vi kan initialisere et nytt prosjekt og skape nye funksjoner ved hjelp av den interaktive CLI:

func-CLI

Hvis din redaktør av valget skjer for å være VS-Koden, kan du bruke den til å skrive serverless koden også. Det er faktisk en stor utvidelse for det.

En gang installert, et nytt ikon vil bli lagt til venstre sidebar — det er der vi kan få tilgang til alle våre Azure-relaterte utvidelser! Alle relaterte funksjoner kan være gruppert under samme prosjekt (også kjent som en funksjon app). Dette er som en mappe for gruppering av funksjoner som bør skala sammen, og at vi ønsker å administrere og overvåke på samme tid. For å starte et nytt prosjekt ved hjelp av VS-Kode, klikker du på Azure-ikonet og deretter mappe – ikonet.

Opprette nye Azure-prosjektet Funksjoner

Dette vil generere et par filer som hjelper oss med globale innstillinger. La oss gå gjennom dem nå.

verten.json

Vi kan konfigurere globale innstillinger for alle funksjoner i prosjektet direkte i verten.json-fil.

I vår funksjon app er konfigurert til å bruke den nyeste versjonen av den serverless runtime (i dag 2.0). Vi kan også konfigurere funksjoner for å timeout etter ti minutter ved å sette functionTimeout eiendom til 00:10:00 — standard verdi for det er for tiden fem minutter (00:05:00).

I noen tilfeller kan vi kanskje ønsker å styre ruten prefiks for våre Nettadresser eller selv justere innstillinger, som antall samtidige forespørsler. Azure Funksjoner selv gjør det mulig for oss å tilpasse andre funksjoner som innlogging, healthMonitor og ulike typer utvidelser.

Her er et eksempel på hvordan jeg har konfigurert filen:

// vert.json
{
“versjon”: “2.0”,
“functionTimeout”: “00:10:00”,
“utvidelser”: {
“http”: {
“routePrefix”: “elendige”,
“maxOutstandingRequests”: 200,
“maxConcurrentRequests”: 100,
“dynamicThrottlesEnabled”: true
}
}
}
Programmet innstillinger

Programmet innstillingene er globale innstillinger for å administrere runtime, språk og versjon, med forbindelse strenger, lese/skrive-tilgang, og ZIP distribusjon, blant andre. Noen er innstillinger som kreves av plattformen, som FUNCTIONS_WORKER_RUNTIME, men vi kan også definere egendefinerte innstillinger som vi bruker i våre program-koden, som DB_CONN som vi kan bruke til å koble til en database eksempel.

Samtidig utvikle lokalt, definerer vi disse innstillingene i en fil som heter lokalt.innstillinger.json og vi har tilgang til dem, som i alle andre miljø variabel.

Igjen, her er et eksempel tekstutdrag som forbinder disse punktene:

// lokalt.innstillinger.json
{
“IsEncrypted”: false,
“Verdier”: {
“AzureWebJobsStorage”: “your_key_here”,
“FUNCTIONS_WORKER_RUNTIME”: “node”,
“WEBSITE_NODE_DEFAULT_VERSION”: “8.11.1”,
“FUNCTIONS_EXTENSION_VERSION”: “~2”,
“APPINSIGHTS_INSTRUMENTATIONKEY”: “your_key_here”,
“DB_CONN”: “your_key_here”,
}
}
Azure Funksjoner Proxyer

Azure Funksjoner, Fullmakter er implementert i proxyer.json-fil, og de gjør oss i stand til å avsløre flere apps-funksjonen under samme API, samt endre forespørsler og svar. I koden nedenfor vi er publisering to forskjellige endepunkter under samme URL.

// proxy-servere.json
{
“$skjema”: “http://json.schemastore.org/proxies”,
“proxyer”: {
“les-oppskrifter”: {
“matchCondition”: {
“metoder”: [“POST”],
“rute”: “/api/oppskrifter”
},
“backendUri”: “https://tacofancy.azurewebsites.net/api/recipes”
},
“abonner”: {
“matchCondition”: {
“metoder”: [“POST”],
“rute”: “/api/abonner”
},
“backendUri”: “https://tacofancy-users.azurewebsites.net/api/subscriptions”
}
}
}

Opprette en ny funksjon ved å klikke på thunder – ikonet i forlengelse.

Opprette en ny Azure Funksjon

Utvidelsen vil bruke forhåndsdefinerte maler for å generere kode, basert på de valgene vi gjorde — språk, funksjon type, og autorisasjon nivå.

Vi bruker funksjonen.json å konfigurere hvilke type hendelser som vår funksjon lytter til og eventuelt til å binde seg til spesifikke data kilder. Våre koden kjøres i respons til spesifikke utløsere som kan være av typen HTTP når vi reagerer på HTTP-forespørsler — når vi kjører koden i respons til en fil som lastes opp til en lagring konto. Andre brukte triggere kan være av type kø, for å behandle en melding som er lastet opp på en kø eller tid utløser til å kjøre kode ved angitte tidsintervaller. Funksjonen bindinger er brukt til å lese og skrive data til data kilder eller tjenester som databaser eller sende e-post.

Her ser vi at vår funksjon er å lytte til HTTP-forespørsler og vi får tilgang til den faktiske forespørselen gjennom objektet som heter req.

// funksjon.json
{
“deaktivert”: false,
“bindinger”: [
{
“authLevel”: “anonym”,
“type”: “httpTrigger”,
“retning”: “”,
“name”: “kn”,
“metoder”: [“få”],
“rute”: “oppskrifter”
},
{
“type”: “http”,
“retning”: “ut”,
“name”: “res”
}
]
}

index.js er der vi implementerer koden for vår funksjon. Vi har tilgang til kontekst objekt, som vi bruker for å kommunisere til den serverless runtime. Vi kan gjøre ting som å logge informasjon, angir svaret for vår funksjon samt lese og skrive data fra bindinger objekt. Noen ganger, vår funksjon app vil ha flere funksjoner som er avhengige av den samme koden (dvs. database tilkoblinger), og det er god praksis å trekke ut denne koden inn i en separat fil for å redusere koden duplisering.

//Index.js
modul.eksport = asynkron funksjon (kontekst, req) {
sammenheng.logg(‘JavaScript HTTP utløse funksjonen behandlet en forespørsel.’);

hvis (req.søket.navn || (req.kropp && req.kroppen.navn)) {
sammenheng.res = {
// status: 200, /* standard 200 */
kropp: “Hei” + (req.søket.navn || req.kroppen.navnet)
};
}
else {
sammenheng.res = {
status: 400,
kropp: “Vær så snill å passere et navn på spørring-strengen, eller på forespørsel kroppen”
};
}
};

Hvem er glade for å gi dette en kjøre?

Hvordan kan jeg kjøre og feilsøke Serverless funksjoner lokalt?

Når du bruker VS-Koden, Azure Funksjoner extension gir oss mye av oppsettet som vi trenger for å kjøre og feilsøke serverless funksjoner lokalt. Når vi opprettet et nytt prosjekt ved å bruke det, en .vscode mappen automatisk ble skapt for oss, og dette er hvor alle debugging konfigurasjon som finnes. For å avslutte vår nye funksjonen, kan vi bruke Kommandoen Paletten (Ctrl+Shift+P) ved å filtrere på Debug: Velg og Start Debugging, eller skrive inn feilsøke.

Debugging Funksjoner Serverless

En av grunnene til at dette er mulig er fordi Azure Funksjoner runtime er open-source og installert lokalt på maskinen vår når du installerer azure-core-tools pakke.

Hvordan installerer jeg avhengigheter?

Sjansene er du allerede vet svaret på dette, hvis du har jobbet med Node.js. Som i alle andre Node.js prosjektet, vi må først lage en pakke.json-fil i rotmappen på prosjektet. Det kan gjøres ved å kjøre npm init -y — y vil kreve filen med standard konfigurasjon.

Deretter installerer vi avhengigheter ved hjelp av npm som vi normalt ville gjøre i andre prosjekt. For dette prosjektet, la oss gå videre og installere MongoDB pakke fra npm ved å kjøre:

npm jeg mongodb

Pakken vil nå være tilgjengelig for import i alle funksjoner i funksjon app.

Hvordan kobler jeg meg til tredjeparts tjenester?

Serverless funksjoner er ganske kraftig, slik at vi kan skrive egendefinert kode som reagerer på hendelser. Men koden på sin egen hjelper ikke mye når bygge komplekse programmer. Den virkelige kraften kommer fra enkel integrasjon med tredjeparts tjenester og verktøy.

Så, hvordan gjør vi for å koble til og lese data fra en database? Ved hjelp av MongoDB klienten, vil vi lese data fra en Asurblå Kosmos DB eksempel har jeg opprettet i Azure, men du kan gjøre dette med noen andre MongoDB database.

//Index.js
const MongoClient = kreve(‘mongodb’).MongoClient;

// Initialisere godkjenning detaljer som kreves for database tilkobling
const auth = {
brukeren: – prosessen.konv.bruker
passord: prosessen.konv.passord
};

// Initialisere global variabel til å lagre database tilkobling for gjenbruk i fremtidige samtaler
la db = null;
const loadDB = asynkron () => {
// Hvis database klient eksisterer, gjenbruk
hvis (db) {
tilbake db;
}
// Hvis ikke, oppretter ny tilkobling
const client = venter MongoClient.koble til(
prosessen.konv.url,
{
auth: auth
}
);
// Velger tacos database
db = klient.db(‘tacos’);
tilbake db;
};

modul.eksport = asynkron funksjon(kontekst, req) {
try {
// Komme database tilkobling
const database = venter loadDB();
// Hente alle elementene i samling Oppskrifter
la oppskrifter = venter database
.samling (“Oppskrifter”)
.finn()
.toArray();
// Returnerer JSON-objekt med den utvalg av oppskrifter
sammenheng.res = {
kropp: { elementer: oppskrifter }
};
} catch (feil) {
sammenheng.logg(`Error code: ${feil.kode} melding: ${feil.melding}`);
// Returnerer en feilmelding, og Intern serverfeil status kode
sammenheng.res = {
status: 500,
kropp: { melding: “En feil har oppstått, vennligst prøv igjen senere.’ }
};
}
};

En ting å merke seg her er at vi er gjenbruk vår database tilkobling snarere enn å opprette en ny en for hver påfølgende anrop til våre funksjon. Dette barberer av ~300ms av hver påfølgende funksjonen samtale. Jeg kaller det en vinn!

Der kan jeg lagre forbindelse strenger?

Ved utvikling lokalt, kan vi lagre våre miljøvariabler, tilkobling strenger, og virkelig noe som er hemmelig til den lokale.innstillinger.json-fil, og deretter få tilgang til det hele på vanlig måte, ved hjelp av prosessen.konv.yourVariableName.

lokale.innstillinger.json
{
“IsEncrypted”: false,
“Verdier”: {
“AzureWebJobsStorage”: “”,
“FUNCTIONS_WORKER_RUNTIME”: “node”,
“user”: “din-db-bruker”,
“passord”: “din-db-passord”,
“url”: “mongodb://din-db-bruker.dokumenter.azure.com:10255/?ssl=true”
}
}

I produksjon, vi kan konfigurere innstillingene på funksjonen ‘ s side i Azure portalen.

Men en annen ryddig måte å gjøre dette på er gjennom VS Kode extension. Uten å forlate din IDE, vi kan legge til nye innstillinger, og slette eksisterende eller laste opp/laste dem ned til skyen.

Debugging Funksjoner Serverless

Hvordan kan jeg tilpasse URL-banen?

Med REST API, det er et par av beste praksis rundt formatet for NETTADRESSEN selv. Den ene jeg slo på for våre Oppskrifter API-er:

  • FÅ /oppskrifter: Henter en liste over oppskrifter
  • FÅ /oppskrifter/1: Henter en bestemt oppskrift
  • POST – /oppskrifter: Oppretter en ny oppskrift
  • SETTE /oppskrifter/1: Oppdateringer oppskrift med ID-1
  • SLETTE /oppskrifter/1: Sletter oppskrift med ID-1

URL-adressen som er gjort tilgjengelig som standard når du oppretter en ny funksjon er av form http://host:port/api/function-name. For å tilpasse URL-banen og den metode som vi lytte til, vi trenger å konfigurere dem i vår funksjon.json-fil:

// funksjon.json
{
“deaktivert”: false,
“bindinger”: [
{
“authLevel”: “anonym”,
“type”: “httpTrigger”,
“retning”: “”,
“name”: “kn”,
“metoder”: [“få”],
“rute”: “oppskrifter”
},
{
“type”: “http”,
“retning”: “ut”,
“name”: “res”
}
]
}

Videre kan vi legge til parametere til vår funksjon er rute ved hjelp av krøllparentes: rute: oppskrifter/{id}. Vi kan da lese ID-parameteren i vår kode fra req-objektet:

const recipeId = req.params.id;

Hvordan kan jeg distribuere den til nettskyen?

Gratulerer, du har gjort det til siste trinn! 🎉 Tid til å presse denne godhet til skyen. Som alltid, VS Kode extension har ryggen. Alt det virkelig trengs er et enkelt høyreklikk vi ganske mye gjort.

Distribusjon ved hjelp av VS-Kode

Utvidelsen vil ZIP opp koden med Noden moduler, og skyv dem alle til skyen.

Når dette alternativet er flott når du skal teste vår egen kode eller kanskje når du arbeider på et lite prosjekt, er det lett å overskrive noen andre endringer av ulykke — eller enda verre, din egen.

Ikke la venner høyre-klikk distribuere!
— hver DevOps ingeniør ute

Et mye sunnere alternativ er å sette opp på GitHub distribusjon som kan gjøres på et par skritt i Azure portalen, via Distribusjon Center – fanen.

Github distribusjon

Er du klar til å gjøre Serverless Api?

Dette har vært en grundig introduksjon til en verden av Servless Api-er. Men, det er mye, mye mer enn hva vi har dekket her. Serverless gjør oss i stand til å løse problemer kreativt og til en brøkdel av prisen vi betaler vanligvis for å bruke tradisjonelle plattformene.

Chris har nevnt det i andre innlegg her på CSS-Triks, men han laget dette utmerkede nettstedet hvor du kan lære mer om serverless og finne både ideer og ressurser til ting du kan lage med det. Definitivt sjekke det ut og la meg vite om du har andre tips eller råd skalering med serverless.