Ich nehme derzeit an einer Akademie zum Java Fullstack Software Engineer teil. In den kommenden Wochen möchte ich hier meine Mitschrift, so gut es geht, aufzeichnen und mitteilen. Hier ist das, was ich vom zweiten Tag in Block 11 (wir springen etwas hin und her) gelernt und behalten habe:
Wir sind dabei ein Microservice Netzwerk zu bauen. In den letzten Tagen haben wir folgende Komponenten als Microservices via Docker gebaut:
- Java Spring Boot Book Services
- NGINX-Webserver
- Book-DB via MariaDB
- Customer Services (SpringBoot)
- Customer DB (MongoDB)
- Loadbalancer (Ribbon)
- Security Procy (Zuul)
Jetzt bauen wir den
DNS-Server "Eureka"
Der Server
Am DNS-Server registrieren sich die Microservices, die innerhalb eines lokalen Netzwerks miteinander verbunden werden wollen:
Wir öffnen in IntelliJ Ueb-Eureka-server. So wurde das Projekt initiiert:
In der Pom.xml muss folgendes stehen:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
application.properties:
eureka.client.registerWithEureka = false eureka.client.fetchRegistry = false server.port = 8761
Das bedeutet, dass nicht der Server registriert, sondern die Clients sich registrieren müssen.
Die Applikation selber ist sehr spartanisch. Sie startet den Spring-Cloud-Server "@EnableEurekaServer":
Wir starten es und greifen zu auf: http://localhost:8761/
Nutzung:
- http://localhost:8761/ // GUI
- http://localhost:8761/actuator // Monitoring
- http://localhost:8761/eureka/ // Registrierung der Clients (interne Zwecke)
Der Client
Jetzt starten wir den ueb-Eureka-Client in IntelliJ
pom.xml:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
application.yml (YAML gilt vor Properties -> YAML sticht Properties):
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka instance: preferIpAddress: true spring: application: name: eurekaclient
application.properties:
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/ eureka.client.instance.preferIpAddress = true spring.application.name = eurekaclient server.port=8080
Damit meldet sich der Client an dem "Zonenverwalter" (also Eureka) an.
prefereIpAddress = true bedeutet, dass die eigene IP-Adresse verwendet werden soll.
Auch hier ist die Applikation recht mager. Es reicht aus den @EnableEurekaClient hinzuzufügen:
Wir starten den Client und schauen dann wieder auf den Eurekaserver:
Beispiel, wie wir einen weiteren Client einbinden könnten:
Übung Zuul/Dockercontainer
Aufgabenbeschreibung
- Spring Appl. Zuul-Servers(Port: 8080) als Proxy Lokal für den KehrwertService(Port: 8081) und den KreisService(Port: 8082) (alternatieve BookService(Port: 8081) / CustomerService(Port: 8081)
- Spring Appl. Zuul-Servers als Docker-Container betreiben (Externer Port:8080)
- Spring Appl. Ribbon-Servers als Loadbalancer Lokal für 2-3 KreisService-Instanzen entwickeln (**
optional - Spring Appl. Ribbon-Servers als Docker-Container betreiben (Externer Port:80xx)
- Ribbon-Servers im Zuul-Server registiert -> Umrouten des Loadbalancer (**
- Actuator mit Impl (**
- Eureka (***
Aufgabe 1:
Wir haben den Kreisservice und den Kehrwertservice jeweils in einem Dockercontainer gestartet:
# Folgendes war nicht nötig, da wir es schon in den letzten Tagen getan haben: # docker run -d -p8081:8080 --name KWS kws-v01.img # docker run -d -p8082:8080 --name kreisrechner-service krs.v02.imgdocker start kerwerservice
curl -v -X GET http://10.91.17.75:8081/kehrwertservice/kehrwert?zahl=4docker start krs
curl -v -X -GET http://10.91.17.75:8082
Curl -v -X -GET http://10.91.17.75:8082/kreisrechner
Unser Sprinboot Zuul-Service läuft jetzt auch bei uns in IntelliJ. Auch die Portweiterreichung funktioniert.
Damit läuft Punkt 1:
Aufgabe 2:
Als nächstes bauen wir ein *jar file aus dem Java Code und kopieren es zu unserem Linux Server. Außerdem erstellen wir folgendes Dockerfile:
[linux@essen2-0005 ueb-zuul]$ cat Dockerfile FROM openjdk:11WORKDIR /
ADD ueb-zuul-0.0.1-SNAPSHOT.jar app.jarEXPOSE 8080
CMD java -jar app.jar
Nach ein paar Problemen mit den URLs haben wir es hinbekommen:
docker build --tag zuul.img:V0.3 . docker run -d -p8080:8080 --name zuul zuul.img:V0.3
Amadeus: zuul.routes.zuul_kreis.url=http://10.91.17.164:8082/kreisrechner/ zuul.routes.zuul_kehrwert.url=http://10.91.17.164:8081/kehrwertservice/http://10.91.17.164:8080/zuul_kreis/umfang/10
http://10.91.17.164:8080/zuul_kehrwert/kehrwert?zahl=10---- Achim klappt nicht: ----------------
zuul.routes.kreis.url=http://10.91.17.75:8082/kreisrechner/ # http://localhost:8080/kreis/kreisrechner/umfang/10
zuul.routes.kws.url=http://10.91.17.75:8081/kehrwertservice/ # http://localhost:8080/kws/kehrwert?zahl=4http://10.91.17.75:8080/kreis/umfang/10 -> Bad Request
------- Achim neu (klappt jetzt) ---------
zuul.routes.zuul_kreis.url=http://10.91.17.75:8082/kreisrechner/
zuul.routes.zuul_kehrwert.url=http://10.91.17.75:8081/kehrwertservice/http://10.91.17.75:8080/zuul_kreis/umfang/10 -> funktioniert
http://10.91.17.75:8080/zuul_kehrwert/kehrwert?zahl=10 -> funktioniert
Lösung zu Aufgabe 3:
————————————————-
Disclaimer
Alles was ich mitschrieb und verstanden habe ist ohne Gewähr. Die Bilder stammen teilweise aus dem Internet und wir haben keine Urheberansprüche darauf.
Besten Dank an unseren sehr empfehlenswerten
Trainer: Hans-Joachim Blanke blanke@4point.de
In den nächsten Tagen geht es weiter, so: stay tuned!
Achim Mertens