Um Vorteile der Verwendung von Apache Thrift 1) bei der Entwicklung von Schnittstellen für Microservices darzulegen, soll in Java- und in C# eine exemplarische Server-Client Architektur entwickelt werden. Eine Java-Anwendung stellt hierbei den Microservice für die Verarbeitung im Backend dar, während eine Web-Anwendung die Interaktion mit dem Nutzer über ein Webfrontend realisiert. Für den Austausch von Nachrichten mit dem Microservice wird das Kommunikationsprotokoll und zur Erstellung einer Schnittstelle der Code-Generator von Apache Thrift verwendet.
Apache Thrift stellt eine Alternative zu REST-Services dar und überzeugt wie REST durch ein leichtgewichtiges Design bei der Erzeugung, Verarbeitung und Übertragung von Nachrichten, in der Verfügbarkeit als Open Source und in der Unterstützung für relativ viele Plattformen und Programmiersprachen.
Um möglichst wiederverwendbaren und portierbaren Code zu erstellen sollten Programmierer bei der Entwicklung von Microservices möglichst formal deklarierbare und sprachübergreifend implementierbare Schnittstellen nutzen. Unter Verwendung von Apache Thrift kann hierzu die für einen Microservice notwendige Schnittstelle in der Beschreibungssprache IDL (Interface Definition Language) deklariert und mit dem Apache Thrift Compiler in Code einer vom Entwickler verwendeten Programmiersprache übersetzt werden (Language Binding).
ASP.Net Core 2) ist ein plattformübergreifendes Open Source Framework, dass für die Entwicklung moderner Weboberflächen und Webschnittstellen verwendet werden kann. Wie auch ASP.Net MVC nutzt ASP.Net Core das MVC Prinzip und für die Darstellung Ansichtsvorlagen, die HTML-Antworten für den Clienten mit Hilfe von C# erstellen können. Gegenüber ASP.NET ist ASP.Net Core zudem leichtgewichtiger und besser zu konfigurieren.
Für die Kommunikation zwischen der Java-Anwendung, bzw. dem Microservice und der C#-Anwendung wird eine Schnittstelle in IDL beschrieben, welche Kommandos im String-Format senden und empfangen können soll.
namespace csharp WebApplication namespace java Microservice service MessageService { string message(1: string command, 2: string value); }
Der IDL-Code muss im Beispiel in eine Datei service.thrift eingefügt und dem Apache Thrift Compiler nebst der für die Entwicklung von Server und Client verwendeten Sprachen als Parameter übergeben werden, wonach die Dateien messageservice.java und messageservice.cs in den angegebenen Sprachen erstellt werden sollten.
# java thrift-0.11.0.exe --gen java service.thrift # charp thrift-0.11.0.exe --gen csharp service.thrift
Die vollständige Java-Anwendung, bzw. der Microservice besteht aus dem erstellten Java-Code für die Schnittstelle, einer Klasse für den Server und einer weiteren für den Service Handler. Für Erstellung und Testen der Anwendung kann Apache Thrift in der Version 0.11.0, die IDE IntelliJ und das Build-Tool Maven verwendet werden.
Die Klasse Server der Java-Anwendung verwendet das Kommunikationsprotokoll von Apache Thrift und wartet über einen nebenläufigen Prozess auf eingehende Verbindungen.
package Microservice; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TServer.Args; import org.apache.thrift.server.TSimpleServer; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TServerTransport; public class Server { public static ServiceHandler handler; public static MessageService.Processor processor; public static MessageService.Client client; public static void main(String[] args) { try { handler = new ServiceHandler(); processor = new MessageService.Processor(handler); Runnable socket = new Runnable() { public void run() { socketConnection(processor); } }; new Thread(socket).start(); } catch (Exception e) { System.out.println("Connection could not be established!"); } } public static void socketConnection(MessageService.Processor processor) { try { TServerTransport serverTransport = new TServerSocket(16118); TServer server = new TSimpleServer( new Args(serverTransport).processor(processor)); System.out.println("Server is listening on port 16118 ..."); server.serve(); } catch (Exception e) { System.out.println(); } } }
Die Klasse ServerHandler soll Nachrichten empfangen und verarbeiten sowie Antworten zurück senden können. Für eine beispielhafte Interaktion werden für festgelegte Kommandos Antworten definiert, die bei einer Anfrage des Clienten zurück gegeben werden sollen.
package Microservice; import org.apache.thrift.TException; public class ServiceHandler implements MessageService.Iface { public enum Commands {WetherReport, BankBalance, RandomNumber} public String message(String command, String value) throws TException { String result = ""; switch (Commands.valueOf(command)) { case WetherReport: result = "rainy, 12°"; break; case BankBalance: result = "-456.11€"; break; case RandomNumber: result = String.valueOf((int)(Math.random() * Integer.MAX_VALUE)); break; default: result = "unkown command!"; break; } return result; } }
Für das WebFrontend wird eine ASP.Net Core Web-Anwendung in Visual Studio erstellt und über den NuGet-Paket-Manager dem Projekt Apache Thrift in der Version 0.10.0 hinzugefügt. Als zusätzlichen Controller wird der erstellte C#-Code für die Schnittstelle und ein weiteres Modell für die zu versendenden Nachrichten verwendet. In der Datei program.cs wird eine Referenz auf die Schnittstelle erstellt, auf die der HomeController dann zugreifen kann.
Das Modell messagemodel.cs beinhält Kommandos, die im Microservice zu vordefinierten Verarbeitungen führen sollen. Im Weiteren beinhält der HomeController homecontroller.cs zwei Action-Methoden, die das Model-Binding und die Kommunikation über die referenzierte Schnittstelle realisieren sollen. Mit Hilfe der Ansicht index.cshtml wird das eigentliche WebFrontend realisiert. Es besteht aus einer HTML-Tabelle und Tag-Helpern, welche für eine Interaktion zwischen Ansichten und Controllern verwendet werden können.