I en dynamisk vĂ€rld av mikrotjĂ€nster kan allt förĂ€ndras â vilken som helst komponent kan skrivas om pĂ„ ett annat sprĂ„k, med andra ramverk och arkitektur. Endast kontrakten bör förbli oförĂ€ndrade sĂ„ att man kan interagera med mikrotjĂ€nsten externt pĂ„ en viss konstant grund, oavsett interna metamorfoser. Idag kommer vi att berĂ€tta om vĂ„rt problem med att vĂ€lja formatet för att beskriva kontrakt och dela med oss av de artefakter vi har funnit.

InlÀgget Àr författat av och
MikrotjÀnster. Vid utvecklingen av Acronis Cyber Cloud insÄg vi att vi inte kan undkomma dem. Utformningen av en mikrotjÀnst Àr omöjlig utan formaliserandet av kontraktet, som utgör grÀnssnittet för mikrotjÀnsten.
Men nÀr produkten innehÄller mer Àn en komponent, och utvecklingen av kontraktet blir en regelbunden aktivitet, börjar man oavsiktligt tÀnka pÄ att optimera processen. Det blir uppenbart att grÀnssnittet (kontraktet) och implementationen (mikrotjÀnsten) mÄste motsvara varandra, att olika komponenter mÄste utföra samma uppgifter pÄ ett enhetligt sÀtt, och att utan centraliserad beslutsfattande kommer varje team att tvingas spendera tid pÄ att Äterigen skaffa dessa beslut.

MikrotjÀnstschemat frÄn Amazon i av Werner Vogels, CTO Amazon
Vad bestĂ„r dilemmat av? De facto finns det tvĂ„ sĂ€tt för mikrotjĂ€nster att interagera â HTTP Rest och gRPC frĂ„n Google. Utan att vilja involveras i Googles teknikstack valde vi HTTP Rest. Annotations för HTTP REST-kontrakten beskrivs oftast i ett av tvĂ„ format: RAML och OAS, tidigare kĂ€nt som Swagger. DĂ€rför stĂ€lls varje utvecklingsteam inför behovet av att vĂ€lja ett av standarderna. Men som det visat sig kan detta val vara mycket svĂ„rt.
Varför behövs annotationer?
En sammanfattning behövs sÄ att externa anvÀndare enkelt kan förstÄ vad som kan göras med din tjÀnst via dess HTTP-grÀnssnitt. Det innebÀr att en grundlÀggande sammanfattning minst ska innehÄlla en lista över tillgÀngliga resurser, deras HTTP-metoder, förfrÄgans kropp, en upprÀkning av parametrar, angivande av nödvÀndiga och stödda rubriker samt returkoder och svarformat. En extremt viktig del av kontraktsbeskrivningen Àr deras verbala beskrivning ("vad hÀnder om du lÀgger till denna query-parameter i förfrÄgan?", "under vilka omstÀndigheter returneras kod 400?")
Trots detta, nÀr det gÀller att utveckla ett stort antal mikrotjÀnster, vill man dra nytta av de skrivna sammanfattningarna. Till exempel kan man generera sÄvÀl klient- som serverkod baserat pÄ RAML/Swagger pÄ en mÀngd olika programmeringssprÄk. Dessutom kan man automatiskt fÄ dokumentation för mikrotjÀnsten och ladda upp den pÄ din utvecklarportal :).

