Repository ini berisi kumpulan source code pendukung untuk artikel-artikel bertag Java Spring Boot di website:
👉 https://sch39.dev/articles?tag=java-spring-boot
Setiap project adalah aplikasi Spring Boot yang berdiri sendiri dan menjadi contoh praktik dari satu atau beberapa artikel. Silakan baca artikelnya terlebih dahulu untuk memahami konteks, penjelasan, dan alasan di balik kode yang ditulis.
java-spring-boot/
├── tus-manual/ # Resumable upload (tus) manual
├── tus_library/ # Resumable upload (tus) dengan library
├── Reactive Backend Engineering with Java & Spring/
│ ├── RM01-01-reactor-basics/
│ ├── movies-info-service/
│ ├── movies-review-service/
│ ├── compose-reactive.yml # MongoDB + PostgreSQL
│ └── .spring-boot-reactive-env.example.example
└── kafka-engineering-notes/
├── order-service/ # Kafka producer
├── notification-service/ # Kafka consumer
└── reset-kafka.sh # Reset topic & consumer group
| Folder | Build Tool | Deskripsi |
|---|---|---|
tus-manual |
Maven | Implementasi protokol resumable upload tus secara manual (endpoint POST, HEAD, PATCH di /files) menggunakan Spring MVC dan Thymeleaf, dengan client tus-js-client. |
tus_library |
Maven | Resumable upload tus menggunakan library tus-java-server, lengkap dengan konfigurasi dan scheduled cleanup untuk upload yang kedaluwarsa. |
Folder: Reactive Backend Engineering with Java & Spring
| Folder | Build Tool | Deskripsi |
|---|---|---|
RM01-01-reactor-basics |
Gradle | Dasar-dasar Reactor / reactive programming di Spring WebFlux. |
movies-info-service |
Gradle | Service reaktif berbasis Spring WebFlux dan MongoDB Reactive dengan operasi CRUD (/v1/movie-info) dan GET /v1/movie-info/{id}/with-reviews yang memanggil review service lewat gRPC client. Port 8082. |
movies-review-service |
Gradle | Service reaktif berbasis Spring WebFlux dan Postgres (R2DBC) untuk review film, dengan REST (/v1/reviews, port 8081) dan gRPC server (ReviewService: AddReview, ListReviews, StreamReviews). |
Folder: kafka-engineering-notes
| Folder | Build Tool | Deskripsi |
|---|---|---|
order-service |
Gradle | Kafka producer (Spring Kafka). Membuat topic orders (3 partisi, 1 replika) dan mempublikasikan event OrderCreated dengan key customerId dan acks=all. Endpoint: POST /orders dan POST /orders/bulk?customerId=&count=. Port default 8080. |
notification-service |
Gradle | Kafka consumer untuk topic orders dengan manual ack (ack-mode: manual, enable-auto-commit: false). Endpoint: GET /notifications, GET /consumer/assignment (assignment partisi + lag), POST /consumer/pause, POST /consumer/resume. Port 8082. |
reset-kafka.sh |
Bash | Skrip untuk menghapus semua topic dan consumer group di broker (kecuali topic internal __*). |
- Java 21
- Spring Boot 4.1.x
- Spring MVC + Thymeleaf (
tus-manual,tus_library) - Spring WebFlux + Reactor + MongoDB Reactive (
movies-info-service,RM01-01-reactor-basics) - Spring WebFlux + R2DBC + PostgreSQL + gRPC / Protobuf (
movies-review-service) - Spring Kafka + Apache Kafka (
order-service,notification-service) - tus-js-client di sisi browser
- JDK 21
- Maven (atau gunakan wrapper
mvnwyang sudah disertakan) untuk project Maven - Gradle (atau gunakan wrapper
gradlewyang sudah disertakan) untuk project Gradle - Docker (opsional) untuk menjalankan MongoDB dan PostgreSQL lewat
compose-reactive.yml - MongoDB untuk menjalankan
movies-info-service - PostgreSQL untuk menjalankan
movies-review-service - Apache Kafka (broker di
localhost:9092) untuk menjalankanorder-servicedannotification-service
Masuk ke folder project yang diinginkan, lalu jalankan:
# Project Maven (tus-manual, tus_library)
./mvnw spring-boot:run
# Project Gradle (movies-*, RM01-01-reactor-basics, order-service, notification-service)
./gradlew bootRunDi Windows gunakan mvnw.cmd atau gradlew.bat.
Untuk project upload (tus-manual dan tus_library), buka halaman http://localhost:8080/upload setelah aplikasi berjalan.
File Docker Compose dan contoh env berada di dalam folder Reactive Backend Engineering with Java & Spring:
cd "Reactive Backend Engineering with Java & Spring"
# 1. Salin contoh env, lalu sesuaikan nilainya (file ini di-ignore git)
cp .spring-boot-reactive-env.example.example .spring-boot-reactive-env
# 2. Jalankan MongoDB (27017) dan PostgreSQL (5433)
docker compose --env-file .spring-boot-reactive-env -f compose-reactive.yml up -dmovies-review-service membaca POSTGRES_DB, POSTGRES_USER, dan POSTGRES_PASSWORD dari environment, jadi export dulu sebelum bootRun:
cd movies-review-service
set -a; source ../.spring-boot-reactive-env; set +a
./gradlew bootRunPort default: movies-review-service REST di 8081 (gRPC memakai port default Spring gRPC), movies-info-service di 8082.
Pastikan broker Kafka berjalan di localhost:9092, lalu jalankan consumer dan producer di terminal terpisah:
# Terminal 1: consumer (port 8082)
cd kafka-engineering-notes/notification-service
./gradlew bootRun
# Terminal 2: producer (port 8080)
cd kafka-engineering-notes/order-service
./gradlew bootRunKirim order dan lihat hasilnya:
# Satu order
curl -X POST localhost:8080/orders \
-H 'Content-Type: application/json' \
-d '{"customerId":"c-1","amount":150}'
# Banyak order sekaligus
curl -X POST 'localhost:8080/orders/bulk?customerId=c-1&count=10'
# Notifikasi yang sudah diterima consumer
curl localhost:8082/notifications
# Assignment partisi dan lag consumer
curl localhost:8082/consumer/assignment
# Pause / resume consumer
curl -X POST localhost:8082/consumer/pause
curl -X POST localhost:8082/consumer/resumeBeberapa properti notification-service yang bisa diubah di application.yml (atau lewat argumen/environment) untuk eksperimen:
server.port: ubah untuk menjalankan beberapa instance consumer dalam satu group dan mengamati rebalancing partisi.app.ack-enabled: setfalseuntuk mensimulasikan consumer yang tidak melakukan ack (offset tidak di-commit).
Catatan port:
notification-servicedanmovies-info-servicesama-sama memakai port8082, danorder-servicememakai8080(sama dengantus-*). Jangan jalankan project yang bentrok bersamaan, atau ubahserver.portsalah satunya.
Untuk mengulang percobaan dari awal, jalankan kafka-engineering-notes/reset-kafka.sh. Skrip ini menghapus semua topic dan consumer group di broker, jadi jangan dipakai pada broker yang berisi data penting. Ubah baris cd ~/kafka_2.13-4.3.1 di dalam skrip sesuai lokasi instalasi Kafka Anda; broker dapat diubah lewat env BOOTSTRAP_SERVER.
Kode di repository ini dibuat untuk keperluan belajar dan demonstrasi pada artikel, bukan untuk langsung dipakai di production tanpa penyesuaian (keamanan, validasi, konfigurasi, dsb.).
Daftar lengkap artikel: https://sch39.dev/articles?tag=java-spring-boot