Découverte du langage fonctionnel Elixir et du Framework Phoenix

Suite à de nombreux échanges avec un évangéliste Alchimiste, j’ai fini par regarder plus en détail Elixir et par extension Phoenix. Dubitatif au début, je me suis vite rendu compte que les possibilités offertes par ce langage et l’écosystème Erlang sont extraordinaires !

Pourquoi choisir Elixir ?

Elixir est un langage fonctionnel créé en 2011 par le développeur José Valim

Ce dernier est un contributeur reconnu de la communauté Ruby dont il s’est inspiré pour la syntaxe.

Elixir est une surcouche d’Erlang et repose sur la VM Erlang BEAM.

Une plateforme robuste et éprouvée

Erlang a été conçu spécifiquement par Ericsson pour créer des logiciels massivement distribués, avec une haute disponibilité et des fonctionnalités de temps réél

Ericsson gérait il y a 20ans jusqu’à 40% du trafic mondial de téléphonie mobile

Erlang est devenu open source en 1998

En partageant la même Plateforme BEAM et grâce à toutes les librairies Erlang OTP (Open Telecom Platform), Elixir est de ce fait recommandé pour les cas d’usage suivant :

  • logiciels à fort trafic nécessitant des temps de réponse très bas
  • procéder à des mises à jour du code sans interruption des connexions existantes
  • une faible tolérance à la panne : “Let it Crash !”
  • communication en temps réel avec des websockets et channels

Un écosystème très complet

elixir

Elixir est également livré avec un écosystème très complet qui facilite les développements :

Nb : la documentation Hex est automatiquement générée à partir du code (donc toujours à jour)

Phoenix

Phoenix est le framework de référence basé sur Elixir. Il simplifie l’implémentation des applications en temps réel grâce aux “channels”

Une même machine peut supporter jusqu’à 2 millions de connections simultanées !

Une communauté de qualité

La communauté Elixir est très active et très réactive

Bonus : La communauté Erlang embrasse totalement la communaté Elixir ! Pas de guerre <3

Qui utilise Elixir ?

Discord

Référence à Elixir :

Pinterest

Contributions opensource:

Whatsapp

Nb: ce n’est pas codé en Elixir mais en Erlang, qui partage la même VM BEAM et librairies OTP

Prise en main de Phoenix

Installation Erlang / Elixir

Nous utilisons le gestionnaire de paquets ASDF pour installer Erlang et Elixir dans leur dernière version

Grâce à asdf vous pouvez installer plusieurs versions d'Elixir, node, ruby et bien d’autres librairies

“Example de script d’installation d’asdf sur linux "

Ajout des plugins pour Elixir

Note : vous pouvez aussi utiliser la version fournie par votre distribution mais cette dernière risque de ne pas être à jour..

IDE

Si vous utilisez Vscode, je vous recommande les plugins suivants :

code --install-extension mjmcloug.vscode-elixir
code --install-extension JakeBecker.elixir-ls

code --install-extension joshjg.vscode-credo
code --install-extension iampeterbanjo.elixirlinter

Installation des dépendances Mix

Installation du package manager “Hex

mix local.hex

Installation du framework Phoenix

mix archive.install hex phx_new 1.4.3

Phoenix ajoute plusieurs commandes Mix pour faciliter la génération de code par exemple (cf : mix phx.gen.html)

Initialisation de la base de donnée Postgres

Nos utiliserons une image docker Postgres afin de stocker les données de notre API

La configuration d’une base de données est ajoutée par défaut à Phoenix mais ce n’est pas requis

Initialisation du projet Phoenix

Utiliser la commande Phoenix pour générer un nouveau projet

mix phx.new hello-phoenix --app helloPhoenix

L’application sera créée dans le dossier “hello-phoenix” et le nom du module sera “HelloPhoenix”

Vérification de l’installation

Initialisation de la bdd

mix ecto.create

Pour modifier les infos de connexion à la BDD:

//config/dev.exs
# Configure your database
config :helloPhoenix, HelloPhoenix.Repo,
  username: "postgres",
  password: "postgres",
  database: "hellophoenix_dev",
  hostname: "localhost",
  pool_size: 10

Lancer la suite de tests

mix test

Lancement du serveur HTTP Cowboy

mix phx.server

vérification sur http://localhost:4000

Vous devriez voir cette page :

hello-from-phoenix

Pour changer le port du serveur utilisé

//config/dev.exs

http: [port: System.get_env("PORT") || 4000],

Relancer la commande avec le port souhaité

PORT=5000  mix phx.server

Génération d’un CRUD

Maintenant que nous avons une application fonctionnelle, nous souhaitons gérer une liste d’utilisateurs

Utilisons pour cela la commande Mix de génération de CRUD HTML

mix phx.gen.html Accounts User users name:string age:integer

Le générateur a créé plusieurs fichiers dans le dossier “/lib”

  • un schema pour la table du model User: lib/app/accounts/user.ex
  • un controller: lib/app_web/controllers/user_controller.ex
  • un module pour exposer au controller les fonctions CRUD: lib/app/accounts/accounts.ex for the accounts API
  • une vue pour afficher les User: lib/app_web/views/user_view.ex
  • les templates pour les opérations de CRUD: lib/app_web/templates/user

Il faut maintenant connecter ce nouveau controller dans le router ̀ ̀lib/helloPhoenix_web/router.ex` :

  scope "/", HelloPhoenixWeb do
    pipe_through :browser

    get "/", PageController, :index

    resources "/users", UserController
  end

Une migration de la base est nécessaire :

mix ecto.migrate

Vérifions notre nouvelle page /users

Vous devriez voir une page qui liste les utilisateurs créés :

CRUD Users

Bonus : des tests très complets ont également été créés dans “/test/helloPhoenix/accounts”

mix test

Ce que nous avons réussi

Nous avons réussi en quelques lignes à créer un application de gestion d’utilisateurs avec des tests

Phoenix met à disposition tous les outillages nécessaire pour créer des applications de qualité

Pour aller plus loin

Dans cette introduction à Phoenix, nous sommes volontairement restés dans une logique métier très basique afin de démontrer la facilité de prise en main du framework

N’hésitez pas à regarder en détail l'excellente documentation de Phoenix Elle détaille avec des exemples concrets tous les modules inclus dans le framework

Nous verrons dans de futurs articles qu’il est possible de créer facilement des applications en temps réél grâce aux modules Channels et Presence

N’hésitez pas à commenter et faire des suggestions !