programowanie Clojure: frameworki i inne narzędzia

chociaż wszystkie te biblioteki mają na celu uproszczenie zadań programistycznych Clojure,mogą wprowadzać w błąd początkującego. Czasami trudno jest zrozumieć, jak połączyć je wszystkie i znaleźć optymalne rozwiązanie dla konkretnego zadania. Teraz pokażę wam Moje ulubione narzędzia do programowania w Clojure.

  • praca z serwerem WWW i punktami końcowymi
  • interakcja z serwerem WWW i bazą danych
  • routing na serwerze
  • korzystanie z GraphQL w programowaniu Clojure
  • obsługa architektury modułowej

zacznijmy podróż do świata programowania Clojure!

Uwaga: przechodząc z Javy i innych podobnych języków, powinieneś wiedzieć, że w Clojure nie ma żadnych tradycyjnych frameworków. Wszystko opiera się na bibliotekach i ich kolekcjach. Dzięki temu język jest bardziej elastyczny i uniwersalny.

ekosystem Clojure obejmuje biblioteki o różnej złożoności. Niektóre z nich są tylko zestawem dodatkowych funkcji (na przykład biblioteka do pracy z czasem). Tymczasem biblioteki systemowe stanowią platformę do tworzenia całego frameworka. Takie biblioteki pozwalają programiście przedstawić aplikację jako zestaw komponentów, opisać połączenia między nimi i tak dalej. Sama biblioteka zapewnia tworzenie wykresów zależności. Na przykład może przekształcać komponenty w bardziej zrozumiałe rzeczy, takie jak funkcje.

: wygodna praca z serwerem WWW i punktami końcowymi

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

abstrakcja serwera HTTP jest kluczowym elementem stosu sieci Clojure. Umożliwia prostą pracę z serwerem WWW i punktami końcowymi, co jest niezbędne do pomyślnego rozwoju aplikacji. Stworzony w analogii do WSGI (Python) i Rack (Ruby), Ring abstrahuje informacje HTTP do jasnego, ujednoliconego API. W rezultacie web developer może budować systemy modułowe składające się z komponentów i udostępniać te komponenty między różnymi serwerami i aplikacjami.

jak działa pierścień?

pobiera żądania HTTP i zwraca odpowiedzi HTTP. Ring nie jest więc tak zwanym frameworkiem aplikacji internetowych.

powody używania Ring

jako dominującej biblioteki internetowej w programowaniu Clojure, Ring jest dobrym wyborem dla początkujących. Przede wszystkim jego główną funkcją jest zapewnienie wygodnego interfejsu dla szerokiej gamy serwerów internetowych. Z tego punktu widzenia technologia jest niezwykle przydatna i działa idealnie.

kolejną funkcją pierścienia jest dostarczanie zestawu modułów (“middleware”). Pozwala więc korzystać z różnych wstępnie napisanych bibliotek, kompatybilnych ze sobą.

większość programistów Clojure wybiera Pierścień dla punktów końcowych ze względu na jego zdolność do korzystania z programów pośrednich. Na przykład moduły te umożliwiają przekształcenie wymaganych parametrów z adresu URL na mapę kodu Clojure. Programista może łatwo napisać nowe oprogramowanie pośrednie i zintegrować je z ekosystemem. Na przykład, korzystając z biblioteki cemerick/friend, możesz w pełni zarządzać procesem autoryzacji,stosować różne strategie (począwszy od loginu i hasła, kończąc na oAuth) itp. Oprogramowanie pośredniczące Ring pomaga wygodnie opisać i rozpocząć proces. Zamyka wszystkie punkty końcowe, które są zabronione dla nieautoryzowanych użytkowników.

doświadczenie w użyciu pierścienia jest ważne w pracy z innymi technologiami Clojure. Jest to pierwsza rzecz, której możesz użyć, aby przenieść aplikację.

Http-kit

cel: uruchomienie serwera

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

oparta na zdarzeniach, wysoce efektywna biblioteka serwera/klienta HTTP zawiera WebSocket, a także wsparcie asynchroniczne.

jak działa Http-kit?

jest to biblioteka do organizowania prawidłowej interakcji z serwerem WWW. Http-kit jest odpowiedni dla wysoce równoczesnych aplikacji asynchronicznych lub synchronicznych. Jeśli chodzi o WebSocket i HTTP Long polling / streaming, lepiej jest posiadać ujednolicone API.

powody korzystania z Http-kit

elastyczne rozwiązanie

Http-kit zapewnia możliwość pracy zarówno z systemami synchronizacji, jak i asynchronizacji. Pierwsza opcja jest prosta, a druga działa szybciej. Możesz więc dokonać wyboru w oparciu o swój konkretny cel. Ponadto możesz korzystać z biblioteki z pierścieniem. Działa prawie jak Adapter Molo.

wygodne użytkowanie

biblioteka zapewnia obsługę Websocketów, a także doskonałą obsługę długo utrzymywanych żądań HTTP. Tworzenie aplikacji w czasie rzeczywistym staje się łatwiejsze. Co więcej, jest to projekt open source. Biblioteka jest dostępna na Githubie na licencji Apache w wersji 2.0.