Exempel pÄ strukturerad kontraktsbeskrivning
Det Àr sÀllan man testar mikrotjÀnster baserat pÄ kontraktsbeskrivningar. Om du har skrivit bÄde sammanfattningen och komponenten kan du skapa ett automatiskt test som kontrollerar tjÀnstens korrekthet med olika typer av indata. Returnerar inte tjÀnsten en svarkod som inte beskrivs i sammanfattningen? Kan den korrekt hantera uppenbart felaktiga data?
Mer Àn sÄ, en kvalitativ implementering av inte bara kontrakten utan Àven verktygen för att visualisera sammanfattningar förenklar arbetet med mikrotjÀnsten. Det vill sÀga, om arkitekten har beskrivit kontraktet kvalitativt, kommer designers och utvecklare att implementera tjÀnsten i andra produkter utan ytterligare tidskostnader.
För att arbeta med ytterligare verktyg har bÄde RAML och OAS möjligheten att lÀgga till metadatan som inte föreskrivs av standarden ().
I allmÀnhet finns det enormt med utrymme för kreativitet nÀr det gÀller tillÀmpningen av kontrakt för mikrotjÀnster⊠Ätminstone teoretiskt
JÀmförelse av igelkott med snok
För nÀrvarande Àr det prioriterade utvecklingsomrÄdet inom Acronis Acronis Cyber Platform. Acronis Cyber Platform Àr nya integrationspunkter för tredjepartstjÀnster med Acronis Cyber Cloud och agentdelen. Trots att vÄra interna API:er, beskrivna i RAML, har varit tillfredsstÀllande, har behovet av att publicera API Äterigen vÀckt frÄgan om vilket annotationsstandard som Àr bÀst att anvÀnda för vÄrt arbete?
Till en början verkade det som att det fanns tvĂ„ lösningar â de mest spridda bilderna RAML och Swagger (eller OAS). Men det visade sig att det finns minst tre eller fler alternativ.
Ă ena sidan finns RAML â ett kraftfullt och effektivt sprĂ„k. Det implementerar hierarkier och arv vĂ€l, sĂ„ detta format passar bĂ€ttre för stora företag som behöver mĂ„nga beskrivningar â det handlar om mĂ„nga mikrotjĂ€nster som har gemensamma delar av kontrakt â autentisering scheman, identiska datatyper, felmeddelanden.
Men utvecklaren av RAML, företaget Mulesoft, har gĂ„tt med i Open API-konsortiet som sysslar med utvecklingen . DĂ€rför har utvecklingen av RAML avstannat. För att förestĂ€lla sig formatet för hĂ€ndelser, förestĂ€ll dig att de som upprĂ€tthĂ„ller de grundlĂ€ggande komponenterna i Linux har gĂ„tt för att arbeta pĂ„ Microsoft. En sĂ„dan situation skapar förutsĂ€ttningar för att anvĂ€nda Swagger, som utvecklas dynamiskt och i den senaste â tredje versionen â nĂ€stan hinner ikapp RAML i flexibilitet och funktionalitet.
Om det inte vore för en sak...
Det visade sig att lĂ„ngt ifrĂ„n alla open-source verktyg har uppdaterats till OAS 3.0-versionen. För mikrotjĂ€nster pĂ„ Go kommer den största kritiska punkten att vara avsaknaden av anpassning till den senaste versionen av standarden. Men skillnaden mellan Swagger 2 och Swagger 3 â . Till exempel har utvecklarna i den tredje versionen:
- förbÀttrat beskrivningen av autentisering scheman
- stödet för JSON Schema
- förbÀttrat möjligheten att lÀgga till exempel
Situationen blir lustig: vid valet av standard mÄste RAML, Swagger 2 och Swagger 3 betraktas som separata alternativ. Endast Swagger 2 har ett bra stöd för OpenSource-verktyg. RAML Àr mycket flexibelt⊠och komplicerat, medan Swagger 3 har svagt stöd frÄn gemenskapen, sÄ du kommer att behöva anvÀnda egna utvecklade verktyg eller kommersiella lösningar som vanligtvis kostar ganska mycket.
Det finns mÄnga trevliga funktioner i Swagger, som en fÀrdig portal , som man kan ladda upp en anmÀlan till och fÄ en visuell presentation med detaljerad beskrivning, lÀnkar och relationer, sÄ finns det inte samma möjlighet för den mer fundamentala och mindre anvÀndarvÀnliga RAML. Ja, man kan söka efter nÄgot bland projekten pÄ GitHub, hitta en motsvarighet dÀr och sjÀlv stÀlla in det. I vilket fall mÄste nÄgon underhÄlla portalen, vilket inte Àr sÄ bekvÀmt för grundlÀggande anvÀndning eller testbehov. Dessutom Àr swagger mer "principlös", eller liberal - den kan genereras frÄn kommentarer i koden, vilket förstÄs strider mot principen API first och stöds inte av nÄgot av verktygen för RAML.
Vi började vid ett tillfÀlle arbeta med RAML, eftersom det var ett mer flexibelt sprÄk, och slutade med att vi fick göra mycket sjÀlva. Till exempel anvÀnds ett verktyg i ett av projekten i enhetstester som endast stöder RAML 0.8. SÄ vi var tvungna att lÀgga till lösningar för att verktyget skulle kunna "Àta" RAML version 1.0.
Ăr det verkligen nödvĂ€ndigt att vĂ€lja?
Efter att ha kÀmpat med att komplettera lösningssystemet för RAML, kom vi fram till att vi behöver konvertera RAML till Swagger 2 och utföra all automatisering, validering, testning och efterföljande optimering dÀr. Det Àr ett bra sÀtt att anvÀnda bÄde flexibiliteten hos RAML och verktygsstödet frÄn communityn som Swagger erbjuder.
För att lösa denna uppgift finns det tvÄ OpenSource-verktyg som ska sÀkerstÀlla konverteringen av kontrakt:
- â numera en icke-underhĂ„llen verktyg. Under arbetet med det upptĂ€ckte vi att det uppstĂ„r ett antal problem med komplexa RAML-filer som Ă€r "spridda" över ett stort antal filer. Detta program Ă€r skrivet i JavaScript och utför en rekursiv genomgĂ„ng av syntaxtrĂ€det. PĂ„ grund av dynamisk typning blev det svĂ„rt att förstĂ„ denna kod, sĂ„ vi beslutade att inte slösa tid pĂ„ att skriva patchar till ett utdöende verktyg.
- â ett verktyg frĂ„n samma företag som pĂ„stĂ„r sig kunna konvertera allt och alla, i vilken riktning som helst. I dagslĂ€get deklareras stöd för RAML 0.8, RAML 1.0 och Swagger 2.0. Men vid tidpunkten för vĂ„r undersökning var verktyget fortfarande rĂ„tt och olĂ€mpligt för anvĂ€ndning. Utvecklarna skapar en sorts , vilket kommer att göra det möjligt för dem att snabbt lĂ€gga till nya standarder i framtiden. Men för tillfĂ€llet fungerar allt detta helt enkelt inte.
Och det Àr inte allt besvÀr vi har stÄtt inför. Ett av stegen i vÄr pipeline Àr att kontrollera att RAML frÄn förrÄdet Àr korrekt i förhÄllande till specifikationen. Vi har provat flera verktyg. FörvÄnande nog klagade alla pÄ vÄra anteckningar pÄ olika stÀllen med helt olika dumma ord. Ofta utan att ha nÄgon poÀng :).
Till slut bestÀmde vi oss för ett numera förÄldrat projekt, som ocksÄ har en rad problem (den kraschar ibland utan anledning, har problem med regex). DÀrmed hittade vi inget sÀtt att lösa validering och konvertering med hjÀlp av gratisverktyg, och beslutade att anvÀnda ett kommersiellt verktyg. I framtiden, nÀr OpenSource-verktyg blir mer avancerade, kan det hÀr problemet kanske bli enklare. Men för tillfÀllet verkar arbets- och tidskostnaderna för att "förbÀttra" vara mer betydande Àn kostnaden för den kommersiella tjÀnsten.
Slutsats
Efter allt detta ville vi dela med oss av vÄr erfarenhet och pÄpeka att innan man vÀljer ett verktyg för att beskriva kontrakt, behöver man tydligt definiera vad man vill ha ut av det och vilken budget man Àr beredd att investera. Om man bortser frÄn OpenSource, finns det redan mÄnga tjÀnster och produkter som kan hjÀlpa till med kontroll, konvertering och validering. Men de Àr dyra, ibland mycket dyra. För stora företag Àr sÄdana kostnader acceptabla, men för startups kan de bli en stor belastning.
Definiera de verktyg du kommer att anvÀnda senare. Till exempel, om du bara behöver visa kontrakt, Àr det enklare att anvÀnda Swagger 2, som har ett snyggt API, eftersom du sjÀlv mÄste driva och underhÄlla tjÀnsten för RAML.
Ju fler uppgifter du har, desto större blir behovet av verktyg, och de Àr olika för olika plattformar. Det Àr bÀttre att bekanta sig med tillgÀngliga versioner direkt för att göra ett val som minimerar dina framtida kostnader.
Men det mÄste erkÀnnas att alla ekosystem som finns idag Àr ofullkomliga. SÄ om det finns fans inom företaget som Àlskar att arbeta i RAML eftersom "det tillÄter en mer flexibel uttrycksförmÄga", eller tvÀrtom föredrar Swagger eftersom "det Àr mer begripligt", Àr det bÀst att lÄta dem arbeta i det de Àr vana vid och vill, eftersom verktygen för vilket av formaten som helst krÀver finslipning.
NÀr det gÀller vÄr erfarenhet kommer vi i följande inlÀgg att berÀtta om vilka statiska och dynamiska kontroller vi genomför baserat pÄ vÄr RAML-Swagger-arkitektur, samt vilken dokumentation vi genererar frÄn kontrakten och hur allt detta fungerar.
Endast registrerade anvÀndare kan delta i omröstningen. , tack.
Vilket sprÄk anvÀnder ni för att annotera mikrotjÀnstkontrakt?
RAML 0.8
RAML 1.0
Swagger 2
OAS3 (aka )
Blueprint
Annat
AnvÀnder inte
100 anvÀndare röstade. 24 anvÀndare avstod.
KĂ€lla: habr.com
