Programación Clojure: frameworks y otras herramientas

Aunque todas estas bibliotecas tienen como objetivo simplificar las tareas de programación Clojure, pueden confundir a un principiante. A veces, es difícil entender cómo juntarlos todos y encontrar una solución óptima para una tarea específica. Por lo tanto, ahora quiero mostrarles mis herramientas favoritas para programar en Clojure.

  • trabajar con servidor web y endpoints
  • interacción con servidor web y base de datos
  • enrutamiento en servidor
  • usar GraphQL en programación Clojure
  • soporte de arquitectura modular

¡Comencemos el viaje al mundo de la programación Clojure!

Nota: al moverse desde Java y otros lenguajes similares, debe saber que no hay ningún framework tradicional en Clojure. Todo se basa en libs y sus colecciones. Esto hace que el lenguaje sea más flexible y polivalente.

El ecosistema de Clojure incluye bibliotecas de diferente complejidad. Algunas de ellas son solo un conjunto de funciones adicionales (por ejemplo, una biblioteca para trabajar con el tiempo). Mientras tanto, las bibliotecas de sistemas proporcionan una plataforma para crear todo el marco. Estas bibliotecas permiten al programador presentar una aplicación como un conjunto de componentes, describir las conexiones entre ellos, etc. La propia biblioteca garantiza la creación de gráficos de dependencias. Por ejemplo, puede convertir componentes en cosas más comprensibles, como funciones.

Propósito: trabajo cómodo con código de servidor web y puntos de conexión

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

La abstracción del servidor HTTP es un elemento clave de la pila web Clojure. Permite un trabajo sencillo con servidores web y terminales, lo cual es esencial para el desarrollo exitoso de aplicaciones. Creado en analogía con WSGI (Python) y Rack (Ruby), Ring abstrae la información de HTTP en una API clara y unificada. Como resultado, el desarrollador web puede construir sistemas modulares compuestos por componentes y compartir estos componentes entre varios servidores y aplicaciones.

¿Cómo funciona el anillo?

Obtiene solicitudes HTTP y devuelve respuestas HTTP. Por lo tanto, Ring no es un llamado marco de aplicaciones web.

Razones para usar Ring

Como biblioteca web dominante en la programación Clojure, Ring es una buena opción para principiantes. En primer lugar, su función principal es proporcionar una interfaz conveniente para una amplia gama de servidores web. Desde este punto de vista, la tecnología es extremadamente útil y funciona perfectamente.

Otra característica de anillo es proporcionar un conjunto de módulos (‘middleware’). Por lo tanto, le permite usar diferentes bibliotecas preescritas, compatibles entre sí.

La mayoría de los programadores de Clojure eligen Ring para endpoints debido a su capacidad de usar middlewares. Por ejemplo, estos módulos permiten transformar los parámetros necesarios de una URL al mapa de código de Clojure. Un desarrollador web puede escribir fácilmente un nuevo middleware e integrarlo en el ecosistema. Por ejemplo, usando la biblioteca cemerick / friend, puede administrar completamente el proceso de autorización, aplicar diferentes estrategias (comenzando por el nombre de usuario y la contraseña, terminando con OAuth), etc. El middleware de anillo ayuda a describir y comenzar el proceso de manera conveniente. Cierra todos los endpoints prohibidos para usuarios no autorizados.

La experiencia en el uso de Ring es importante para trabajar con otras tecnologías Clojure. Es lo primero que puede usar para mover una aplicación.

Http-kit

Propósito: inicio del servidor

Código: https://github.com/http-kit/http-kit

La biblioteca de cliente/servidor HTTP altamente eficaz y basada en eventos incluye WebSocket, así como soporte asincrónico.

¿Cómo funciona Http-kit?

Es una biblioteca para organizar una interacción adecuada con el servidor web. Http-kit es adecuado para aplicaciones asíncronas o síncronas altamente concurrentes. En cuanto a WebSocket y HTTP long polling / streaming, es mejor contar con una API unificada.

Razones para usar Http-kit

Solución flexible

Http-kit ofrece la oportunidad de trabajar con sistemas sync y async. La primera opción es simple, mientras que la segunda funciona más rápido. Por lo tanto, puede hacer una elección basada en su propósito específico. Además, puede utilizar la biblioteca con Anillo. Funciona casi como el adaptador de embarcadero.

Uso conveniente

La biblioteca garantiza el soporte para WebSockets, así como el manejo perfecto de solicitudes HTTP de larga duración. Por lo tanto, crear una aplicación en tiempo real se vuelve más fácil. Es más, es un proyecto de código abierto. La biblioteca está disponible en GitHub bajo la licencia Apache Versión 2.0.

