Clojure programmering: ramar och andra verktyg

även om alla dessa lib syftar till att förenkla Clojure programmeringsuppgifter, kan de förvirra en nybörjare. Ibland är det svårt att förstå hur man sätter ihop dem alla och hittar en optimal lösning för en specifik uppgift. Så nu vill jag visa dig mina favoritverktyg för programmering i Clojure.

  • arbeta med webbserver och slutpunkter
  • interaktion med webbserver och databas
  • routing på server
  • använda GraphQL i Clojure-programmering
  • stöd för modulär arkitektur

låt oss börja resan till Clojure-programmeringsvärlden!

Obs: När du flyttar från Java och andra liknande språk bör du veta att det inte finns några traditionella ramar i Clojure. Allt är baserat på libs och deras samlingar. Detta gör språket mer flexibelt och mångsidigt.

Clojure ekosystem innehåller libs av olika komplexitet. Vissa av dem är bara en uppsättning ytterligare funktioner (till exempel ett bibliotek för att arbeta med tiden). Samtidigt ger system libs en plattform för att skapa hela ramverket. Sådana bibliotek tillåter programmeraren att presentera en applikation som en uppsättning komponenter, beskriva anslutningarna mellan dem och så vidare. Biblioteket själv säkerställer skapandet av beroendegrafer. Det kan till exempel konvertera komponenter till mer begripliga saker, som funktioner.

syfte: bekvämt arbete med webbserver och slutpunkter

kod: https://github.com/ring-clojure/ring

HTTP – serverns abstraktion är ett nyckelelement i Clojure web stack. Det möjliggör enkelt arbete med webbserver och slutpunkter, vilket är viktigt för framgångsrik apputveckling. Skapad i analogi med WSGI (Python) och Rack (Ruby), abstraherar Ring informationen om HTTP till ett tydligt, enhetligt API. Som ett resultat kan webbutvecklaren bygga modulära system bestående av komponenter och dela dessa komponenter mellan olika servrar och applikationer.

Hur fungerar ringen?

det får HTTP-förfrågningar och returnerar HTTP-svar. Så, Ring är inte ett så kallat webbapplikationsramverk.

anledningar till att använda Ring

som ett dominerande webbbibliotek i Clojure-programmering är Ring ett bra val för nybörjare. Först och främst är dess huvudsakliga funktion att tillhandahålla ett bekvämt gränssnitt för ett brett utbud av webbservrar. Ur denna synvinkel är tekniken extremt användbar och fungerar perfekt.

en annan ringfunktion tillhandahåller en uppsättning moduler (‘middleware’). Så det låter dig använda olika förskrivna bibliotek, kompatibla med varandra.

de flesta av Clojure programmerare väljer Ring för slutpunkter på grund av dess förmåga att använda middlewares. Till exempel tillåter dessa moduler att omvandla nödvändiga parametrar från en URL till Clojure-kodkartan. En webbutvecklare kan enkelt skriva ny middleware och integrera den i ekosystemet. Med hjälp av cemerick / friend-biblioteket kan du till exempel hantera godkännandeprocessen, tillämpa olika strategier (från inloggning och lösenord, slutar med oAuth) etc. Ring middleware hjälper till att bekvämt beskriva och starta processen. Det stänger alla slutpunkter som är förbjudna för obehöriga användare.

erfarenhet av att använda Ring är viktigt för att arbeta med andra Clojure-tekniker. Det är det första du kan använda för att få en app att flytta.

Http-kit

syfte: Serverstart

kod: https://github.com/http-kit/http-kit

det händelsestyrda, mycket effektiva HTTP-server / klientbiblioteket innehåller WebSocket, såväl som asynkront stöd.

Hur fungerar Http-kit?

det är ett bibliotek för att organisera en korrekt webbserverinteraktion. Http-kit är lämplig för mycket samtidiga asynkrona eller synkrona applikationer. När det gäller WebSocket och HTTP long polling/streaming är det bättre att ha ett enhetligt API.

anledningar till att använda Http-kit

flexibel lösning

Http-kit ger möjlighet att arbeta både med synk-och asynksystem. Det första alternativet är enkelt, medan det andra fungerar snabbare. Så, du kan göra ett val baserat på ditt specifika syfte. Dessutom kan du använda biblioteket med Ring. Det fungerar nästan som Bryggadaptern.

bekväm användning

biblioteket säkerställer stöd för WebSockets, samt perfekt hantering av långvariga HTTP-förfrågningar. Så att skapa en realtidsapp blir lättare. Dessutom är det ett open source-projekt. Biblioteket är tillgängligt på GitHub under Apache License Version 2.0.

