项目介绍

gtiwari333/spring-boot-real-world-web-application-example 是一个托管在 GitHub 上的开源项目,主要使用 Java 编写,目前获得 428 个 Star、146 次 Fork。

仓库全名
gtiwari333/spring-boot-real-world-web-application-example
Star 数
428
Fork 数
146
未关闭 Issue
1

README 摘要

A Spring Boot Web Application Sample with tons of ready-to-use features. This can be used as starter for bigger projects. Variations Simpler version without KeyCloak and multi-modules is on separate project https://github.com/gtiwari333/spring-boot-blog-app Microservice example that uses Spring Cloud features(discovery, gateway, config server etc) is on separate project…

完整内容见 GitHub 原始 README 或本页 。

常见问题

spring-boot-real-world-web-application-example 用什么语言开发?

主要使用 Java 编写,目前有 428 个 Star。

如何获取 spring-boot-real-world-web-application-example 的源码?

可以直接克隆仓库:git clone https://github.com/gtiwari333/spring-boot-real-world-web-application-example.git,默认分支为 master;安装与运行步骤见仓库 README。

spring-boot-real-world-web-application-example 最近还在维护吗?

仓库最近一次更新为 7月24日,当前有 1 个未关闭 Issue;Star 数为 428,可作为社区活跃度的参考。

关于

GitHub 原始描述(英文)

Real World Spring Boot Web Application Example with tons of ready to use features

描述取自 GitHub 官方 API,保持仓库作者书写的原文。

简要分析

热度分
726
价值分
301
活跃状态
活跃

语言占比

CSS
Groovy
HTML
Java
JavaScript
Scala
Shell

README

A Spring Boot Web Application Sample with tons of ready-to-use features. This can be used as starter for bigger projects.

Variations

Buy Me A Coffee

Service Dependency Map

