d12g

Blog von Daniel Grewing

Microservices (Teil 2)

17. Mai 2015 Softwareentwicklung

In meinem letzten Beitrag habe ich eine Einführung in den Architekturstil der Microservices gegeben. Am Beispiel der Webanwendung “Zetteln” habe ich gezeigt, wie man eine Webanwendung in verschiedene Komponenten aufteilen kann und welche Vorteile sich dadurch ergeben. In diesem Beitrag möchte ich meine Idee der Kommunikation der Komponenten untereinander anhand von Codebeispielen vorstellen.

Die Anmeldemaske von Zetteln wird mit einer einfachen HTML-Seite umgesetzt.

<form class="form-signin" id= "loginform">
  <h2 class= "form-signin-heading">Anmelden </h2>
  <div class= "alert alert-danger" role ="alert" style=" display: none;" id="alert_login_error" >
    Logindaten nicht korrekt
  </ div>
  <label for= "inputEmail" class ="sr-only"> E-Mail</ label>
  <input type= "email" id ="inputEmail" class= "form-control" placeholder="Email address" required autofocus>
  <label for= "inputPassword" class ="sr-only"> Passwort</label >
  <input type= "password" id ="inputPassword" class= "form-control" placeholder="Password" required>
  <button class= "btn btn-lg btn-primary btn-block" type="button" id="loginsubmit" >Login </button>
</form >

Die Überprüfung der Anmeldedaten wird von einer jQuery-Funktion ausgelöst. Da die jQuery-Funktion einen Ajax-Request auf eine andere Webanwendung durchführt, muss über ein Callback mit JSONP gearbeitet werden, damit keine Cross-Seite Exception von JavaScript ausgelöst wird.

$("#loginsubmit").click( function(){
  $.ajax({
    type: 'GET',
    url: 'http://localhost:8090/login',
    data: "email="+$("#inputEmail" ).val()+"&password=" +$("#inputPassword" ).val(),
    dataType: 'jsonp',
    success: function(responseData, textStatus, jqXHR){
      var uuid = responseData.uuid;
      if (uuid != '' ){
        location.href= "http://localhost:8088/zetteln/index/login?uuid=" +uuid;
      }
      else{
        $( "#alert_login_error").show();
      }
    },
    error: function (responseData, textStatus, errorThrown){
      $( "#alert_login_error").show();
    }
  });
});

Über den Callback wird der Benutzer verifiziert. Die Daten werden von der Spring Boot Komponente überprüft und an den jQuery Aufruf zurückgegeben:

@RestController
@RequestMapping("/login" )
public class LoginController {
  @RequestMapping(method=RequestMethod.GET)
  public @ResponseBody String login(@RequestParam (value="email" ) String email, @RequestParam(value="password" ) String password, @RequestParam(value= "callback") String callback) {
    String returnValue = callback + "(" +checkUser(email, password)+")";
    return returnValue ;
  }

  private String checkUser(String email , String password){
    String uuid = "";
    if (email .equals("daniel.grewing@googlemail.com" ) && password.equals("zetteln" )){
      uuid = "89dda95851504c6eb9ae99b9270e438b" ;
    }
  return "{\"uuid\":\"" +uuid +"\"}" ;
  }
}

In der Methode checkUser erfolgt die eigentliche Abfrage der Benutzerdaten. Sie ist hier nur beispielhaft umgesetzt und würde sonst über eine Datenbankabfrage laufen.

Wenn die Login Komponente die Daten verifiziert hat erfolgt die Weiterleitung zur eigentlichen Zetteln-Anwendung mittels location.href. Die Benutzerdaten können dann nochmal verifiziert werden.

Diese Codebeispiele zeigen die Kommunikation der drei Komponenten meiner kleinen Anwendung in einer Microservice-Architektur nur anssatzweise. Über das Thema Sichheit müsste ich mir nochmal einigen Gedanken machen und diese umsetzen.

Formularvalidierung mit Grails und Bootstrap

15. Februar 2015 Softwareentwicklung

Bei der Formularentwicklung muss auch immer die Validierung von Benutzereingaben berücksichtigt werden. Für einfache Überprüfungen kann man gut die Möglichkeiten von HTML5 nutzen. So können einfach die Eingaben von einzelnen Eingabefeldern kontrolliert werden. Wenn es etwas komplizierter wird, weil zwei Eingabefelder voneinander abhängen, kann man sich mit JavaScript helfen.
In einigen Fällen ist es aber nötig, die Eingaben mit der Datenbank abzugleichen. Bei einer Registrierung zum Beispiel muss auf existierende Benutzernamen oder E-Mails geprüft werden.
Weiterlesen →

Internet der Dinge – Mein Weihnachtsprojekt

7. Februar 2015 Softwareentwicklung

Das Internet der Dinge („Internet of Things oder kurz IoT) mutierte in letzter Zeit immer mehr zum Schlagwort bei den aktuellen IT-Trends. Die Definition ist nicht ganz eindeutig und es existieren viele verschiedene Anwendungsbereiche. Kühlschränke können das Essen selbständig nachbestellen, der Toaster druckt das Wetter auf den Toast, die Heizung reguliert sich selbstständig oder die Uhr wird zur Verlängerung des Smartphones. Im Grunde sollen alle „Dinge“ über das Internet kommunizieren.

Kleinstcomputer, Elektronikbauteile und Sensoren
Die Entwicklung bei Kleinstcomputern (Raspberry Pi, Banana Pi) und einfachen modularen Elektronikbauteilen und Sensoren (Arduino, Tinkerforge) machen es einfach, auch selbst mit dem IoT zu experimentieren. Also habe ich zu Weihnachten mein erstes IoT-Projekt umgesetzt.
Zur Tradition von Weihnachten gehört es, die Wohnung zu dekorieren und das Lichtkonzept zu erweitern. Ein häufig anzutreffender Umbau ist, die Fenster mit Lichterketten zu versehen. Dadurch wird die Wohnung festlicher beleuchtet und der Welt wird demonstriert, „jo, hier wird Weihnachten gefeiert“.
Um nicht alle Lichterketten, wenn die Dunkelheit hereinbricht, händisch an, und vor dem Zubettgehen, wieder aus zu machen, verwendet man zur Steuerung Zeitschaltuhren. Das sind Aufsätze für Steckdosen und über kleine mechanische Stäbchen kontrolliert man die Steuerung der Stromzufuhr zeitabhängig. Um diese anachronistischen und mechanischen Brocken zu ersetzen, davon handelt mein Beitrag.
Weiterlesen →