Elixir, Phoenix und CouchDB – Eine Einführung

Keine Kommentare

Das Elixir MVC Framework Phoenix

Von Markus Krogemann und Marcel Wolf

Worum geht es?

Zunächst wird gezeigt, wie sich eine Webanwendung mit Phoenix in einfachen Schritten erstellen lässt, ohne dass ein tieferes Verständnis für eine funktionale Programmiersprache notwendig ist. Anhand einer Demoanwendung wird anschließend deutlich, wie Phoenix aufgebaut ist und welche Vorteile das Ökosystem um Elixir bietet. In weiteren Blogposts wird ein tieferer Einblick in das Framework und seine Komponenten gegeben, wie z.B Plug und Ecto. Besonders wird dabei auf die Anbindung der Dokumentendatenbank CouchDB eingegangen.

Phoenix, Elixir, CouchDB

Einleitung
Elixir ist eine funktionale Programmiersprache, die auf der Erlang BEAM (Bogdan/Björn’s Erlang Abstract Machine) aufsetzt. Zusammen mit Stilmitteln aus anderen Programmiersprachen (z.B Ruby) bietet sie einen einfachen Einstieg für Entwickler in die Erlangwelt.

Erlang ist eine funktionale Programmiersprache, die für die Programmierung von Anwendungen in der Telekommunikation konzipiert wurde und insbesondere in verteilten und nebenläufigen Systemen große Vorteile in Bezug auf Stabilität und Wartbarkeit bringt. Das Ökosystem um die funktionale Programmiersprache Elixir ist noch recht klein, wird aber von einer wachsenden Community von Enthusiasten belebt.

Phoenix
In dieser Community entstand auch Phoenix, ein in Elixir entwickeltes Webframework, um HTML5-Anwendungen, API-Backends und verteilte Systeme zu bauen.

CouchDB
Bei der Betrachtung von Phoenix fällt auf, dass es mit Ausnahme von MongoDB nur Adaptoren für relationale Datenbanken gibt. Um in dem Ökosystem von Erlang zu bleiben und die Vorteile einer dokumentbasierten Datenbank zu nutzen, bietet sich die Integration mit CouchDB an. CouchDB ist eine dokumentenbasierte und in Erlang programmierte NoSQL-Datenbank mit JSON-HTTP-Interface.

Die Herausforderung, dass es noch keinen passenden Datenbank-Connector gibt, hat uns zu dem Entschluss geführt, einen eigenen CouchDB-Connector in Elixir zu schreiben.
Bislang sind die Grundfunktionen create, update und read, sowie einige view-Basisoperationen implementiert. Das Open-Source-Projekt ist auf Github zu finden.

Start eines Projeks
Um ein neues Phoenixprojekt zu starten benutzen wir das Kommando mix phoenix.new, als Parameter wird der Name foo übergeben. Das Projekt wird ohne das Persistenzframework ecto gestartet (es wird nicht benötigt), daher muss der Parameter –no-ecto angegeben werden.

mix phoenix.new foo --no-ecto

start_phoenix_project_1

Das Framework fragt nach ob die benötigten Abhängigkeiten installiert werden sollen oder nicht.

cd foo

start_phoenix_project_2

Es besteht die Möglichkeit die Applikation in der interaktiven Shell oder als normalen Server zu starten. In diesem Beispiel wird die interaktive Version verwendet.

iex -S mix phoenix.server

phoenix_server_runnning_1

Die leere Applikation wird gestartet und kann über den Browser erreicht werden http://localhost:4000

 

phoenix_server_running_2

Live Reloading
Phoenix stellt eine sehr hilfreiche Live-Reload-Funktion bereit, mit der Änderungen an dem Projekt sofort kompiliert (wenn nötig) und geladen werden.

HTML-Seiten werden z.B. sofort geladen, ausprobiert werden kann es in folgender Datei:

web/templates/page/index.html.eex

phoenix_welcome_to

phoenix_hello_world

Wir ändern den h2 Text von „Welcome to Phoenix!“ zu „Hello World!“.

 

