Fügen Sie unserer Anwendung eine sehr schnelle JSON-API hinzu.

Alle unsere Microservices, unabhängig davon, wie sie miteinander kommunizieren, bieten eine Art Heartbeat- Schnittstelle, sodass das Überwachungssystem jederzeit feststellen kann, wie es ist. B. der allgemeine Gesundheitszustand und einige Besonderheiten, Prüfsummen für die internen Daten, mit denen sie zu tun haben. Es geht nicht um den Haupttransport: Hier geht es RabbitMQ und Redis ganz gut.


Und manchmal ist es sinnvoll, die einfachste ( HTTP- ) Schnittstelle für den Export relevanter Daten bereitzustellen. Wenn ich auch in diese Richtung denke, möchte ich auf lange Sicht Redis komplett loswerden, um eine interne Lösung für die Speicherung von Schlüssel-Wert-Paaren zu erhalten, wie wir es vor genau zwei Jahren mit PubSub erfolgreich PubSub .


Anstatt die Motorräder mit jedem neuen Mikrodienst neu zu erfinden, habe ich mich daher für eine Plug-in-Bibliothek entschieden, die dieses unkomplizierte Problem der Bereitstellung beliebiger Daten aus jeder Anwendung mit config.exs (mit Ausnahme von drei Zeilen in config.exs ) config.exs . Sei es ein einfacher Herzschlag ( HTTP 200 OK ) oder eine lange Liste aktueller Wechselkurse.


Die Lösung basiert auf diesem Tweet von Dave Thomas .


JSON-API-Server in Stiftgewicht


Camarero ist eine sofort einsatzbereite Lösung zum Hinzufügen einiger JSON-API-Funktionen zu einer vorhandenen Anwendung oder sogar zum Implementieren einer nicht so verwirrenden JSON-API von Grund auf, wenn komplexere (sprich: schwere) Lösungen unerwünscht sind. Das folgende Bild zeigt, wie wir es in einem typischen Fall anschließen und verwenden können.


Camarero Krawatten


Die Bibliothek sollte keineswegs ein Ersatz für vollwertige Lösungen wie das Phoenix sein. Auf keinen Fall, nein. Dies ist ein solches Drop-In , wenn der Mikrodienst nur ein paar HTTP-API-APIs verfügbar machen muss. In einigen Fällen kann Camarero ein guter Kandidat sein, um Redis oder einen anderen Speicher von Schlüsselwerten (auch in seiner Gewichtsgruppe) zu ersetzen. Der Hauptunterschied zu dieser Art von Weblösung besteht darin, dass diese Bibliothek sehr schnell ist.


Hier sind die HTTP- Antwortzeiten für die Rückgabe eines Schlüsselwerts aus einer Hash-Tabelle mit einer Million Schlüssel.


1M Schlüsselwertspeicher-Lookup: 10 μs ±


Ja, es gibt keinen Haken. Die HTTP-Antwortzeit für eine Anfrage über kv-storage mit einer Million Werten beträgt im ungünstigsten Fall einige zehn Mikrosekunden .


Implementierungsdetails


Es wird davon ausgegangen, dass Camarero eine Verbindung zu einer laufenden Anwendung herstellt, indem die Bibliothek und drei Zeilen in der Konfigurationsdatei eingeschaltet werden. Es verarbeitet die konfigurierten Routen und delegiert die Ausführung an die festgelegten Handler-Module. Die einfachste Konfiguration könnte so aussehen:


 config :camarero, carta: [Camarero.Carta.Heartbeat], root: "api/v1" 

Das ist alles und daher ist es wahrscheinlich klar: /api/v1 ist das Stammverzeichnis des Webservers, eine heartbeat Route (konfiguriert aus dem Inneren des Moduls, standardmäßig der Name ohne Präfix) - mit dem Camarero.Carta.Heartbeat Handler. Handler können auch dynamisch zur Laufzeit hinzugefügt werden, indem Sie Camarero.Catering.route! .


Handler


Ein Handler ist ein Modul, das Camarero.Plato Verhalten von Camarero.Plato implementiert. Es besteht aus Standard-Manipulationsmethoden für das CRUD- Repository. Zur Verwendung als Handler für eingehende HTTP-Anforderungen ist jedes Modul geeignet, das dieses Verhalten implementiert.


Es gibt eine noch feinere Optimierung: Verhalten Camarero.Tapas , das die CRUD in jedem Camarero.Plato Container für ein Schlüssel / Wert-Paar verwaltet. Normalerweise müssen Sie nicht so tief graben, wenn Sie die Bibliothek verwenden.


Die Standardimplementierung verwendet %{} map als Container und sieht ziemlich kompakt aus:


 defmodule Camarero.Carta.Heartbeat do use Camarero.Plato end 

Dies ist ein reines, unlackiertes Heartbeat Modul, das standardmäßig in der Bibliothek enthalten ist. Weniger unbedeutende Verwendungen sind in der Dokumentation beschrieben .


Feinabstimmung


Alle Methoden aus beiden Standardimplementierungen ( Camarero.Tapas und Camarero.Plato ) lassen sich Camarero.Plato neu definieren. Um beispielsweise eine benutzerdefinierte Route für ein Modul sowie einen benutzerdefinierten Container zu verwenden, können Sie folgende Aktionen ausführen:


 defmodule Camarero.Carta.Heartbeat do use Camarero.Plato, container: %MyStructWithAccessBehaviour{} @impl true def plato_route(), do: "internal/heartbeat" end 

Webserver-Konfiguration


Camarero benötigt einen Cowboy2- Server und CowboyPlug, um zu funktionieren . Hier ist ein typisches Cowboy2- Setup in config.exs :


 config :camarero, cowboy: [port: 4043, scheme: :https, options: []] 

Was Camarero nicht behauptet


Diese Bibliothek erhebt in keiner Weise den Anspruch, mit komplexen Lösungen zu konkurrieren. Es ist nicht enthalten , und mit ziemlicher Sicherheit wird es weder eine Autorisierung noch eine Authentifizierung geben. Das heißt, wir verwenden es nur für Dienste innerhalb einer privaten Cloud.


Alle Verarbeitungsmodule werden generiert. Mit Ausnahme der Schnittstellenüberlastung ist daher keine zusätzliche Optimierung möglich. Dies wird auch bewusst gemacht.


Aber es ist schneller als alle Analoga in allen Benchmarks .


Quelle


Hab eine gute schnelle Antwort!

Source: https://habr.com/ru/post/de485120/


All Articles