VÄr erfarenhet av att skapa en API Gateway

Vissa företag, inklusive vĂ„r kund, utvecklar produkter genom ett partnernĂ€tverk. Till exempel, stora e-handelsföretag Ă€r integrerade med leveranstjĂ€nster – du bestĂ€ller en vara och fĂ„r snart ett spĂ„rningsnummer för paketet. Ett annat exempel Ă€r att du köper en reseförsĂ€kring eller en biljett till expressflyget tillsammans med din flygbiljett.

För detta anvÀnds ett API som mÄste tillhandahÄllas till partnerna via API Gateway. Denna uppgift har vi löst. I denna artikel kommer vi att berÀtta mer.

Givet: en ekosystem och en API-portal med ett grÀnssnitt dÀr anvÀndare Àr registrerade, fÄr information osv. Vi behöver skapa en anvÀndarvÀnlig och pÄlitlig API Gateway. Under processen behöver vi sÀkerstÀlla

  • registrering,
  • kontroll av anslutning till API,
  • övervakning av hur anvĂ€ndare anvĂ€nder det slutliga systemet,
  • redovisning av affĂ€rsindikatorer.

VÄr erfarenhet av att skapa en API Gateway

I artikeln kommer vi att dela med oss av vÄr erfarenhet av att skapa en API Gateway, under vilken vi löste följande uppgifter:

  • anvĂ€ndarautentisering,
  • anvĂ€ndarautorisering,
  • modifiering av den ursprungliga begĂ€ran,
  • proxyservering av begĂ€ran,
  • efterbehandling av svaret.


Det finns tvÄ typer av API-hantering:

1. Standard, som fungerar pÄ följande sÀtt. Innan anslutning testar anvÀndaren funktionerna, betalar och integrerar pÄ sin webbplats. Oftast anvÀnds detta av smÄ och medelstora företag.

2. Stora B2B API Management, dÀr företaget först fattar ett affÀrsbeslut om att ansluta, blir en partner till företaget med kontraktsförpliktelser, och ansluter sig sedan till API. Efter att alla formaliteter har lösts fÄr företaget testÄtkomst, genomgÄr tester och gÄr i produktion. Men detta Àr omöjligt utan en ledningsbeslut om anslutningen.

VÄr erfarenhet av att skapa en API Gateway

VÄr lösning

I denna del kommer vi att berÀtta om skapandet av API Gateway.

SlutanvÀndarna av den skapade API-gatewayen Àr partner till vÄr kund. För varje av dem har vi redan de nödvÀndiga kontrakten. Vi behöver bara utöka funktionaliteten, vilket markerar den tillhandahÄllna tillgÄngen till gatewayen. DÀrför behövs en kontrollerad process för anslutning och hantering.

SjÀlvklart hade vi kunnat ta en fÀrdig lösning för att lösa uppgiften med API-hantering och skapandet av API Gateway i synnerhet. Till exempel hade det kunnat vara Azure API Management. Det passade inte oss eftersom vi redan hade en API-portal och en stor ekosystem byggd runt den. Alla anvÀndare var redan registrerade och visste var och hur de kunde fÄ den information de behövde. I API-portalen fanns redan de nödvÀndiga grÀnssnitten, vi behövde bara en API Gateway. Det var just utvecklingen av den vi tog oss an.

Det som vi kallar en API Gateway Ă€r en slags proxy. HĂ€r hade vi Ă„terigen ett val — vi kunde skriva vĂ„r egen proxy eller anvĂ€nda nĂ„got fĂ€rdigt. I det hĂ€r fallet valde vi den andra vĂ€gen och valde en kombination av nginx+Lua. Varför? Vi behövde pĂ„litlig, testad programvara som stödjer skalning. Vi ville inte behöva kontrollera bĂ„de affĂ€rslogikens korrekthet och proxyens funktionalitet efter implementeringen.

Varje webbserver har en pipeline för begÀrningsbehandling. I fallet med nginx ser den ut som följande:

VÄr erfarenhet av att skapa en API Gateway

(schema frÄn GitHub Lua Nginx)

VÄrt mÄl var att integrera oss i denna pipeline vid den punkt dÀr vi kan modifiera den ursprungliga begÀran.

