Java Training Block 11 – Springcloud – Tag 2

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:

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

  1. 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)
  2. Spring Appl. Zuul-Servers als Docker-Container betreiben (Externer Port:8080)
  3. Spring Appl. Ribbon-Servers als Loadbalancer Lokal für 2-3 KreisService-Instanzen entwickeln (**
    optional
  4. Spring Appl. Ribbon-Servers als Docker-Container betreiben (Externer Port:80xx)
  5. Ribbon-Servers im Zuul-Server registiert -> Umrouten des Loadbalancer (**
  6. Actuator mit Impl (**
  7. 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.img

docker start kerwerservice
curl -v -X GET http://10.91.17.75:8081/kehrwertservice/kehrwert?zahl=4

docker 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:11

WORKDIR /
ADD ueb-zuul-0.0.1-SNAPSHOT.jar app.jar

EXPOSE 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=4

http://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

H2
H3
H4
3 columns
2 columns
1 column
3 Comments