Microservices und Spring Boot

Was ist Spring Boot?
Spring Boot ist eines der jüngsten Projekte aus der Spring-Familie. Es wird einem Entwickler die Möglichkeit gegeben, schnell und einfach ein sichtbares Ergebnis bereitzustellen. Durch den „Convention over Configuration“-Ansatz wird vieles vorkonfiguriert. Es ist möglich fertige Projekte einfach zu „starten“. Standardmäßig wird ein ausführbares jar-Artefakt erzeugt. Dieses Artefakt enthält einen Embedded-Tomcat (oder bei Bedarf auch Jetty) mit dem das Projekt gestartet werden kann.

Durch das Dependency-Management einer zentralen Parent-POM, ist dem Entwickler die Pflicht genommen worden, sich mit den vielen Versionen von Spring und der mitgelieferten Plugins auseinander zu setzen.
Hauptbestandteil einer Spring Boot Applikation ist die Starter-Klasse. Diese wird mit @EnableAutoConfiguration annotiert. Diese Annotation gibt den Hinweis, dass der Classpath auf vorhandene Spring Boot Artefakte gescannt wird. Das heißt, wenn z.B. „spring-boot-starter-web“ als Abhängigkeit verwendet wird, so wird Spring MVC mit einem Embedded Tomcat konfiguriert. Sobald die main-Methode der Starter-Klasse ausgeführt wird, baut Spring den Kontext auf, beginnend mit dieser Klasse.

Übrigens: Bekanntester Anwender ist Netflix. Netflix nutzt intensiv Spring Boot für jede neue Entwicklung von Microservices.

Was brauchen wir?
Als Beispiel nehmen wir einen einfachen Url-Shortener-Service. Hierzu nehme ich als Datenhaltung eine simple Key-Value-Datenbank (einfachheitshalber habe ich hier redis gewählt). Eine kurze Anleitung, was Redis ist und wie main es installiert, gibt es hier.

Über die Seite http://start.spring.io lässt sich ein vorkonfiguriertes Projekt mit den gewünschten Abhängigkeiten erzeugen. Für das folgende Beispiel wählen wir folgende Dependencies:

  • redis
  • web

Sofern über „Type“ Maven Project definiert ist, wird eine Zip-Datei zum Download angeboten, welches schon eine entsprechende Ordnerstrukur besitzt, so wie man es aus Maven Projekten gewohnt ist. Andernfalls wird lediglich die Projekt Datei mit den ausgewählten Abhängigkeiten heruntergeladen. Die heruntergeladene Projekt kann nun entpackt werden und in die Entwicklungsumgebung importiert werden.

Und schon kann auch der erste Controller erstellt werden:

@RestController(value = "/url")
public class UrlShortenerController {

	@Autowired
	private StringRedisTemplate stringRedisTemplate;

	@RequestMapping
	public void findValue(final @RequestParam String key, HttpServletResponse response) throws IOException {
		if (stringRedisTemplate.hasKey(key)) {
			final String value = stringRedisTemplate.opsForValue().get(key);
			response.sendRedirect(value);
            return;
		}

		throw new NotFoundException(String.format("the key (%s) you are looking for does not exist", key));
	}

	@RequestMapping(method = RequestMethod.POST)
	public HttpEntity<String> putValue(@RequestBody String url) {
		Assert.hasText(url);
        final String[] schemes = {"http", "https"};
        final UrlValidator validator = new UrlValidator(schemes);
        // urlvalidator stammt aus commons validator

		if (!validator.isValid(url)) {
			throw new IllegalArgumentException(String.format("The given URL was invalid (%s", url));
		}
        // Hashing-Klasse stammt aus Google Guava
		String key = Hashing.md5().hashString(url, Charset.forName("UTF-8")).toString();
		stringRedisTemplate.opsForValue().append(key, url);
		return new ResponseEntity<>(key, HttpStatus.CREATED);
	}
}

Das war auch schon alles. Der erste Microservice ist erstellt. Sofern redis lokal läuft, kann die Anwendung über „mvn spring-boot:run“ gestartet werden. Nun können auch die ersten URLs an den Service gesendet werden. Dazu verwenden wir curl:

curl -X POST -H "Content-Type: application/json;charset=UTF-8" http://localhost:8080/url -d "http://blog.flavia-it.de/"

Anschließend kommt ein Hash als Response. Das bedeutet das unsere URL soeben akzeptiert und in der redis gespeichert wurde.
Bei einem anschließendem Aufruf über curl müsste nun auch eine Weiterleitung erfolgen:

curl http://localhost:8080/url\?key\=af8e5810cc30719655f72fe7367ac474 -i
HTTP/1.1 302 Found
Server: Apache-Coyote/1.1
Location: http://blog.flavia-it.de/
Content-Length: 0
Date: Mon, 20 Oct 2014 21:35:27 GMT

Was nun am Ende einigen aufgefallen sein mag ist, dass in dem Beispiel keine Konfiguration verwendet wurde. Es wird hier viel von dem Standard-Fall ausgegangen (z.B. der Port für die Redis Datenbank).

Den Code des Demo Microservice ist auf Github zu finden.

Teilen Sie diesen Beitrag

Das könnte dich auch interessieren …

Schreibe einen Kommentar

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