Clojure programming: frameworks and other tools

hoewel al deze lib ‘ s bedoeld zijn om Clojure programmeertaken te vereenvoudigen, kunnen ze een beginner verwarren. Soms is het moeilijk om te begrijpen hoe ze allemaal samen te stellen en een optimale oplossing te vinden voor een specifieke taak. Nu wil ik jullie mijn favoriete programma ‘ s laten zien voor het programmeren in Clojure.

  • werken met webserver en eindpunten
  • interactie met webserver en database
  • routering op server
  • gebruik van GraphQL in Clojure-programmering
  • ondersteuning van modulaire architectuur

laten we beginnen met de reis naar de Clojure-programmeerwereld!

opmerking: bij het verplaatsen van Java en andere soortgelijke talen, moet u weten dat er geen traditionele frameworks zijn in Clojure. Alles is gebaseerd op libs en hun collecties. Dit maakt de taal flexibeler en multifunctioneler.

Clojure ecosysteem omvat libs van verschillende complexiteit. Sommige van hen zijn slechts een set van extra functies (bijvoorbeeld, een bibliotheek voor het werken met de tijd). Ondertussen bieden system libs een platform voor het creëren van het hele framework. Dergelijke bibliotheken staan de programmeur toe om een toepassing te presenteren als een set componenten, de verbindingen tussen hen te beschrijven, enzovoort. De bibliotheek zelf zorgt voor het maken van afhankelijkheidsgrafieken. Het kan bijvoorbeeld componenten omzetten in meer begrijpelijke dingen, zoals functies.

doel: handig werken met webserver en eindpunten

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

de HTTP server abstraction is een belangrijk element van Clojure web stack. Het maakt eenvoudig werk met webserver en endpoints mogelijk, wat essentieel is voor een succesvolle app-ontwikkeling. Gemaakt naar analogie met WSGI (Python) en Rack (Ruby), Ring abstraheert de informatie van HTTP in een duidelijke, uniforme API. Als gevolg hiervan kan de webontwikkelaar modulaire systemen bouwen bestaande uit componenten en deze componenten delen tussen verschillende servers en applicaties.

Hoe werkt de Ring?

het krijgt HTTP-verzoeken en geeft HTTP-antwoorden terug. Ring is dus geen zogenaamd webapplicatie framework.

redenen voor het gebruik van Ring

als een dominante Webb-bibliotheek in Clojure-programmering, Ring is een goede keuze voor beginners. Allereerst, de belangrijkste functie is om een handige interface voor een breed scala van web-servers. Vanuit dit oogpunt is de technologie uiterst nuttig en werkt perfect.

een andere Ringfunctie is het leveren van een set modules (‘middleware’). Zo kunt u verschillende vooraf geschreven bibliotheken gebruiken, Compatibel met elkaar.

de meeste Clojure-programmeurs kiezen Ring voor eindpunten vanwege de mogelijkheid om middlewares te gebruiken. Deze modules maken het bijvoorbeeld mogelijk om de vereiste parameters te transformeren van een URL naar de Clojure code map. Een webontwikkelaar kan eenvoudig nieuwe middleware schrijven en integreren in het ecosysteem. Bijvoorbeeld, met behulp van de cemerick / friend bibliotheek, kunt u het autorisatieproces volledig beheren, verschillende strategieën toepassen (beginnend met de login en wachtwoord, eindigend met oAuth), enz. Ring middleware helpt om het proces gemakkelijk te beschrijven en te starten. Het sluit alle eindpunten die verboden zijn voor onbevoegde gebruikers.

ervaring met het gebruik van Ring is belangrijk voor het werken met andere Clojure-technologieën. Het is het eerste wat je kunt gebruiken om een app in beweging te krijgen.

Http-kit

doel: opstarten van de server

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

de event-driven, zeer effectieve HTTP server / client bibliotheek omvat WebSocket, evenals asynchrone ondersteuning.

Hoe werkt Http-kit?

het is een bibliotheek voor het organiseren van een goede webserverinteractie. Http-kit is geschikt voor zeer gelijktijdige asynchrone of synchrone toepassingen. Wat WebSocket en HTTP long polling / streaming betreft, is het beter om een uniforme API te hebben.

redenen voor het gebruik van Http-kit

flexibele oplossing

Http-kit biedt de mogelijkheid om zowel met synchronisatie-als async-systemen te werken. De eerste optie is eenvoudig, terwijl de tweede sneller werkt. Zo, u kunt een keuze maken op basis van uw specifieke doel. Bovendien kunt u gebruik maken van de bibliotheek met Ring. Het werkt bijna als de Jetty adapter.

handig gebruik

de bibliotheek zorgt voor ondersteuning voor WebSockets, evenals een perfecte afhandeling van langdurige HTTP-verzoeken. Zo, het creëren van een real-time app wordt gemakkelijker. Wat meer is, het is een open source project. De bibliotheek is beschikbaar op GitHub onder de Apache licentie versie 2.0.