Excelentes resultados

HTTP-kit muestra un alto rendimiento y funciona rápido a pesar de grandes cargas. Al mismo tiempo, cada conexión requiere solo unos pocos kB de memoria. Un cliente/servidor que se escribe desde cero está disponible como un único JAR de ~90 Kb con 0 dependencias y ~3k líneas de código claro.

Muchos desarrolladores de software consideran HTTP-kit como una herramienta básica para la programación Clojure.

Compojure y Bidi

Propósito: enrutamiento en el servidor

Código: https://github.com/juxt/bidi, https://github.com/weavejester/compojure

Compojure y Bidi son tecnologías de enrutamiento en aplicaciones web. La primera biblioteca es bastante popular entre la comunidad, mientras que la segunda es conocida como una solución práctica para escribir en ClojureScript.

¿Cómo funcionan Compojure y Bidi?

Estas pequeñas bibliotecas garantizan el enrutamiento en un servidor web. Como resultado, un desarrollador de software puede escribir aplicaciones que se componen de varias partes separadas.

¿Cuál es la diferencia entre ellos?

Las 2 bibliotecas realizan la misma función. Pero, a diferencia de Compojure, Bidi:

  • soporta tanto clj como cljs
  • es isomorfo y extensible

La principal diferencia es que en las rutas Bidi son estructuras de datos. No hay macros aquí. Por lo tanto, la biblioteca proporciona un enfoque bidireccional conveniente y otras ventajas. Algunos desarrolladores web prefieren Bidi porque muestra cada ruta de un controlador en particular. Además, existe la oportunidad de leer las rutas desde un archivo de configuración, generarlas y transformarlas mediante funciones e introspección. Funcionan independientemente de las solicitudes manejadas. Por lo tanto, el desarrollador puede coincidir en cosas que no son necesariamente manejadores (por ejemplo, palabras clave).

Lacinia

Propósito: implementación de GraphQL en programación Clojure

Código: https://github.com/walmartlabs/lacinia

Esta popular biblioteca de Clojure es útil para aquellos que desean implementar GraphQL mientras trabajan con API web.

¿Cómo actúa Lacinia?

Originalmente, GraphQL está escrito en JavaScript. Lacinia es una referencia oficial a esta implementación. Está escrito en analogía con la especificación inicial. Se puede llamar un motor de ejecución de consultas GraphQL independiente del backend. Por lo tanto, la biblioteca proporciona contacto entre sus datos y el cliente GraphQL.

Razones para usar Lacinia

Con GraphQL, puede obtener fácilmente una API web más rica y complicada. Lacinia simplifica el desarrollo de API porque admite fragmentos de consultas en línea/con nombre, Introspección de esquemas GraphQL, suscripciones, interfaces, uniones, enumeraciones, entradas y escalares personalizados.

Escrita en un lenguaje de esquemas basado en EDN, la biblioteca funciona perfectamente con consultas GraphQL. Está construido sobre Antlr4. Lacinia ayuda a una ejecución de consultas asíncronas eficiente y rica. Puede conectarlo a cualquier canalización HTTP Clojure y usar la biblioteca complementaria lacinia-pedestal para soporte HTTP.

HoneySQL y HugSQL

Propósito: interacción exitosa de la base de datos

Código: https://github.com/jkk/honeysql, https://github.com/layerware/hugsql

Muchos programadores web se sienten más cómodos trabajando con tecnologías SQL, como Oracle, MS SQL, MySQL, PostgreSQL, SQLite, etc. HoneySQL y HugSQL son creadores de consultas que proporcionan acceso estable a bases de datos SQL en aplicaciones Clojure.

¿Cómo funcionan HoneySQL y HugSQL?

Ambas bibliotecas garantizan la adopción de SQL en la programación Clojure. Por lo tanto, podrá escribir comandos de base de datos SQL incluso en aplicaciones web Clojure.

¿Cuál es la diferencia entre ellos?

Con HugSQL, comienza escribiendo archivos SQL separados y poniéndolos en su aplicación. El constructor de consultas está inspirado en otra biblioteca popular, YeSQL. No solo analiza archivos SQL en funciones Clojure, sino que también es adecuado para más casos de uso que YeSQL. HugSQL se mantiene activamente. Tiene adaptadores basados en protocolos que admiten múltiples bibliotecas de bases de datos.

HugSQL tiene varias ventajas debido a 2 características fundamentales:

  • las consultas se escriben directamente, una consulta para cada función requerida;
  • las consultas se escriben en SQL.

HugSQL pros

HugSQL proporciona separación de sintaxis Clojure y semántica SQL (QUÉ y CÓMO).

  1. Describimos QUÉ hacer en Clojure

