Découverte du langage fonctionnel Elixir et du Framework Phoenix
Publié le
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
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 est également livré avec un écosystème très complet qui facilite les développements :
- Mix : l’outil de build qui permet de créer, compiler, tester et gérer les dépendances
- ExUnit : framework de test
- IEx : Interactive shell ou Read Evaluate Print Loop
- Hex est le gestionnaire de paquets pour Elixir et Erlang
Nb : la documentation Hex est automatiquement générée à partir du code (donc toujours à jour)
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 ?
Référence à Elixir :
- Comment Discord traite des millions de requêtes par minute grâce à Elixir
- Comment dimensionner Elixir
Contributions opensource:
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 :
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 :
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 !
#elixir