uitstekende resultaten

HTTP-kit toont hoge prestaties en werkt snel, ondanks grote belasting. Tegelijkertijd vereist elke verbinding slechts een paar kB geheugen. Een client / server die is geschreven vanuit het niets is beschikbaar als een enkele ~ 90kB JAR met 0 afhankelijkheden en ~3k regels van duidelijke code.

veel softwareontwikkelaars beschouwen HTTP-kit als een basisgereedschap voor Clojure-programmering.

Compojure en Bidi

doel: routering op server

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

zowel Compojure als Bidi zijn technologieën voor routing in web apps. De eerste bibliotheek is heel populair onder de gemeenschap, terwijl de tweede staat bekend als een handige oplossing voor het schrijven in ClojureScript.

Hoe werken Compojure en Bidi?

deze kleine bibliotheken zorgen voor routering op een webserver. Als gevolg hiervan kan een software-ontwikkelaar applicaties schrijven die uit verschillende afzonderlijke delen bestaan.

Wat is het verschil tussen hen?

de 2 bibliotheken hebben dezelfde functie. Maar, in tegenstelling tot Compojure, Bidi:

  • ondersteunt zowel clj als cljs
  • is isomorf en uitbreidbaar

het belangrijkste verschil is dat Bidi routes datastructuren zijn. Er zijn hier geen macro ‘ s. Dus, de bibliotheek biedt een handige bi-directionele aanpak en andere voordelen. Sommige webontwikkelaars geven de voorkeur aan Bidi omdat het elke route van een bepaalde handler toont. Bovendien is er een mogelijkheid om de routes uit een configuratiebestand te lezen, te genereren en te transformeren door functies en introspect. Ze werken onafhankelijk van behandelde Verzoeken. Zo, de ontwikkelaar kan overeenkomen op dingen die niet noodzakelijk handlers (bijvoorbeeld, trefwoorden).

Lacinia

doel: implementatie van GraphQL in Clojure programmering

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

deze populaire Clojure bibliotheek is handig voor degenen die GraphQL willen implementeren tijdens het werken met web API ‘ s.

Hoe werkt Lacinia?

oorspronkelijk is GraphQL geschreven in JavaScript. Lacinia is een officiële verwijzing naar deze implementatie. Het is geschreven in analogie met de oorspronkelijke specificatie. Het kan een backend-agnostische GraphQL query execution engine worden genoemd. Dus, de bibliotheek biedt contact tussen uw gegevens en de GraphQL client.

redenen voor het gebruik van Lacinia

met GraphQL kunt u gemakkelijk een rijkere, ingewikkelder Web API krijgen. Lacinia vereenvoudigt API-ontwikkeling omdat het inline/named query fragmenten, GraphQL Schema introspectie, abonnementen, interfaces, vakbonden, enums, inputs en aangepaste scalars ondersteunt.

geschreven in een EDN-gebaseerde schemataal, werkt de bibliotheek perfect met GraphQL-queries. Het is gebouwd op Antlr4. Lacinia helpt rijk efficiënte asynchrone query uitvoering. U kunt het aansluiten op een Clojure HTTP-pijplijn en gebruik maken van de companion bibliotheek lacinia-pedestal voor HTTP-ondersteuning.

HoneySQL en HugSQL

doel: succesvolle database-interactie

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

veel web programmeurs voelen zich meer comfortabel werken met SQL-technologieën, zoals Oracle, MS SQL, MySQL, PostgreSQL, SQLite, enz. HoneySQL en HugSQL zijn query-bouwers die stabiele toegang bieden tot SQL-databases in Clojure-toepassingen.

Hoe werken HoneySQL en HugSQL?

beide bibliotheken zorgen ervoor dat SQL wordt omarmd in Clojure-programmering. Zo, je in staat om SQL database commando ‘ s te schrijven zal zijn, zelfs in Clojure web apps.

Wat is het verschil tussen hen?

met HugSQL begin je met het schrijven van afzonderlijke SQL-bestanden en zet je ze in je applicatie. De query constructor is geïnspireerd door een andere populaire bibliotheek, YeSQL. Het ontleedt niet alleen SQL-bestanden in Clojure-functies, maar is ook geschikt voor meer use cases dan YeSQL. HugSQL wordt actief onderhouden. Het heeft protocol-gebaseerde adapters die meerdere database libs ondersteunen.

HugSQL heeft verschillende voordelen dankzij 2 fundamentele kenmerken:

  • de queries worden direct geschreven, één query voor elke vereiste functie;
  • de queries worden geschreven in SQL.

HugSQL pros

HugSQL biedt scheiding van Clojure syntaxis en SQL semantiek (wat en hoe).

  1. we beschrijven wat u moet doen in Clojure

(get-user-e-mails-door-gebruikersnaam “Alexandr Petrov”) ;->

  1. we beschrijven hoe dit te doen in SQL

— :naam get-user-e-mails-door-gebruikersnaam:? : *