doskonałe wyniki

HTTP-kit wykazuje wysoką wydajność i działa szybko pomimo dużych obciążeń. Jednocześnie każde połączenie wymaga tylko kilku kB pamięci. Klient / serwer napisany od podstaw jest dostępny jako pojedynczy JAR ~90kB z 0 zależnościami i ~ 3K liniami czystego kodu.

wielu programistów uważa HTTP-kit za podstawowe narzędzie do programowania Clojure.

Compojure i Bidi

przeznaczenie: routing na serwerze

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

zarówno Compojure, jak i Bidi to technologie routingu w aplikacjach internetowych. Pierwsza Biblioteka jest dość popularna wśród społeczności, a druga znana jest jako poręczne rozwiązanie do pisania w ClojureScript.

jak działają Compojure i Bidi?

te małe biblioteki zapewniają routing na serwerze WWW. W rezultacie programista może pisać aplikacje, które składają się z kilku oddzielnych części.

Jaka jest różnica między nimi?

te 2 biblioteki pełnią tę samą funkcję. Ale, w przeciwieństwie do Compojure, Bidi:

  • obsługuje zarówno clj, jak i cljs
  • jest izomorficzny i rozszerzalny

główną różnicą jest to, że w trasach Bidi są struktury danych. Nie ma tu makr. Tak więc Biblioteka zapewnia wygodne dwukierunkowe podejście i inne zalety. Niektórzy programiści wolą Bidi, ponieważ pokazuje każdą trasę określonego programu obsługi. Ponadto istnieje możliwość odczytania tras z pliku konfiguracyjnego, wygenerowania i przekształcenia ich za pomocą funkcji i introspekcji. Działają one niezależnie od obsługiwanych żądań. Programista może więc dopasować rzeczy, które niekoniecznie są instrukcjami obsługi (na przykład słowa kluczowe).

Lacinia

cel: implementacja GraphQL w programowaniu Clojure

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

ta popularna biblioteka Clojure jest przydatna dla tych, którzy chcą zaimplementować GraphQL podczas pracy z interfejsami API.

jak działa Lacinia?

pierwotnie GraphQL jest napisany w JavaScript. Lacinia jest oficjalnym odniesieniem do tej implementacji. Jest napisany w analogii ze wstępną specyfikacją. Można go nazwać mechanizmem wykonywania zapytań GraphQL. Tak więc Biblioteka zapewnia kontakt pomiędzy Twoimi danymi a klientem GraphQL.

powody używania Lacinia

korzystając z GraphQL, możesz łatwo uzyskać bogatsze, bardziej skomplikowane API internetowe. Lacinia upraszcza rozwój API, ponieważ obsługuje wbudowane / nazwane fragmenty zapytań, introspekcję schematu GraphQL, subskrypcje, interfejsy, związki, wyliczenia, wejścia i niestandardowe Skalary.

napisana w języku schematów opartych na EDN, biblioteka doskonale współpracuje z zapytaniami GraphQL. Zbudowany jest na bazie Antlr4. Lacinia pomaga wzbogacić wydajne wykonywanie zapytań asynchronicznych. Możesz podłączyć go do dowolnego potoku http Clojure i użyć biblioteki towarzyszącej lacinia-pedestal do obsługi HTTP.

HoneySQL i HugSQL

cel: udana interakcja z bazą danych

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

wielu programistów internetowych czuje się bardziej komfortowo pracując z technologiami SQL, takimi jak Oracle, MS SQL, MySQL, PostgreSQL, SQLite itp. HoneySQL i HugSQL są konstruktorami zapytań, które zapewniają stabilny dostęp do baz danych SQL w aplikacjach Clojure.

jak działają HoneySQL i HugSQL?

obie biblioteki zapewniają obsługę języka SQL w programowaniu Clojure. Dzięki temu będziesz mógł pisać polecenia bazy danych SQL nawet w aplikacjach internetowych Clojure.

Jaka jest różnica między nimi?

korzystając z HugSQL, zaczynasz od pisania oddzielnych plików SQL i umieszczania ich w aplikacji. Konstruktor zapytań jest inspirowany inną popularną biblioteką, YeSQL. Nie tylko przetwarza pliki SQL do funkcji Clojure, ale nadaje się również do większej liczby przypadków użycia niż YeSQL. HugSQL jest aktywnie utrzymywany. Posiada Adaptery oparte na protokole obsługujące wiele bibliotek baz danych.

HugSQL ma kilka zalet ze względu na 2 podstawowe funkcje:

  • zapytania są pisane bezpośrednio, po jednym zapytaniu dla każdej wymaganej funkcji;
  • zapytania są pisane w SQL.

HugSQL pros

HugSQL zapewnia oddzielenie składni Clojure i semantyki SQL (co i jak).

  1. opisujemy co robić w Clojure

