diff --git a/.gitignore b/.gitignore index 485dee6..090a1f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .idea +.DS_Store diff --git a/README.md b/README.md index b8e1867..9de639d 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,16 @@ Not intended for production usage, but to reproduce issues or to try out things. ## Discovery -### Kubernetes - [kubernetes](kubernetes) -### Nacos - [nacos](nacos) +- [eureka](eureka) + ## Proxy + - [nginx](nginx) + +## Cloud + +- [Spring Cloud Bus](spring-cloud-bus) diff --git a/eureka/README.md b/eureka/README.md index 7fc3076..a20218e 100644 --- a/eureka/README.md +++ b/eureka/README.md @@ -22,5 +22,5 @@ Admin UI: http://localhost:8080/ ## Stop Everything ```bash -docker-compose down -v +docker compose down -v ``` diff --git a/eureka/buildAndRunAll.sh b/eureka/buildAndRunAll.sh index bb8efa6..d100cec 100755 --- a/eureka/buildAndRunAll.sh +++ b/eureka/buildAndRunAll.sh @@ -12,4 +12,4 @@ cd apps/hello-world ./build.sh cd ../.. -docker-compose up -d +docker compose up -d diff --git a/nacos/README.md b/nacos/README.md index b8ca632..d580ed3 100644 --- a/nacos/README.md +++ b/nacos/README.md @@ -21,7 +21,7 @@ http://localhost:8080/ ## Stop Everything ```bash -docker-compose down -v +docker compose down -v ``` ## Step-by-step Guide diff --git a/nacos/buildAndRunAll.sh b/nacos/buildAndRunAll.sh index 11fb59e..41960b1 100755 --- a/nacos/buildAndRunAll.sh +++ b/nacos/buildAndRunAll.sh @@ -12,4 +12,4 @@ cd apps/health-simulator ./build.sh cd ../.. -docker-compose up -d +docker compose up -d diff --git a/nginx/README.md b/nginx/README.md index 18c02f5..495b72a 100644 --- a/nginx/README.md +++ b/nginx/README.md @@ -23,5 +23,5 @@ chmod u+x buildAndRunAll.sh ## Stop Everything ```bash -docker-compose down -v +docker compose down -v ``` \ No newline at end of file diff --git a/nginx/buildAndRunAll.sh b/nginx/buildAndRunAll.sh index 3588ffb..df59a3e 100755 --- a/nginx/buildAndRunAll.sh +++ b/nginx/buildAndRunAll.sh @@ -8,4 +8,4 @@ cd apps/hello-world ./build.sh cd ../.. -docker-compose up -d +docker compose up -d diff --git a/spring-cloud-bus/README.md b/spring-cloud-bus/README.md new file mode 100644 index 0000000..820a4ba --- /dev/null +++ b/spring-cloud-bus/README.md @@ -0,0 +1,30 @@ +Sample for [Spring Cloud Bus](https://docs.spring.io/spring-cloud-bus/docs/current/reference/html/) + +Starts +- RabbitMQ (http://localhost:15672, credentials: guest/guest) +- a Spring Boot Admin Server (http://localhost:8080) +- a Hello World app (http://localhost:8081) + +If a bus-refresh is triggered on one of the spring boot apps, spring cloud sends a message to all other apps to +refresh their configuration (visible in the logs, currently there is nothing to refresh). + +Bus-refresh is now also available in the Spring Boot Admin UI on the environment page. +Bus-env and bus-shutdown are not yet supported. + +## Prerequisites + +- Java +- Maven +- Docker and Docker Compose + +## Run Everything +You can run the whole build and start all apps in docker containers with the following script +```bash +chmod u+x buildAndRunAll.sh +./buildAndRunAll.sh +``` + +## Stop Everything +```bash +docker compose down -v +``` \ No newline at end of file diff --git a/spring-cloud-bus/apps/hello-world/.gitignore b/spring-cloud-bus/apps/hello-world/.gitignore new file mode 100644 index 0000000..b18abdf --- /dev/null +++ b/spring-cloud-bus/apps/hello-world/.gitignore @@ -0,0 +1,5 @@ +target +.idea +*.iml +*.log +*.gz diff --git a/spring-cloud-bus/apps/hello-world/Dockerfile b/spring-cloud-bus/apps/hello-world/Dockerfile new file mode 100644 index 0000000..0f5052e --- /dev/null +++ b/spring-cloud-bus/apps/hello-world/Dockerfile @@ -0,0 +1,8 @@ +# https://hub.docker.com/_/eclipse-temurin/ +FROM eclipse-temurin:17 + +VOLUME /tmp + +COPY target/app.jar /opt/app/app.jar + +CMD ["bash", "-c", "java $JAVA_OPTS -jar /opt/app/app.jar"] diff --git a/spring-cloud-bus/apps/hello-world/build.sh b/spring-cloud-bus/apps/hello-world/build.sh new file mode 100755 index 0000000..c2c7b18 --- /dev/null +++ b/spring-cloud-bus/apps/hello-world/build.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +# Build App +mvn package +# Build Docker Image +docker build --tag hello-world-cloudbus . diff --git a/spring-cloud-bus/apps/hello-world/pom.xml b/spring-cloud-bus/apps/hello-world/pom.xml new file mode 100644 index 0000000..c89f55b --- /dev/null +++ b/spring-cloud-bus/apps/hello-world/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.1 + + + de.codecentric + hello-world-cloud-bus + 1.0.0-SNAPSHOT + hello-world-cloud-bus + hello world with spring cloud-bus + + + 17 + 3.4.2-SNAPSHOT + 2024.0.0 + + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.cloud + spring-cloud-starter-bus-amqp + + + org.springframework.boot + spring-boot-starter-web + + + de.codecentric + spring-boot-admin-starter-client + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + de.codecentric + spring-boot-admin-dependencies + ${spring-boot-admin.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + app + + + org.springframework.boot + spring-boot-maven-plugin + + + repackage + + repackage + + build-info + + + + + + + + diff --git a/spring-cloud-bus/apps/hello-world/src/main/java/de/codecentric/helloworld/cloudbus/HelloWorld.java b/spring-cloud-bus/apps/hello-world/src/main/java/de/codecentric/helloworld/cloudbus/HelloWorld.java new file mode 100644 index 0000000..39cb02d --- /dev/null +++ b/spring-cloud-bus/apps/hello-world/src/main/java/de/codecentric/helloworld/cloudbus/HelloWorld.java @@ -0,0 +1,14 @@ +package de.codecentric.helloworld.cloudbus; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloWorld { + + @GetMapping("/") + public String hello() { + return "Hello World!"; + } + +} diff --git a/spring-cloud-bus/apps/hello-world/src/main/java/de/codecentric/helloworld/cloudbus/HelloWorldCloudBusApplication.java b/spring-cloud-bus/apps/hello-world/src/main/java/de/codecentric/helloworld/cloudbus/HelloWorldCloudBusApplication.java new file mode 100644 index 0000000..dbb3d1d --- /dev/null +++ b/spring-cloud-bus/apps/hello-world/src/main/java/de/codecentric/helloworld/cloudbus/HelloWorldCloudBusApplication.java @@ -0,0 +1,13 @@ +package de.codecentric.helloworld.cloudbus; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class HelloWorldCloudBusApplication { + + public static void main(String[] args) { + SpringApplication.run(HelloWorldCloudBusApplication.class, args); + } + +} diff --git a/spring-cloud-bus/apps/hello-world/src/main/resources/application.yml b/spring-cloud-bus/apps/hello-world/src/main/resources/application.yml new file mode 100644 index 0000000..0697ba5 --- /dev/null +++ b/spring-cloud-bus/apps/hello-world/src/main/resources/application.yml @@ -0,0 +1,45 @@ +server: + port: 8081 +spring: + application: # Application-Info for the Info-Actuator + name: "@pom.artifactId@" + boot: + admin: + client: + url: "http://localhost:8080" + rabbitmq: + host: localhost + port: 5672 + username: guest + password: guest +management: # Actuator Configuration + endpoints: + web: + exposure: + include: "*" + endpoint: # Health-Actuator + health: + show-details: always + env: + post: + enabled: true + info: # Info-Actuator + java: + enabled: true + os: + enabled: true + build: + enabled: true + env: + enabled: true +info: # Application-Info for the Info-Actuator + group: "@pom.groupId@" + artifact: "@pom.artifactId@" + description: "@pom.description@" + version: "@pom.version@" + spring-boot: "@pom.parent.version@" + # Tags for the Spring Boot Admin UI + tags: + spring-boot: "@pom.parent.version@" + level: + de.codecentric.boot.admin: DEBUG diff --git a/spring-cloud-bus/apps/hello-world/src/test/java/de/codecentric/helloworld/cloudbus/HelloWorldCloudBusApplicationTests.java b/spring-cloud-bus/apps/hello-world/src/test/java/de/codecentric/helloworld/cloudbus/HelloWorldCloudBusApplicationTests.java new file mode 100644 index 0000000..9352dc7 --- /dev/null +++ b/spring-cloud-bus/apps/hello-world/src/test/java/de/codecentric/helloworld/cloudbus/HelloWorldCloudBusApplicationTests.java @@ -0,0 +1,13 @@ +package de.codecentric.helloworld.cloudbus; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class HelloWorldCloudBusApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/spring-cloud-bus/apps/spring-boot-admin/.gitignore b/spring-cloud-bus/apps/spring-boot-admin/.gitignore new file mode 100644 index 0000000..b18abdf --- /dev/null +++ b/spring-cloud-bus/apps/spring-boot-admin/.gitignore @@ -0,0 +1,5 @@ +target +.idea +*.iml +*.log +*.gz diff --git a/spring-cloud-bus/apps/spring-boot-admin/Dockerfile b/spring-cloud-bus/apps/spring-boot-admin/Dockerfile new file mode 100644 index 0000000..0f5052e --- /dev/null +++ b/spring-cloud-bus/apps/spring-boot-admin/Dockerfile @@ -0,0 +1,8 @@ +# https://hub.docker.com/_/eclipse-temurin/ +FROM eclipse-temurin:17 + +VOLUME /tmp + +COPY target/app.jar /opt/app/app.jar + +CMD ["bash", "-c", "java $JAVA_OPTS -jar /opt/app/app.jar"] diff --git a/spring-cloud-bus/apps/spring-boot-admin/build.sh b/spring-cloud-bus/apps/spring-boot-admin/build.sh new file mode 100755 index 0000000..d59ce56 --- /dev/null +++ b/spring-cloud-bus/apps/spring-boot-admin/build.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +# Build App +mvn package +# Build Docker Image +docker build --tag spring-boot-admin-cloudbus . diff --git a/spring-cloud-bus/apps/spring-boot-admin/pom.xml b/spring-cloud-bus/apps/spring-boot-admin/pom.xml new file mode 100644 index 0000000..6143c7b --- /dev/null +++ b/spring-cloud-bus/apps/spring-boot-admin/pom.xml @@ -0,0 +1,90 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.1 + + + de.codecentric + spring-boot-admin-cloud-bus + 1.0.0-SNAPSHOT + spring-boot-admin-cloud-bus + spring-boot-admin with cloud-bus + + + 17 + 3.4.2-SNAPSHOT + 2024.0.0 + + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.cloud + spring-cloud-starter-bus-amqp + + + org.springframework.boot + spring-boot-starter-web + + + de.codecentric + spring-boot-admin-starter-server + + + de.codecentric + spring-boot-admin-starter-client + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + de.codecentric + spring-boot-admin-dependencies + ${spring-boot-admin.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + app + + + org.springframework.boot + spring-boot-maven-plugin + + + repackage + + repackage + + build-info + + + + + + + + diff --git a/spring-cloud-bus/apps/spring-boot-admin/src/main/java/de/codecentric/springbootadmin/cloudbus/SpringBootAdminCloudBusApplication.java b/spring-cloud-bus/apps/spring-boot-admin/src/main/java/de/codecentric/springbootadmin/cloudbus/SpringBootAdminCloudBusApplication.java new file mode 100644 index 0000000..9f0b0d8 --- /dev/null +++ b/spring-cloud-bus/apps/spring-boot-admin/src/main/java/de/codecentric/springbootadmin/cloudbus/SpringBootAdminCloudBusApplication.java @@ -0,0 +1,15 @@ +package de.codecentric.springbootadmin.cloudbus; + +import de.codecentric.boot.admin.server.config.EnableAdminServer; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@EnableAdminServer +public class SpringBootAdminCloudBusApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootAdminCloudBusApplication.class, args); + } + +} diff --git a/spring-cloud-bus/apps/spring-boot-admin/src/main/resources/application.yml b/spring-cloud-bus/apps/spring-boot-admin/src/main/resources/application.yml new file mode 100644 index 0000000..eed4a91 --- /dev/null +++ b/spring-cloud-bus/apps/spring-boot-admin/src/main/resources/application.yml @@ -0,0 +1,44 @@ +spring: + application: + name: spring-boot-admin-cloud-bus + boot: + admin: + client: + url: http://localhost:8080 + rabbitmq: + host: localhost + port: 5672 + username: guest + password: guest + +management: # Actuator Configuration + endpoints: + web: + exposure: + include: "*" + endpoint: # Health-Actuator + health: + show-details: always + env: + post: + enabled: true + info: # Info-Actuator + java: + enabled: true + os: + enabled: true + build: + enabled: true + env: + enabled: true +info: # Application-Info for the Info-Actuator + group: "@pom.groupId@" + artifact: "@pom.artifactId@" + description: "@pom.description@" + version: "@pom.version@" + spring-boot: "@pom.parent.version@" + # Tags for the Spring Boot Admin UI + tags: + spring-boot: "@pom.parent.version@" + level: + de.codecentric.boot.admin: DEBUG diff --git a/spring-cloud-bus/apps/spring-boot-admin/src/test/java/de/codecentric/springbootadmin/cloudbus/SpringBootAdminCloudBusApplicationTests.java b/spring-cloud-bus/apps/spring-boot-admin/src/test/java/de/codecentric/springbootadmin/cloudbus/SpringBootAdminCloudBusApplicationTests.java new file mode 100644 index 0000000..4010095 --- /dev/null +++ b/spring-cloud-bus/apps/spring-boot-admin/src/test/java/de/codecentric/springbootadmin/cloudbus/SpringBootAdminCloudBusApplicationTests.java @@ -0,0 +1,13 @@ +package de.codecentric.springbootadmin.cloudbus; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SpringBootAdminCloudBusApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/spring-cloud-bus/buildAndRunAll.sh b/spring-cloud-bus/buildAndRunAll.sh new file mode 100755 index 0000000..df59a3e --- /dev/null +++ b/spring-cloud-bus/buildAndRunAll.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +cd apps/spring-boot-admin +./build.sh +cd ../.. + +cd apps/hello-world +./build.sh +cd ../.. + +docker compose up -d diff --git a/spring-cloud-bus/cloud-bus.http b/spring-cloud-bus/cloud-bus.http new file mode 100644 index 0000000..7c5a1ab --- /dev/null +++ b/spring-cloud-bus/cloud-bus.http @@ -0,0 +1,4 @@ +### trigger busrefresh +POST http://localhost:8080/actuator/busrefresh + +### diff --git a/spring-cloud-bus/docker-compose.yml b/spring-cloud-bus/docker-compose.yml new file mode 100644 index 0000000..32c38d5 --- /dev/null +++ b/spring-cloud-bus/docker-compose.yml @@ -0,0 +1,25 @@ +services: + rabbitmq: + image: rabbitmq:management + ports: + - "15672:15672" + - "5672:5672" + restart: always + + hello-world: + container_name: hello-world-cloudbus + image: hello-world-cloudbus + ports: + - "8081:8081" + environment: + - SPRING_BOOT_ADMIN_CLIENT_URL=http://spring-boot-admin:8080 + - SPRING_RABBITMQ_HOST=rabbitmq + + spring-boot-admin: + container_name: spring-boot-admin-cloudbus + image: spring-boot-admin-cloudbus + ports: + - "8080:8080" + environment: + - SPRING_BOOT_ADMIN_CLIENT_URL=http://spring-boot-admin:8080 + - SPRING_RABBITMQ_HOST=rabbitmq \ No newline at end of file