Clojure programming: frameworks and other tools

selv om alle disse libs tar sikte på å forenkle clojure programmeringsoppgaver, kan de forvirre en nybegynner. Noen ganger er det vanskelig å forstå hvordan man setter dem sammen og finner en optimal løsning for en bestemt oppgave. Så, nå vil jeg vise deg mine favorittverktøy for programmering i Clojure.

  • arbeide med webserver og endepunkter
  • interaksjon med webserver og database
  • ruting på server
  • bruke GraphQL I Clojure programmering
  • støtte for modulær arkitektur

La oss starte turen til clojure programmering verden!

Merk: når du flytter Fra Java og andre lignende språk, bør du vite at det ikke er noen tradisjonelle rammer i Clojure. Alt er basert på libs og deres samlinger. Dette gjør språket mer fleksibelt og multifunksjonelt.

Clojure økosystem inkluderer libs av forskjellig kompleksitet. Noen av dem er bare et sett med tilleggsfunksjoner (for eksempel et bibliotek for å jobbe med tiden). I mellomtiden gir system libs en plattform for å skape hele rammen. Slike biblioteker tillater programmereren å presentere et program som et sett med komponenter, beskrive forbindelsene mellom dem og så videre. Biblioteket selv sikrer opprettelsen av avhengighetsgrafer. For eksempel kan det konvertere komponenter til mer forståelige ting, som funksjoner.

Formål: praktisk arbeid med webserver og endepunkter

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

HTTP server abstraksjon er et sentralt element I Clojure web stack. Det muliggjør enkelt arbeid med webserver og endepunkter, noe som er viktig for vellykket apputvikling. Laget i analogi MED WSGI (Python) og Rack (Ruby), abstraherer Ring INFORMASJONEN TIL HTTP til en klar, enhetlig API. Som et resultat, kan webutvikler bygge modulære systemer besto av komponenter og dele disse komponentene mellom ulike servere og applikasjoner.

Hvordan Fungerer Ringen?

det får HTTP-forespørsler og returnerer HTTP-svar. Så Ring er ikke et såkalt webapplikasjonsrammeverk.

Grunner til Å bruke Ring

Som et dominerende webbibliotek I Clojure programmering, Er Ring et godt valg for nybegynnere. Først av alt er hovedfunksjonen å gi et praktisk grensesnitt for et bredt spekter av webservere. Fra dette synspunktet er teknologien ekstremt nyttig og fungerer perfekt.

En Annen Ringfunksjon gir et sett med moduler (‘middleware’). Så, det lar deg bruke forskjellige forhåndsskrevne biblioteker, kompatible med hverandre.

De Fleste av Clojure programmerere velger Ring for endepunkter på grunn av sin evne til å bruke middlewares. For eksempel tillater disse modulene å transformere nødvendige parametere fra EN URL til Clojure-kodekartet. En webutvikler kan enkelt skrive ny mellomvare og integrere den i økosystemet. For eksempel, ved hjelp av cemerick / friend-biblioteket, kan du fullt ut administrere autorisasjonsprosessen, bruke ulike strategier (starter fra innlogging og passord, slutter med oAuth), etc. Ring mellomvare bidrar til å enkelt beskrive og starte prosessen. Den lukker alle endepunkter som er forbudt for uautoriserte brukere.

Erfaring med Bruk Av Ring er viktig for å jobbe med Andre Clojure-teknologier. Det er det første du kan bruke til å få en app flytte.

Http-kit

Formål: serverstart

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

det hendelsesdrevne, svært effektive HTTP server / klientbiblioteket inkluderer WebSocket, samt asynkron støtte.

Hvordan Fungerer Http-kit?

det er et bibliotek for å organisere en skikkelig webserverinteraksjon. Http-kit er egnet for svært samtidige asynkrone eller synkrone applikasjoner. Når Det gjelder WebSocket og HTTP long polling / streaming, er det bedre å ha en enhetlig API.

Grunner til Å bruke Http-kit

Fleksibel løsning

Http-kit gir en mulighet til å arbeide både med sync og async systemer. Det første alternativet er enkelt, mens det andre fungerer raskere. Så, du kan gjøre et valg basert på ditt spesifikke formål. Videre kan du bruke biblioteket Med Ring. Det fungerer nesten som Jetty adapter.

Praktisk bruk

biblioteket sikrer støtte For WebSockets, samt perfekt håndtering av LANGVARIGE HTTP-forespørsler. Så, å lage en real-time app blir enklere. I tillegg er det et open source-prosjekt. Biblioteket er tilgjengelig på GitHub Under Apache License Versjon 2.0.

Utmerkede resultater

HTTP-kit viser høy ytelse og fungerer raskt til tross for store belastninger. Samtidig krever hver tilkobling bare noen få kB minne. En klient / server som er skrevet fra bunnen av er tilgjengelig som en enkelt ~90kB JAR med 0 avhengigheter og ~3k linjer med klar kode.

MANGE programvareutviklere anser HTTP-kit som et grunnleggende verktøy for Clojure programmering.

Compojure Og Bidi

Formål: ruting på server

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

Både Compojure og Bidi er teknologier for ruting i web apps. Det første biblioteket er ganske populært blant samfunnet, mens det andre er kjent som en praktisk løsning for å skrive I ClojureScript.

hvordan Fungerer Compojure og Bidi?

disse små bibliotekene sikrer ruting på en webserver. Som et resultat kan en programvareutvikler skrive applikasjoner som består av flere separate deler.

hva er forskjellen mellom dem?

de 2 bibliotekene utfører samme funksjon. Men, i motsetning Til Compojure, Bidi:

  • støtter både clj og cljs
  • er isomorf og utvidbar

hovedforskjellen er at I Bidi-ruter er datastrukturer. Det er ingen makroer her. Så gir biblioteket en praktisk toveis tilnærming og andre fordeler. Noen webutviklere foretrekker Bidi fordi det viser hver rute for en bestemt handler. Videre er det en mulighet til å lese rutene fra en konfigurasjonsfil, generere og forvandle dem ved funksjoner og introspekt. De jobber uavhengig av håndterte forespørsler. Så, utvikleren kan matche på ting som ikke nødvendigvis håndterer (for eksempel søkeord).

Lacinia

Formål: implementering Av GraphQL i Clojure programmering

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

Denne populære clojure bibliotek er nyttig for dem, som ønsker å implementere GraphQL mens du arbeider med web-Apier.

hvordan Fungerer Lacinia?

Opprinnelig Er GraphQL skrevet I JavaScript. Lacinia er en offisiell referanse til denne implementeringen. Den er skrevet i analogi med den opprinnelige spesifikasjonen. Det kan kalles en backend-agnostisk GraphQL query execution engine. Så gir biblioteket kontakt mellom dataene dine og GraphQL-klienten.

Grunner til Å bruke Lacinia

Ved Hjelp Av GraphQL kan du enkelt få en rikere, mer komplisert WEB API. Lacinia forenkler API utvikling fordi den støtter inline/navngitte spørringsfragmenter, GraphQL Skjema Introspeksjon, abonnementer, grensesnitt, fagforeninger, enums, innganger og tilpassede skalarer.

Skrevet I ET EDN-basert skjemaspråk, fungerer biblioteket perfekt med GraphQL-spørringer. Den er bygget På Antlr4. Lacinia bidrar til rik effektiv asynkron spørring utførelse. Du kan koble den til Noen CLOJURE HTTP rørledning og bruke følges bibliotek lacinia-pidestall FOR HTTP-støtte.

HoneySQL Og HugSQL

Formål: vellykket databaseinteraksjon

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

Mange webprogrammerere føler seg mer komfortable med Å jobbe MED SQL-teknologier, som Oracle, MS SQL, MySQL, PostgreSQL, SQLite, etc. HoneySQL Og HugSQL er spørringsbyggere som gir stabil tilgang til SQL-databaser i Clojure-applikasjoner.

Hvordan Fungerer HoneySQL og HugSQL?

begge bibliotekene sikre omfavner SQL I Clojure programmering. Så, du vil kunne skrive SQL database kommandoer selv I Clojure web apps.

hva er forskjellen mellom dem?

Ved Hjelp Av HugSQL starter du med å skrive separate SQL-filer og sette dem i søknaden din. Spørringen konstruktøren er inspirert Av et annet populært bibliotek, YeSQL. Det analyserer IKKE BARE SQL-filer I Clojure-funksjoner, men er også egnet for flere brukstilfeller Enn YeSQL. HugSQL er aktivt vedlikeholdt. Den har protokollbaserte adaptere som støtter flere database libs.

HugSQL har flere fordeler på grunn av 2 grunnleggende funksjoner:

  • spørringene er skrevet direkte, en spørring for hver nødvendig funksjon;
  • spørringene er skrevet I SQL.

HugSQL pros

HugSQL gir separasjon Av Clojure syntaks og SQL semantikk (HVA og HVORDAN).

  1. vi beskriver HVA du skal gjøre I Clojure

(get-user-e-post-by-brukernavn “Alexandr Petrov”) ;->

  1. vi beskriver HVORDAN du gjør DETTE I SQL

— :navn get-bruker-e-post-by-brukernavn 😕 : *

velg user_emails.e-post fra user_emails hvor user_emails.user_id =: id

som et resultat kan vi endre logikken for å få dataene direkte i SQL, uten å skrive Om Clojure-koden. Det er nyttig når et databaseskjema endres, og den gamle spørringen returnerer ikke den nødvendige strukturen.

VIDERE ER SQL selv et mye kraftigere verktøy for å jobbe med en bestemt DBMS. Det gjør det mulig å skrive store komplekse spørringer med “join”, aggregeringer og Vindusfunksjoner, noe som kan være ekstremt vanskelig i Clojure.

VIDERE TILLATER SQL å bruke fordeler av en bestemt DBMS (For Eksempel Postgres). Det er viktig hvis du er sikker på at databasen ikke vil bli endret.

HugSQL cons

  • det er vanskelig å endre DBMS midt i prosjektet. Det vil være nødvendig å sjekke mange forespørsler og nøye teste syntaksstøtte og spesifikk utgang.
  • du kan sende parametere TIL SQL-spørringer. Men i noen tilfeller må delene av spørringene avhenge av visse forhold. Selv Om HugSQL-utdrag tillater å fullføre denne oppgaven, må du ofte gjøre Dette ved Hjelp Av Clojure.

HoneySQL gir ikke slik separasjon AV SQL-og Clojure-kode. Du vil se spørringene som et kart.

HoneySQL pros

  • Det er uavhengig av en bestemt implementering av DBMS fordi det vanligvis unngår direkte SQL-spørringer. I stedet for dem bruker den spesifikke DSL.
  • den lar opprettholde din EGEN DSL basert På Clojure funksjoner / makroer. Du kan også opprette en spørringsbygger med å lagre mellomliggende forespørsler på Clojure-siden. Hvis DU for EKSEMPEL trenger å definere en bruker ETTER ID eller annen kompleks logikk, kan du lagre en del Av HoneySQL-strukturen. Det vil vise at vi trenger akkurat brukeren, ikke varene eller andre data. Dette “fragmentet” kan erstattes av de nødvendige spørringene. Som et resultat vil du få en kortere kode.

HoneySQL cons

  • det kan være utfordrende å bruke fordelene med en bestemt DBMS, samt å skrive komplekse spørringer (for eksempel Med Vindusfunksjoner)
  • Clojure-programmereren må skille koden for å hente data og koden for behandling av disse dataene. Separasjonen fører til ytterligere arbeid på refactoring.

danielsz/system

Formål: støtte for modulær arkitektur

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

Nyttig teknologi for å utvikle svært modulære applikasjoner I Clojure. Rammeverket støtter effektivt samspill mellom moduler og har god kompatibilitet med andre deler av det varierte Clojure-økosystemet.

hvordan fungerer danielsz/system?

biblioteket tillater en webprogrammerer å bruke en komponentbasert tilnærming. Så, du kan bygge et program ved hjelp av moduler/komponenter og forbindelsene mellom dem. Hver komponent er et spesielt objekt. Den har sin egen livssyklus. Programmereren beskriver hvordan den starter, hva den trenger å starte, og hvordan den stopper.

for eksempel består vår applikasjon av en webserver og en database. Det gir ingen mening å starte webserveren før databasen er aktivert. Vi beskriver databasekomponenten, beskriver serverkomponenten og serverens avhengighet av databasen. Når vi starter prosjektet, indikerer vi at vi må starte webserveren. Biblioteket vil automatisk prøve å aktivere databasen. Så, hvis det er mulig, vil det starte serveren og overføre den ferdige aktiverte databasekomponenten til webserverkomponenten. Deretter stoppes systemet om nødvendig.

grunner til å bruke danielsz / system

I Motsetning til beskrivelsen av hele applikasjonen med et sett med vanlige Clojure-funksjoner, gjør prosjektbeskrivelsen som komponenter det enkelt å erstatte en komponent med en annen. For eksempel, når du tester et program, erstatter en database med en annen, eller slår den av helt, erstatter den med gjeldende data.

når det gjelder funksjoner, vil du endre gamle funksjoner med nye. De vil ha samme navn, noe som ofte forårsaker feil. danielsz / system er et ferdig sett med løsninger (for en webserver, database og mye mer), organisert som et sett med komponenter.

jeg håper, nå forstår du bedre hvordan Du bruker Clojure og hvilke tekniske løsninger som skal implementeres i prosjektet ditt. Mine videre artikler vil inkludere fordelene med dette kraftige og vakre språket, samt noen tips om utvikling av webapplikasjoner, tjenester og Apier. Så, abonner På FreshCode blog, hvis du vil lære mer om Clojure programming world.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.