utmärkta resultat

HTTP-kit visar hög prestanda och fungerar snabbt trots stora belastningar. Samtidigt kräver varje anslutning bara några kB minne. En klient / server som skrivs från början är tillgänglig som en enda ~90kB burk med 0 beroenden och ~3k rader med tydlig kod.

många programutvecklare anser HTTP-kit som ett grundläggande verktyg för Clojure programmering.

Compojure och Bidi

syfte: routing på server

kod: https://github.com/juxt/bidi, https://github.com/weavejester/compojure

både Compojure och Bidi är tekniker för routing i webbappar. Det första biblioteket är ganska populärt bland samhället, medan det andra är känt som en praktisk lösning för att skriva i ClojureScript.

hur fungerar Compojure och Bidi?

dessa små bibliotek säkerställer routing på en webbserver. Som ett resultat kan en mjukvaruutvecklare skriva applikationer som består av flera separata delar.

vad är skillnaden mellan dem?

de 2 biblioteken utför samma funktion. Men, till skillnad från Compojure, Bidi:

  • stöder både clj och cljs
  • är isomorf och utbyggbar

huvudskillnaden är att i Bidi-rutter finns datastrukturer. Det finns inga makron här. Så, biblioteket ger ett bekvämt dubbelriktat tillvägagångssätt och andra fördelar. Vissa webbutvecklare föredrar Bidi eftersom det visar varje rutt för en viss hanterare. Dessutom finns det möjlighet att läsa rutterna från en konfigurationsfil, generera och omvandla dem genom funktioner och introspekt. De arbetar oberoende av hanterade förfrågningar. Så utvecklaren kan matcha saker som inte nödvändigtvis hanterar (till exempel nyckelord).

Lacinia

syfte: implementering av GraphQL i Clojure-programmering

kod: https://github.com/walmartlabs/lacinia

detta populära Clojure-bibliotek är användbart för dem, som vill implementera GraphQL medan du arbetar med webb-API: er.

hur verkar Lacinia?

ursprungligen är GraphQL skrivet i JavaScript. Lacinia är en officiell hänvisning till denna implementering. Det är skrivet i analogi med den ursprungliga specifikationen. Det kan kallas en backend-agnostisk GraphQL query execution engine. Så, biblioteket ger kontakt mellan dina data och GraphQL-klienten.

anledningar till att använda Lacinia

med GraphQL kan du enkelt få ett rikare, mer komplicerat webb-API. Lacinia förenklar API utveckling eftersom den stöder inline / namngivna frågefragment, GraphQL Schema introspektion, abonnemang, gränssnitt, fackföreningar, enums, ingångar och anpassade skalärer.

skrivet på ett EDN-baserat schemaspråk fungerar biblioteket perfekt med GraphQL-frågor. Den är byggd på Antlr4. Lacinia hjälper till att rik effektiv asynkron frågekörning. Du kan ansluta den till någon Clojure HTTP pipeline och använda följeslagare biblioteket lacinia-piedestal för HTTP stöd.

HoneySQL och HugSQL

syfte: framgångsrik databasinteraktion

kod: https://github.com/jkk/honeysql, https://github.com/layerware/hugsql

många webbprogrammerare känner sig mer bekväma med att arbeta med SQL-teknik, som Oracle, MS SQL, MySQL, PostgreSQL, SQLite, etc. HoneySQL och HugSQL är frågebyggare som ger stabil åtkomst till SQL-databaser i Clojure-applikationer.

hur fungerar HoneySQL och HugSQL?

båda biblioteken säkerställer att SQL ingår i Clojure-programmering. Så du kommer att kunna skriva SQL-databaskommandon även i Clojure web apps.

vad är skillnaden mellan dem?

med HugSQL börjar du med att skriva separata SQL-filer och lägga dem i din ansökan. Frågekonstruktören är inspirerad av ett annat populärt bibliotek, YeSQL. Det tolkar inte bara SQL-filer i Clojure-funktioner utan är också lämpligt för fler användningsfall än YeSQL. HugSQL underhålls aktivt. Den har protokollbaserade adaptrar som stöder flera databaslib.

HugSQL har flera fördelar på grund av 2 grundläggande funktioner:

  • frågorna skrivs direkt, en fråga för varje önskad funktion;
  • frågorna skrivs i SQL.

HugSQL pros

HugSQL ger separation av Clojure syntax och SQL semantik (vad och hur).

  1. vi beskriver vad vi ska göra i Clojure

(get-user-e-post-by-användarnamn “Alexandr Petrov”) ;->

  1. vi beskriver hur man gör detta i SQL