(get-user-emails-by-username “Alexandr Petrov”) ;->

  1. opisujemy jak to zrobić w SQL

— :nazwa get-user-emails-by-username:? : *

wybierz user_emails.e-mail z user_emails gdzie user_emails.user_id =: id

w rezultacie możemy zmienić logikę pobierania danych bezpośrednio w SQL, bez przepisywania kodu Clojure. Jest to przydatne, gdy schemat bazy danych jest zmieniany, a stare zapytanie nie zwraca wymaganej struktury.

co więcej, sam SQL jest znacznie potężniejszym narzędziem do pracy z określonym DBMS. Pozwala na pisanie dużych złożonych zapytań z “join”, agregacjami i funkcjami okien, co w Clojure może być niezwykle trudne.

ponadto SQL pozwala na korzystanie z zalet określonego DBMS (na przykład Postgres). To ważne, jeśli masz pewność, że baza danych nie zostanie zmieniona.

hugsql cons

  • trudno jest zmienić DBMS w środku projektu. Konieczne będzie sprawdzenie wielu żądań i dokładne przetestowanie obsługi składni i konkretnego wyjścia.
  • możesz przekazywać parametry do zapytań SQL. Ale w niektórych przypadkach części zapytań muszą być uzależnione od pewnych warunków. Chociaż fragmenty HugSQL pozwalają na wykonanie tego zadania, częściej musisz to robić za pomocą Clojure.

HoneySQL nie zapewnia takiego rozdziału kodu SQL i Clojure. Zapytania zobaczysz jako mapę.

honeysql pros

  • jest niezależny od konkretnej implementacji DBMS, ponieważ zwykle unika bezpośrednich zapytań SQL. Zamiast nich używa określonego DSL.
  • pozwala na utrzymanie własnego DSL w oparciu o funkcje/makra Clojure. Możesz także utworzyć konstruktor zapytań z zapisywaniem żądań pośrednich po stronie Clojure. Na przykład, jeśli chcesz zdefiniować użytkownika za pomocą ID lub innej złożonej logiki, możesz zapisać część struktury HoneySQL. Pokaże, że potrzebujemy dokładnie użytkownika, a nie towarów lub innych danych. Ten “fragment” można zastąpić niezbędnymi zapytaniami. W rezultacie otrzymasz krótszy kod.

honeysql cons

  • korzystanie z zalet określonego DBMS może być trudne, a także pisanie złożonych zapytań (na przykład za pomocą funkcji okienkowych)
  • programista Clojure musi oddzielić kod do pobierania danych od kodu do przetwarzania tych danych. Separacja prowadzi do dodatkowych prac nad refaktoryzacją.

danielsz / system

przeznaczenie: wsparcie architektury modułowej

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

pomocna technologia do tworzenia wysoce modułowych aplikacji w Clojure. Framework wspiera efektywną interakcję między modułami i ma dobrą kompatybilność z innymi częściami zróżnicowanego ekosystemu Clojure.

jak działa danielsz / system?

Biblioteka pozwala programistom internetowym korzystać z podejścia opartego na komponentach. Możesz więc zbudować aplikację za pomocą modułów/komponentów i połączeń między nimi. Każdy komponent jest specjalnym obiektem. Ma swój własny cykl życia. Programista opisuje, jak się uruchamia, co musi uruchomić i jak się zatrzymuje.

na przykład nasza aplikacja składa się z serwera WWW i bazy danych. Uruchamianie serwera www przed aktywacją bazy danych nie ma sensu. Opisujemy komponent bazy danych, komponent serwera i zależność serwera od bazy danych. Podczas uruchamiania projektu wskazujemy, że musimy uruchomić serwer WWW. Biblioteka automatycznie spróbuje aktywować bazę danych. Następnie, jeśli to możliwe, uruchomi serwer i przeniesie gotowy aktywowany komponent bazy danych do komponentu serwera www. Następnie, jeśli to konieczne, system zostanie zatrzymany.

powody korzystania z danielsz / system

w przeciwieństwie do opisu całej aplikacji z zestawem zwykłych funkcji Clojure, opis projektu jako komponenty ułatwia wymianę jednego komponentu na inny. Na przykład podczas testowania aplikacji, zamiany jednej bazy danych na inną lub całkowitego wyłączenia, zamiany na bieżące dane.

w przypadku funkcji zmienisz stare funkcje na nowe. Będą miały tę samą nazwę, co często powoduje błędy. danielsz / system to gotowy zestaw rozwiązań (dla serwera www, bazy danych i wielu innych), zorganizowany jako zestaw komponentów.

mam nadzieję, że teraz lepiej zrozumiesz, jak korzystać z Clojure i jakie rozwiązania techniczne powinny zostać wdrożone w Twoim projekcie. Moje dalsze artykuły będą zawierać zalety tego potężnego i pięknego języka, a także kilka wskazówek na temat tworzenia aplikacji internetowych, usług i interfejsów API. Subskrybuj Blog FreshCode, jeśli chcesz dowiedzieć się więcej o świecie programowania Clojure.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.