Code Monkey home page Code Monkey logo

ivangfr / springboot-elasticsearch-thymeleaf Goto Github PK

View Code? Open in Web Editor NEW
12.0 3.0 15.0 13.85 MB

The goal of this project is to implement an application called product-app. It consists of two Spring Boot services: product-api (backend) and product-ui (frontend). Data will be stored in Elasticsearch

Shell 8.73% Java 50.13% HTML 41.14%
spring-boot elasticsearch thymeleaf http-interface java mapstruct spring-data-elasticsearch springdoc-openapi web jib

springboot-elasticsearch-thymeleaf's Introduction

springboot-elasticsearch-thymeleaf

The goal of this project is to implement an application called product-app. It consists of two Spring Boot services: product-api (backend) and product-ui (frontend). The data will be stored in Elasticsearch.

Proof-of-Concepts & Articles

On 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.

Project diagram

project diagram

Applications

  • product-api

    Spring Boot Web Java application that exposes a REST API to manages products. The information about products is stored in Elasticsearch. product-api uses Spring Data Elasticsearch to persist/query/delete data in Elasticsearch

  • product-ui

    Spring Boot Web application that was implemented using Thymeleaf as HTML template. Also, it uses Http Interfaces to simplify HTTP remote access to product-api.

Prerequisites

Start Environment

  • Open a terminal and navigate to springboot-elasticsearch-thymeleaf root folder run

    docker compose up -d
  • Wait for Elasticsearch Docker container to be up and running. To check it, run

    docker compose ps

Initialize Elasticsearch

Note
In the following steps, we will create an index, an alias and do a reindex using pre-defined scripts. In case you prefer to do it step-by-step calling Elasticsearch API, refer to Creating indexes, alias and reindexing using Elasticsearch API.
  • In a terminal, make sure you are in springboot-elasticsearch-thymeleaf root folder

  • Run the following script to create the index ecommerce.products.v1 with the alias ecommerce.products (you can use the default values by just pressing Enter on every user input)

    ./create-index.sh
  • If you want to insert some products, run

    ./insert-products.sh
  • If you want to fix the reference property mapping error (explained below), run

    ./reindex.sh

    The script ./reindex.sh is used to reindex an index to another. The default will reindex from ecommerce.products.v1 to ecommerce.products.v2. The only difference between elasticsearch/mapping-v1.json (used by ecommerce.products.v1) to elasticsearch/mapping-v2.json (used by ecommerce.products.v2) is the type of the reference property. In the former, it is set the type text and, in the latter, the type keyword.

    It’s interesting because the reference property has some special characters. An example of reference code is SBES@DDR4-10000. As it has the type text, Elasticsearch (using the standard analyzer) splits the content in tokens ['SBES', 'DDR4', 10000]. So, for example, if you are looking for a product with DDR4 RAM and, for some reason, the string DDR4 is present in the reference code of some product X, the product X will be selected, even if it doesn’t have DDR4 in its description.

    So, the script ./reindex.sh aims to fix it, setting the type keyword to the reference property. The DDR4 search issue won’t happen again because, from now on, Elasticsearch won’t tokenize the content present in the reference property.

Running applications using Maven

Below are the steps to start and run the applications using Maven. We will need to open a terminal for each one. Make sure you are in springboot-elasticsearch-thymeleaf root folder while running the commands.

  • product-api

    ./mvnw clean spring-boot:run --projects product-api
  • product-ui

    ./mvnw clean spring-boot:run --projects product-ui -Dspring-boot.run.jvmArguments="-Dserver.port=9080"

Running applications as Docker containers

  • Build Docker Images

    • In a terminal, make sure you are in springboot-elasticsearch-thymeleaf root folder

    • Run the following script

      ./docker-build.sh
  • Environment Variables

    • product-api

      Environment Variable Description

      ELASTICSEARCH_URIS

      Specify uris of the Elasticsearch search engine to use (default localhost:9200)

    • product-ui

      Environment Variable Description

      PRODUCT_API_URL

      Specify url of the product-api service to use (default http://localhost:8080)

  • Run Docker containers

    • In a terminal, make sure you are in springboot-elasticsearch-thymeleaf root folder

    • Run the following script

      ./start-apps.sh

Application’s URL

Application URL

product-api

http://localhost:8080/swagger-ui.html

product-ui

http://localhost:9080

Demo

  • Below is a simple demo that shows a user interacting with product-ui

    demo user interaction

Shutdown

  • To stop applications

    • If they were started with Maven, go to product-api and product-ui terminals and press Ctrl+C

    • If they were started as Docker containers, go to a terminal and, inside springboot-elasticsearch-thymeleaf root folder, run the script below

      ./stop-apps.sh
  • To stop and remove docker compose containers, network and volumes, go to a terminal and, inside springboot-elasticsearch-thymeleaf root folder, run the following command

    docker compose down -v

Cleanup

To remove the Docker images created by this project, go to a terminal and, inside springboot-elasticsearch-thymeleaf root folder, run the script below

./remove-docker-images.sh

springboot-elasticsearch-thymeleaf's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.