https://github.com/ivangfr/springboot-kafka-websocket
The goal of this project is to implement two Spring Boot applications: bitcoin-api and bitcoin-client. The bitcoin-api application simulates BTC price changes, while the bitcoin-client application listens to these changes and updates a real-time UI. The bitcoin-client UI is secured using Basic Authentication.
https://github.com/ivangfr/springboot-kafka-websocket
basic-authentication docker java kafka mysql spring-boot spring-cloud-stream spring-data-jpa spring-security spring-web-mvc springdoc-openapi thymeleaf websocket
Last synced: 6 months ago
JSON representation
The goal of this project is to implement two Spring Boot applications: bitcoin-api and bitcoin-client. The bitcoin-api application simulates BTC price changes, while the bitcoin-client application listens to these changes and updates a real-time UI. The bitcoin-client UI is secured using Basic Authentication.
- Host: GitHub
- URL: https://github.com/ivangfr/springboot-kafka-websocket
- Owner: ivangfr
- Created: 2018-09-28T19:15:34.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2025-04-11T12:17:46.000Z (9 months ago)
- Last Synced: 2025-05-20T00:06:41.054Z (7 months ago)
- Topics: basic-authentication, docker, java, kafka, mysql, spring-boot, spring-cloud-stream, spring-data-jpa, spring-security, spring-web-mvc, springdoc-openapi, thymeleaf, websocket
- Language: Java
- Homepage:
- Size: 20.3 MB
- Stars: 65
- Watchers: 4
- Forks: 36
- Open Issues: 0
-
Metadata Files:
- Readme: README.adoc
- Funding: .github/FUNDING.yml
Awesome Lists containing this project
README
= springboot-kafka-websocket
The goal of this project is to implement two https://docs.spring.io/spring-boot/index.html[`Spring Boot`] applications: `bitcoin-api` and `bitcoin-client`. The `bitcoin-api` application simulates `BTC` price changes, while the `bitcoin-client` application listens to these changes and updates a real-time UI. The `bitcoin-client` UI is secured using Basic Authentication.
== Proof-of-Concepts & Articles
On https://ivangfr.github.io:[ivangfr.github.io], I have compiled my Proof-of-Concepts (PoCs) and articles. You can easily search for the technology you are interested in by using the filter. Who knows, perhaps I have already implemented a PoC or written an article about what you are looking for.
== Additional Readings
* [Medium]: https://medium.com/@ivangfr/building-a-web-chat-with-social-login-using-spring-boot-introduction-644702e6be8e[**Building a Web Chat with Social Login using Spring Boot: Introduction**]
* [Medium]: https://medium.com/@ivangfr/list/news-producer-and-consumer-tutorial-815f134a1eda[**News Producer and Consumer Tutorial**]
== Project Diagram
image::./documentation/project-diagram.jpeg[]
== Applications
* *bitcoin-api*
+
`Spring Boot` Web Java application service that simulates `BTC` price changes and pushes those changes to https://kafka.apache.org/[`Kafka`]
* *bitcoin-client*
+
`Spring Boot` Web Java application that was implemented using `Thymeleaf` as HTML template. It reads from `Kafka` and updates its UI using `Websocket`. It has also a chat where users can talk to each other by sending messages publicly or privately.
== Prerequisites
* https://www.oracle.com/java/technologies/downloads/#java21[`Java 21`] or higher
* A containerization tool (e.g., https://www.docker.com[`Docker`], https://podman.io[`Podman`], etc.)
== Start Environment
* Open a terminal and inside the `springboot-kafka-websocket` root folder run:
+
[source]
----
docker compose up -d
----
* Wait for Docker containers to be up and running. To check it, run:
+
[source]
----
docker ps -a
----
== Running applications with Maven
Inside the `springboot-kafka-websocket` root folder, run the following `Maven` commands in different terminals:
* *bitcoin-api*
+
[source]
----
./mvnw clean spring-boot:run --projects bitcoin-api -Dspring-boot.run.jvmArguments="-Dserver.port=9081"
----
* *bitcoin-client*
+
[source]
----
./mvnw clean spring-boot:run --projects bitcoin-client -Dspring-boot.run.jvmArguments="-Dserver.port=9082"
----
== Running Applications as Docker containers
=== Build Application's Docker Image
* In a terminal, make sure you are inside the `springboot-kafka-websocket` root folder;
* In order to build the application docker images, run the following script:
+
[source]
----
./build-docker-images.sh
----
=== Application's Environment Variables
* *bitcoin-api*
+
|===
|Environment Variable | Description
|`MYSQL_HOST`
|Specify host of the `MySQL` database to use (default `localhost`)
|`MYSQL_PORT`
|Specify port of the `MySQL` database to use (default `3306`)
|`KAFKA_HOST`
|Specify host of the `Kafka` message broker to use (default `localhost`)
|`KAFKA_PORT`
|Specify port of the `Kafka` message broker to use (default `29092`)
|===
* *bitcoin-client*
+
|===
|Environment Variable | Description
|`KAFKA_HOST`
|Specify host of the `Kafka` message broker to use (default `localhost`)
|`KAFKA_PORT`
|Specify port of the `Kafka` message broker to use (default `29092`)
|===
=== Start Application's Docker container
* In a terminal, make sure you are inside the `springboot-kafka-websocket` root folder;
* Run the following script:
+
[source]
----
./start-apps.sh
----
== Applications URLs
|===
|Application |URL |Credentials (user/pass)
|bitcoin-api
|http://localhost:9081/swagger-ui.html
|
|bitcoin-client
|http://localhost:9082
|`user1/123` or `user2/123`
|===
The gif below shows two users checking real-time the `BTC` price changes. Additionally, they are using a chat channel to communicate with each other.
image::./documentation/two-users-example.gif[]
== Useful Links & Commands
* *Kafdrop*
+
`Kafdrop` can be accessed at http://localhost:9000
* *MySQL*
+
[source]
----
docker exec -it -e MYSQL_PWD=secret mysql mysql -uroot --database bitcoindb
select * from prices;
----
== Shutdown
* To stop applications
** If they were started with `Maven`, go to the terminals where they are running and press `Ctrl+C`;
** If they were started as Docker containers, go to a terminal and, inside the `springboot-kafka-websocket` root folder, run the script below:
+
[source]
----
./stop-apps.sh
----
* To stop and remove docker compose containers, network and volumes, go to a terminal and, inside the `springboot-kafka-websocket` root folder, run the following command:
+
[source]
----
docker compose down -v
----
== Cleanup
To remove the Docker images created by this project, go to a terminal and, inside the `springboot-kafka-websocket` root folder, run the script below:
[source]
----
./remove-docker-images.sh
----