main-webapp
├── mysql          (jdbc:mysql://mysql:3306/seedapp)
├── activemq       (activemq:61616)
├── keycloak       (http://keycloak:8080)
├── zipkin         (http://zipkin:9411)
└── email-service
├── emailhog   (emailhog:1025)
└── zipkin

content-checker-service
├── activemq
└── zipkin

trend-service
└── zipkin

report-service
├── mysql
├── keycloak
└── zipkin

App Architecture:

Foo

Included Features/Samples

MicroService:

  • Exposing and implementing Open Feign clients
  • Spring Cloud Contract (WIP)

Spring MVC:

  • MVC with thymeleaf templating
  • Public and internal pages
  • Live update of thymeleaf templates for local development
  • HTML fragments, reusable pagination component using Thymeleaf parameterized fragments
  • webjar - bootstrap4 + jquery
  • Custom Error page
  • Request logger filter
  • Swagger API Docs with UI ( http://localhost:8081/swagger-ui.html)
  • @RestControllerAdvice, @ControllerAdvice demo
  • CRUD UI + File upload/download
  • favicon handler

Security:

  • Account management with KeyCloak
  • Spring Security
  • User/User_Authority entity and repository/services
    • login, logout, home pages based on user role
  • Domain object Access security check on update/delete using custom PermissionEvaluator
  • private pages based on user roles
  • public home page – view all notes by all
  • Limit max number of record in a paged request

Persistence/Search:

  • Data JPA with User/Authority/Note/ReceivedFile entities, example of EntityGraph
  • MySQL or any other SQL db can be configured for prod/docker etc profiles
  • (in old code) H2 db for local, Console enabled for local ( http://localhost:8081/h2-console/, db url: jdbc:h2:mem:testdb, username: sa)
  • jOOQ integration with code generation based on JPA entity
  • Liquibase database migration

Test:

  • Unit/integration with JUnit 5, Mockito and Spring Test
  • Tests with Spock Framework (Groovy 5, Spock 2.4)
  • e2e with Selenide, fixtures. default data generated using Spring
  • Load test with Gatling/Scala
  • Architecture tests using ArchUnit
  • file upload/download e2e test with Selenide
  • TestContainers to perform realistic integration test
  • Reset DB and Cache between test
  • Assert expected query count during integration test

Misc:

  • Code Generation: lombok, mapstruct
  • Message Queue using ActiveMQ Artemis
  • Approval/flagging api - message based
  • Nested comment
  • Cache implemented
  • Zipkin tracing
  • Websocket implemented to show article/comment review status/notifications…
  • Docker-compose deploy/kubernetes

Future: do more stuff

  • CQRS with event store/streaming
  • Spring Cloud Contract integration (WIP)
  • Visitors log - IP, browser, etc
  • Centralized error reporting
  • Geo-Spatial query for visitors
  • Grafana Dashboard, @Timed and more …
  • logback LevelChangePropagator integration
  • logback error email
  • logback rolling policy
  • Integrate Markdown editor for writing notes
  • rate limit by IP on public API ( article api )
  • Fetch user’s avatar
  • UI improvement
  • S3 file upload, test with localstack TestContainers
  • nested comment query/performance fix
  • Signup UI
  • vendor neutral security with OIDC
  • JfrUnit ( WIP )

Requirements

  • JDK 25+
  • Lombok configured on IDE
  • Maven
  • Docker
    • Make sure docker is started and running
    • Run $ sudo chmod 666 /var/run/docker.sock if you get error like this “Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (Details: [13] Permission denied)”

How to Run

With docker - run all apps with dependencies (eg mysql, email server, keycloak etc):

Build and create docker image

sh build-docker-images.sh

Run all apps and dependencies using docker-compose

  • Run docker compose -f docker/docker-compose.yml up at root to run all apps and dependencies and open http://localhost:8081 to access main app

How to Run apps individually without docker

It contains following applications:

  • main-app
  • email-service (optional)
  • report-service (optional)
  • trend-service (optional)
  • content-checker (optional)

Note you will need to create a database named ‘seedapp’ in your mysql server

Option 1 - run with manually started KeyCloak, ActiveMQ and MySQL servers

  • Run mvn clean install at root
  • Run docker compose -f docker/docker-compose-dev.yml up at root to start docker containers
  • Go to main-app folder and run mvn to start the application

Option 2 - run from IDE

  • import into your IDE and compile the full project and run the Application.java on main-app module
  • Update run configuration to run maven goal wro4j:run Before Launch. It should be after ‘Build’

Once the application starts, open http://localhost:8081 on your browser.

The default username/passwords are listed on : gt.app.Application.initData, which are:

  • system/pass
  • user1/pass
  • user2/pass

Run Tests

! Test uses TestContainers, which requires Docker to be installed locally.
Running full tests

mvn clean verify

Running unit tests only (it uses maven surefire plugin)

mvn compiler:testCompile resources:testResources surefire:test

Running integration tests only (it uses maven-failsafe-plugin)

mvn compiler:testCompile resources:testResources failsafe:integration-test

Run Tests Faster by using parallel maven build

mvn -T 5 clean package

Code Quality

The error-prone runs at compile time.
The modernizer checkstyle and spotbugs plugin are run as part of maven test-compile lifecycle phase. use `mvn spotbugs:gui’ to
SonarQube scan

Run sonarqube server using docker docker run -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest

Perform scan: mvn sonar:sonar mvn sonar:sonar -Dsonar.login=admin -Dsonar.password=admin

View Reports in SonarQube web ui:

  • visit http://localhost:9000
  • default login and password are admin, you will be asked to change password after logging in with default username/password
  • (optional) change sonarqube admin password without logging in: curl -u admin:admin -X POST "http://localhost:9000/api/users/change_password?login=admin&previousPassword=admin&password=NEW_PASSWORD"
  • if you change the password, make sure the update -Dsonar.password=admin when you run sonarqube next time

Dependency vulnerability scan

Owasp dependency check plugin is configured. Run mvn dependency-check:check to run scan and open dependency-check-report.html from target to see the report.

Dependency/plugin version checker

  • mvn versions:display-dependency-updates
  • mvn versions:display-plugin-updates

Screenshots:

Public View

Read Article with nested comment/discussion

Logged in Feed View

Logged in User’s Article List View

Admin User’s Review Page to approve/disapprove flagged posts

Review Page

New Article

评论

暂无评论