phoenix_live_reload

In der interaktiven Session wird das live-reloading als Log-Eintrag sichtbar.

server_running_hello_world

Ohne manuelles Neuladen der Seite wird die Änderung sofort im Browser sichtbar.

Projektstruktur

├── config

Im config-Ordner des Projekts wird die Konfiguration abgelegt, einige Dependencies (wie z.B. credo) suchen auch in diesem Ordner nach ihrer Konfiguration. Zudem lassen sich umgebungsspezifische Konfigurationen ablegen, wie z.B. dev.exs, test.exs.


├── lib
│   └── foo

Teile der Konfiguration finden sich außerdem im lib-Ordner, diese werden einmalig kompiliert und in die BEAM geladen, wärend die im config-Ordner abgelegten Skripte bei jeder Änderung neu kompiliert werden. Sich selten ändernde Konfigurationen sollten daher aus Performancegründen im lib-Ordner gespeichert werden.

├── priv

Der Ordner priv ist eine OTP-Anforderung (Open Telecom Platform) aus der frühen Erlangzeit, er wird heute
für statisch generierten Webcontent und für das Seeding benutzt.
└── web

Das Phoenix-Framework implementiert das bekannte Model-View-Controller-Architekturmuster (MVC). Im web-Unterverzeichnis liegen MVC-Artefakte wie controller, models und views. Anders als bei anderen MVC-Frameworks, wie zum Beipiel Ruby on Rails, unterscheidet Phoenix zwischen templates und views. Die Templates werden aus Performancegründen vorkompiliert. Außerdem wird im Webverzeichnis statischer Inhalt (JavaScript, CSS) abgelegt. Die Datei router.ex enthält Routing-Informationen, hier werden Requestpfade auf Controllermethoden abgebildet.

“Bird watch”
Ein leeres Projekt zeigt schon einmal die grundlegende Funktionalität von Phoenix. (s. Bilder) Darüber hinaus werden anhand einer konkreten Real-World-Demoapplikation weitere Eigenschaften gezeigt. Unter dem Github Link steht aus diesem Grund die Anwendung bird_watch bereit, die einige Basisfunktionen von Phoenix nutzt.

Projekt auschecken:

git clone https://github.com/mkrogemann/bird_watch

cd bird_watch
mix deps.get

Mit mix deps.get werden die Dependencies installiert. Mix ist ein build tool, mit dem es u.a. möglich ist, Elixirprojekte zu erstellen, zu kompilieren, zu testen und Dependencies zu installieren.

Als nächstes wird das Datenbankseeding ausgeführt:

mix run priv/repo/seeds.exs

Nun können wir die  Applikation starten und im Browser öffnen:

mix phoenix.server

http://localhost:4000

phoenix_bird_watch_running

Fazit/Résumé

Wir haben in wenigen Schritten eine funktionale Webanwendung erstellt und gezeigt, wie man mit wenig Aufwand Änderungen hinzufügt, die dank des live-reloadings sofort zur Verfügung standen, dies erhöht die Produktivität beim täglichen Arbeiten mit Phoenix. Ein weiterer Vorteil liegt in der Performanz des Systems, von der man sich auch in Benchmarks überzeugen kann. In weiteren Blogposts werden wir die hier vorgestellte Applikation „Bird watch“ weiterentwickeln und dabei die Funktionalitäten und Vorzüge von Phoenix und Elixir detaillierter betrachten.

Marcel Wolf

Marcel arbeitete in wechselnden Rollen innerhalb der IT. Aktuell ist er als Senior System Consultant bei der codecentric AG tätig. Seine Schwerpunktthemen sind Continuous Delivery, Datacenter Automation, agile Softwareentwicklung, Elixir und DevOps.
Des Weiteren ist Marcel Wolf als Autor und Speaker tätig, er organisiert regelmäßig Konferenzen und Meetups und beteiligt sich an Open-Source-Projekten.

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Artikel von Marcel Wolf

Weitere Inhalte zu Elixir

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.