(obtener correos electrónicos de usuario por nombre de usuario “Alexandr Petrov”) ;->

  1. Describimos CÓMO hacer esto en SQL

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

seleccione correo de usuario.correo electrónico de user_emails donde user_emails.user_id = :id

Como resultado, podemos cambiar la lógica de obtener los datos directamente en SQL, sin reescribir el código Clojure. Es útil cuando se cambia un esquema de base de datos y la consulta anterior no devuelve la estructura necesaria.

Además, SQL en sí es una herramienta mucho más potente para trabajar con un DBMS específico. Permite escribir consultas grandes y complejas con funciones de “unión”, agregaciones y Ventanas, que pueden ser extremadamente difíciles en Clojure.

Además, SQL permite utilizar los beneficios de un DBMS específico (por ejemplo, Postgres). Es importante si está seguro de que la base de datos no se cambiará.

cons HugSQL

  • Es difícil cambiar DBMS en medio del proyecto. Será necesario verificar muchas solicitudes y probar cuidadosamente el soporte de sintaxis y la salida específica.
  • Puede pasar parámetros a consultas SQL. Pero, en algunos casos, las partes de las consultas deben depender de ciertas condiciones. Aunque los fragmentos de código HugSQL permiten completar esta tarea, más a menudo es necesario hacer esto usando Clojure.

HoneySQL no proporciona dicha separación de código SQL y Clojure. Verá las consultas como un mapa.

HoneySQL pros

  • Es independiente de una implementación específica del DBMS porque generalmente evita consultas SQL directas. En lugar de ellos, utiliza DSL específico.
  • Permite mantener su propio DSL basado en funciones/macros de Clojure. También puede crear un generador de consultas con el ahorro de solicitudes intermedias en el lado de Clojure. Por ejemplo, si necesita definir un usuario por ID u otra lógica compleja, puede guardar parte de la estructura HoneySQL. Mostrará que necesitamos exactamente al usuario, no los bienes u otros datos. Este “fragmento” se puede sustituir en las consultas necesarias. Como resultado, obtendrá un código más corto.

cons de HoneySQL

  • Puede ser difícil utilizar los beneficios de un DBMS específico, así como escribir consultas complejas (por ejemplo, con funciones de ventana)
  • El programador Clojure necesita separar el código para recuperar datos y el código para procesar estos datos. La separación conduce a un trabajo adicional de refactorización.

danielsz / sistema

Propósito: soporte de arquitectura modular

Código: https://github.com/danielsz/system

Tecnología útil para desarrollar aplicaciones altamente modulares en Clojure. El marco admite una interacción efectiva entre módulos y tiene una buena compatibilidad con otras partes del variado ecosistema de Clojure.

¿Cómo funciona danielsz / system?

La biblioteca permite a un programador web utilizar un enfoque basado en componentes. Por lo tanto, puede crear una aplicación utilizando módulos/componentes y las conexiones entre ellos. Cada componente es un objeto especial. Tiene su propio ciclo de vida. El programador describe cómo se inicia, qué necesita comenzar y cómo se detiene.

Por ejemplo, nuestra aplicación consta de un servidor web y una base de datos. No tiene sentido iniciar el servidor web antes de que se active la base de datos. Describimos el componente de la base de datos, describimos el componente del servidor y la dependencia del servidor en la base de datos. Al iniciar el proyecto, indicamos que necesitamos iniciar el servidor web. La biblioteca intentará activar automáticamente la base de datos. Luego, si es posible, iniciará el servidor y transferirá el componente de base de datos activado terminado al componente de servidor web. Luego, si es necesario, el sistema se detendrá.

Razones para usar danielsz / system

A diferencia de la descripción de toda la aplicación con un conjunto de funciones de Clojure ordinarias, la descripción del proyecto como componentes facilita la sustitución de un componente por otro. Por ejemplo, al probar una aplicación, reemplazar una base de datos con otra, o apagarla por completo, reemplazarla con los datos actuales.

En el caso de funciones, cambiaría las funciones antiguas por otras nuevas. Tendrán el mismo nombre, lo que a menudo causa errores. danielsz / system es un conjunto de soluciones listas para usar (para un servidor web, una base de datos y mucho más), organizadas como un conjunto de componentes.

Espero que ahora entienda mejor cómo usar Clojure y qué soluciones tecnológicas deben implementarse en su proyecto. Mis artículos adicionales incluirán los beneficios de este lenguaje poderoso y hermoso, así como algunos consejos sobre el desarrollo de aplicaciones web, servicios y API. Por lo tanto, suscríbase al blog de FreshCode, si desea obtener más información sobre el mundo de la programación Clojure.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.