Vi vill skapa en transparent proxy, sÄ att begÀran förblir funktionellt oförÀndrad frÄn det ögonblick den anlÀnder. Vi kontrollerar bara Ätkomsten till den slutliga API:en och hjÀlper begÀran att nÄ dit. Om begÀran Àr felaktig ska det bara visas ett fel av den slutliga API:en, inte av oss. Den enda anledningen till att vi kan avvisa en begÀran Àr om klienten saknar Ätkomst.

För nginx finns det redan ett tillÀgg till Lua. Lua Àr ett skriptsprÄk, det Àr mycket lÀttviktigt och enkelt att lÀra sig. PÄ sÄ sÀtt implementerade vi den nödvÀndiga logiken med hjÀlp av Lua.

Konfigurationen av nginx (analog till routen i en applikation), dĂ€r allt arbete utförs, Ă€r ganska tydlig. Den sista direktiven — post_action — Ă€r anmĂ€rkningsvĂ€rd.

location /middleware {
      more_clear_input_headers Accept-Encoding;
      lua_need_request_body on;
      rewrite_by_lua_file 'middleware/rewrite.lua';
      access_by_lua_file 'middleware/access.lua';
      proxy_pass https://someurl.com;
      body_filter_by_lua_file 'middleware/body_filter.lua';
      post_action /process_session;
}

LÄt oss titta pÄ vad som hÀnder i denna konfiguration:
more_clear_input_headers — rensar vĂ€rdet av de angivna huvudena efter direktiven.
lua_need_request_body — reglerar om det ska lĂ€sas det ursprungliga begĂ€rans kropp innan direktiven rewrite/access/access_by_lua utförs eller inte. Som standard lĂ€ser nginx inte klientens begĂ€rans kropp, och om du behöver fĂ„ Ă„tkomst till den mĂ„ste denna direktiv sĂ€ttas till on.
rewrite_by_lua_file — sökvĂ€gen till skriptet som beskriver logiken för modifieringen av förfrĂ„gan
access_by_lua_file — sökvĂ€gen till skriptet som beskriver logiken som kontrollerar tillgĂ„ngen till resursen.
proxy_pass — url:en som förfrĂ„gan kommer att proxas till.
body_filter_by_lua_file — sökvĂ€gen till skriptet som beskriver logiken för filtrering av förfrĂ„gan innan den returneras till klienten.
Och slutligen, post_action — en officiellt odokumenterad direktiv som kan anvĂ€ndas för att utföra andra Ă„tgĂ€rder efter att svaret har getts till klienten.

HÀr nedan kommer vi att berÀtta i ordning hur vi löste vÄra uppgifter.

Autentisering/auktorisering och modifiering av förfrÄgan

Behörighet

Vi byggde autentisering och auktorisering med hjÀlp av certifikatsÄtkomst. Det finns ett rotcertifikat. För varje ny klient skapas ett personligt certifikat som ger tillgÄng till API:t. Detta certifikat konfigureras i serversektionen av nginx-instÀllningarna.

ssl on;
ssl_certificate /usr/local/openresty/nginx/ssl/cert.pem;
ssl_certificate_key /usr/local/openresty/nginx/ssl/cert.pem;
ssl_client_certificate /usr/local/openresty/nginx/ssl/ca.crt;
ssl_verify_client on;

Modifiering

Det kan uppstÄ en rimlig frÄga: vad gör vi med en certifierad klient om vi plötsligt vill koppla bort denne frÄn systemet? Ska vi verkligen ÄterutfÀrda certifikat för alla andra klienter?

SĂ„ vi kom smidigt till nĂ€sta uppgift — modifiering av den ursprungliga förfrĂ„gan. Den ursprungliga förfrĂ„gan frĂ„n klienten Ă€r egentligen inte giltig för det slutliga systemet. En av uppgifterna Ă€r att fylla i de saknade delarna i förfrĂ„gan för att göra den giltig. Grejen Ă€r att de saknade uppgifterna Ă€r olika för varje klient. Vi vet att klienten kommer till oss med ett certifikat, frĂ„n vilket vi kan ta ett fingeravtryck och extrahera de nödvĂ€ndiga klientdata frĂ„n databasen.

Om det skulle krÀvas att koppla bort klienten frÄn vÄr service, kommer deras data att försvinna frÄn databasen och de kan inte göra nÄgot.