— :namn get-user-e-post-by-användarnamn:? : *

välj user_emails.e-post från user_emails där user_emails.user_id =: id

som ett resultat kan vi ändra logiken för att få data direkt i SQL, utan att skriva om Clojure-kod. Det är användbart när ett databasschema ändras och den gamla frågan inte returnerar den nödvändiga strukturen.

dessutom är SQL själv ett mycket kraftfullare verktyg för att arbeta med en specifik DBMS. Det gör det möjligt att skriva stora komplexa frågor med” gå med”, aggregeringar och fönsterfunktioner, vilket kan vara extremt svårt i Clojure.

dessutom tillåter SQL att använda fördelarna med en specifik DBMS (till exempel Postgres). Det är viktigt om du är säker på att databasen inte kommer att ändras.

HugSQL cons

  • det är svårt att ändra DBMS mitt i projektet. Det kommer att bli nödvändigt att kontrollera många förfrågningar och noggrant testa syntaxstöd och specifik utmatning.
  • du kan skicka parametrar till SQL-frågor. Men i vissa fall måste delarna av frågorna bero på vissa villkor. Även om HugSQL-utdrag gör det möjligt att slutföra den här uppgiften, måste du oftare göra det med Clojure.

HoneySQL tillhandahåller inte sådan separation av SQL och Clojure-kod. Du kommer att se frågorna som en karta.

HoneySQL pros

  • det är oberoende av en specifik implementering av DBMS eftersom det vanligtvis undviker direkta SQL-frågor. Istället för dem använder den specifika DSL.
  • det gör att du kan behålla din egen DSL baserat på Clojure-funktioner/makron. Du kan också skapa en frågebyggare med att spara mellanliggande förfrågningar på Clojure-sidan. Om du till exempel behöver definiera en användare med ID eller annan komplex logik kan du spara en del av HoneySQL-strukturen. Det kommer att visa att vi behöver exakt användaren, inte varorna eller andra data. Detta” fragment ” kan ersättas med nödvändiga frågor. Som ett resultat får du en kortare kod.

honeysql cons

  • det kan vara utmanande att använda fördelarna med ett specifikt DBMS, samt att skriva komplexa frågor (till exempel med fönsterfunktioner)
  • Clojure-programmeraren måste separera koden för att hämta data och koden för bearbetning av dessa data. Separationen leder till ytterligare arbete med refactoring.

danielsz / system

syfte: stöd för modulär arkitektur

kod: https://github.com/danielsz/system

användbar teknik för att utveckla mycket modulära applikationer i Clojure. Ramverket stöder effektiv interaktion mellan moduler och har god kompatibilitet med andra delar av det varierade Clojure-ekosystemet.

hur fungerar danielsz / system?

biblioteket tillåter en webbprogrammerare att använda en komponentbaserad metod. Så du kan bygga en applikation med moduler/komponenter och anslutningarna mellan dem. Varje komponent är ett speciellt objekt. Den har sin egen livscykel. Programmeraren beskriver hur den börjar, vad den behöver börja och hur den slutar.

till exempel består vår applikation av en webbserver och en databas. Det är ingen mening att starta webbservern innan databasen aktiveras. Vi beskriver databaskomponenten, beskriver serverkomponenten och serverns beroende av databasen. När vi startar projektet anger vi att vi måste starta webbservern. Biblioteket försöker automatiskt aktivera databasen. Sedan, om möjligt, startar den servern och överför den färdiga aktiverade databaskomponenten till webbserverkomponenten. Då, om nödvändigt, kommer systemet att stoppas.

anledningar till att använda danielsz / system

till skillnad från beskrivningen av hela applikationen med en uppsättning vanliga Clojure-funktioner gör projektbeskrivningen som komponenter det enkelt att ersätta en komponent med en annan. När du till exempel testar en applikation, ersätter en databas med en annan eller stänger av den helt och ersätter den med aktuell data.

när det gäller funktioner skulle du ändra gamla funktioner med nya. De kommer att ha samma namn, vilket ofta orsakar buggar. danielsz / system är en färdig uppsättning lösningar (för en webbserver, databas och mycket mer), organiserad som en uppsättning komponenter.

jag hoppas, nu förstår du bättre hur du använder Clojure och vilka tekniska lösningar som ska implementeras i ditt projekt. Mina ytterligare artiklar kommer att innehålla fördelarna med detta kraftfulla och vackra språk, samt några tips om utveckling av webbapplikationer, tjänster och API: er. Så prenumerera på FreshCode blog, om du vill lära dig mer om Clojure programming world.

Lämna ett svar

Din e-postadress kommer inte publiceras.