selecteer user_emails.e-mail van user_emails waar user_emails.user_id=: id

als gevolg hiervan kunnen we de logica van het krijgen van de gegevens direct in SQL veranderen, zonder Clojure code te herschrijven. Het is handig als een databaseschema wordt gewijzigd en de oude query de benodigde structuur niet retourneert.

bovendien is SQL zelf een veel krachtiger hulpmiddel voor het werken met een specifiek DBMS. Het maakt het schrijven van grote complexe query ‘ s met “join”, aggregaties en Venster functies, die uiterst moeilijk in Clojure kan zijn.

Bovendien maakt SQL het gebruik van voordelen van een specifiek DBMS (bijvoorbeeld Postgres) mogelijk. Het is belangrijk als je er zeker van bent dat de database niet zal worden gewijzigd.

HugSQL cons

  • het is moeilijk om DBMS te veranderen in het midden van het project. Het zal nodig zijn om veel verzoeken te controleren en zorgvuldig testen syntaxis ondersteuning en Specifieke uitvoer.
  • u kunt parameters doorgeven aan SQL-queries. Maar in sommige gevallen moeten de delen van de vragen afhankelijk zijn van bepaalde voorwaarden. Hoewel HugSQL-fragmenten deze taak mogelijk maken, moet u dit vaker doen met Clojure.

HoneySQL biedt een dergelijke scheiding van SQL-en Clojure-code niet. U ziet de queries als een kaart.

HoneySQL pros

  • het is onafhankelijk van een specifieke implementatie van het DBMS omdat het meestal directe SQL-query ‘ s vermijdt. In plaats daarvan gebruikt het specifieke DSL.
  • Hiermee kunt u uw eigen DSL onderhouden op basis van Clojure-functies / macro ‘ s. U kunt ook een query builder maken met het opslaan van tussentijdse verzoeken aan de Clojure kant. Als u bijvoorbeeld een gebruiker moet definiëren op basis van ID of andere complexe logica, kunt u een deel van de HoneySQL-structuur opslaan. Het zal aantonen dat we precies de gebruiker nodig hebben, niet de goederen of andere gegevens. Dit “fragment” kan worden vervangen door de nodige queries. Als gevolg hiervan krijgt u een kortere code.

HoneySQL cons

  • het kan een uitdaging zijn om de voordelen van een specifiek DBMS te gebruiken en om complexe query ‘ s te schrijven (bijvoorbeeld met Vensterfuncties)
  • de Clojure-programmeur moet de code voor het ophalen van gegevens scheiden van de code voor het verwerken van deze gegevens. De scheiding leidt tot extra werkzaamheden aan refactoring.

danielsz / system

doel: ondersteuning van modulaire architectuur

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

nuttige technologie voor het ontwikkelen van zeer modulaire toepassingen in Clojure. Het framework ondersteunt effectieve interactie tussen modules en is goed compatibel met andere delen van het gevarieerde Clojure ecosysteem.

Hoe werkt danielsz / system?

de bibliotheek staat een webprogrammeur toe om een component-gebaseerde aanpak te gebruiken. U kunt dus een applicatie bouwen met behulp van modules / componenten en de verbindingen daartussen. Elke component is een speciaal object. Het heeft zijn eigen levenscyclus. De programmeur beschrijft hoe het begint, wat het moet starten en hoe het stopt.

bijvoorbeeld, onze applicatie bestaat uit een webserver en een database. Het heeft geen zin om de webserver te starten voordat de database wordt geactiveerd. We beschrijven de database component, beschrijven de server component, en de server afhankelijkheid van de database. Bij het opstarten van het project geven we aan dat we de webserver moeten starten. De bibliotheek zal automatisch proberen de database te activeren. Dan, indien mogelijk, zal het de server starten en de voltooide geactiveerde database component overbrengen naar de webserver component. Dan, indien nodig, zal het systeem worden gestopt.

redenen voor het gebruik van danielsz / system

in tegenstelling tot de beschrijving van de gehele toepassing met een set van gewone Clojure functies, maakt de projectbeschrijving als componenten het gemakkelijk om een component te vervangen door een andere. Bijvoorbeeld, bij het testen van een toepassing, het vervangen van een database door een andere, of het volledig uitschakelen, het vervangen door de huidige gegevens.

in het geval van functies, zou u oude functies veranderen door nieuwe. Ze zullen dezelfde naam hebben, wat vaak bugs veroorzaakt. danielsz / system is een kant-en-klare set van oplossingen (voor een webserver, database, en nog veel meer), georganiseerd als een set van componenten.

ik hoop dat u nu beter begrijpt hoe u Clojure moet gebruiken en welke technische oplossingen in uw project moeten worden geïmplementeerd. Mijn verdere artikelen zullen de voordelen van deze krachtige en mooie taal, evenals enkele tips over de ontwikkeling van webapplicaties, diensten, en API ‘ s. Dus, abonneer je op FreshCode blog, als je meer wilt weten over Clojure programmeren wereld te leren.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.