Arbete med klientdata

Vi behövde sÀkerstÀlla hög tillgÀnglighet för lösningen, sÀrskilt hur vi fÄr klientdata. SvÄrigheten ligger i att den ursprungliga kÀllan till dessa data Àr en extern tjÀnst som inte garanterar en oavbruten och tillrÀckligt hög arbetshastighet.

DÀrför behövde vi sÀkerstÀlla hög tillgÀnglighet för klientdata. Som verktyg valde vi Hazelcast, vilket ger oss:

  • snabb Ă„tkomst till data,
  • möjlighet att organisera ett kluster av flera noder med replikerade data pĂ„ olika noder.

Vi valde den enklaste strategin för att leverera data till cachen:

VÄr erfarenhet av att skapa en API Gateway

Arbetet med det slutliga systemet sker inom ramarna för sessioner och det finns en grÀns för det maximala antalet. Om kunden inte stÀnger sessionen, mÄste vi göra det.

Information om den öppna sessionen kommer frÄn det slutliga systemet och bearbetas först pÄ Lua-sidan. Vi valde att anvÀnda Hazelcast för att spara dessa data med en job som Àr skriven i .NET. Sedan kontrollerar vi med viss regelbundenhet rÀttigheten att fortsÀtta med öppna sessioner och stÀnger de som har gÄtt ut.

Åtkomst till Hazelcast bĂ„de frĂ„n Lua och .NET

Det finns ingen Lua-klient för att arbeta med Hazelcast, men Hazelcast har ett REST API, vilket vi valde att anvÀnda. För .NET finns det klient, genom vilket vi planerade att fÄ Ätkomst till Hazelcast-data pÄ .NET-sidan. Men sÄ enkelt var det inte.

VÄr erfarenhet av att skapa en API Gateway

Vid datalagring via REST och hÀmtning via .NET-klienten anvÀnds olika serialiserare/deserialiserare. DÀrför Àr det omöjligt att lÀgga in data via REST och hÀmta dem via .NET-klienten och vice versa.

Om det finns intresserade, kommer vi att berÀtta mer om detta problem i en separat artikel. Spoiler - se diagrammet.

VÄr erfarenhet av att skapa en API Gateway

Loggning och övervakning

VÄr företagsstandard för loggning via .NET Àr Serilog, alla loggar hamnar till slut i Elasticsearch, och vi analyserar dem via Kibana. NÄgot liknande ville vi göra i det hÀr fallet. Den enda klient klienten för att arbeta med Elastic pÄ Lua, som hittades, kraschade vid första require. SÄ vi anvÀnde Fluentd.

Fluentd Àr en open source-lösning för att sÀkerstÀlla ett enhetligt loggningsskikt för applikationen. Den gör det möjligt att samla loggar frÄn olika nivÄer i applikationen och sedan översÀtta dem till en enhetlig kÀlla.

API-gatewayen körs i K8S, sÄ vi beslutade att lÀgga till en behÄllare med Fluentd i samma pod för att skriva loggar till den befintliga öppna tcp-porten för Fluentd.

Vi undersökte ocksÄ hur Fluentd skulle fungera om den inte hade kontakt med Elasticsearch. Under tvÄ dagar fick gatewayen kontinuerligt förfrÄgningar, loggar skickades till Fluentd, men Fluentd blockerades av Elastic IP. Efter att kontakten ÄterstÀllts skickade Fluentd över alla loggar till Elastic utan problem.

Slutsats

Den valda implementationen gjorde det möjligt för oss att leverera en riktigt fungerande produkt till produktionsmiljön pÄ bara 2,5 mÄnader.

Om du nÄgonsin fÄr möjlighet att arbeta med sÄdana saker, rekommenderar vi att du först tydligt förstÄr vilket problem du ska lösa och vilka resurser du redan har. Var uppmÀrksam pÄ integrationsutmaningar med befintliga API-hanteringssystem.

FörstĂ„ vad du egentligen avser att utveckla – endast affĂ€rslogiken för att hantera förfrĂ„gningar eller, som i vĂ„rt fall, hela proxy-lösningen. Kom ihĂ„g att allt du gör sjĂ€lv mĂ„ste testas noggrant i efterhand.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster