- Spring Authorization Server
- Spring OAuth 2.0 Resource Server
- Spring data JPA
- Spring Web
- Spring actuator
- Spring gRPC by https://github.com/yidongnan
- Spring web-services
- Apache Kafka
- Docker
- Docker-compose
- Postgres
- React
- GraphQL
- Thymeleaf
- Jakarta Bean Validation
- Jakarta JAXB
- JUnit 5 (Extensions, Resolvers, etc)
- Retrofit 2
- Allure
- Selenide
- Selenoid & Selenoid-UI
- Allure-docker-service
- Java 17
- Gradle 7.6
- And much more:)
Рекомендуемые материалы к просмотру (прочтению):
- Implementing an OAuth 2 authorization server with Spring Security - the new way! by Laurentiu Spilca
- Full Stack OAuth 2 - With Spring Security / React / Angular Part 1
- Full Stack OAuth 2 - With Spring Security / React / Angular Part 2
- Spring Data? Да, та! by Евгений Борисов
- Spring – Глубоко и не очень by Евгений Борисов
- Spring-потрошитель, часть 1 by Евгений Борисов
- Spring-потрошитель, часть 2 by Евгений Борисов
- Spring-построитель by Евгений Борисов
- Перенимаем опыт Google в построении микросервисов с gRPC by Александр Борисов
- Designing a friendships database structure: Should I use a multivalued column?
- Гонсалвес Э.: Изучаем Java EE 7, глава "Глава 4. Java.Persistence.API"
- (Hopefully) the final article about equals and hashCode for JPA entities with DB-generated IDs
Минимальные предусловия для работы с проектом Niffler
Во-первых, и в-главных, необходимо использовать bash terminal, а не powershell.
Во-вторых, для запуска фронтенда локально необходимо использовать команду
npm run build:windows
, если не работает стандартная команда npm run build:dev
В-третьих, если у вас что-то не работает - пишите в TG чат группы - будем вместе дополнять README, т.к. изначально
проект разработан под nix
Мы будем использовать docker для БД (Postgres), кроме того, будем запускать микросервисы в едином docker network при помощи docker-compose
Установка на Mac (Для ARM и Intel разные пакеты)
После установки и запуска docker daemon необходимо убедиться в работе команд docker, например docker -v
:
Dmitriis-MacBook-Pro ~ % docker -v
Docker version 20.10.14, build a224086
docker pull postgres:15.1
docker pull confluentinc/cp-zookeeper:7.3.2
docker pull confluentinc/cp-kafka:7.3.2
После pull
вы увидите спуленный image командой docker images
mitriis-MacBook-Pro ~ % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres 15.1 9f3ec01f884d 10 days ago 379MB
confluentinc/cp-kafka 7.3.2 db97697f6e28 12 months ago 457MB
confluentinc/cp-zookeeper 7.3.2 6fe5551964f5 7 years ago 451MB
docker volume create pgdata
Запустив скрипт
Dmitriis-MacBook-Pro niffler % bash localenv.sh
Или выполнив последовательно команды, для *nix:
docker run --name niffler-all -p 5432:5432 -e POSTGRES_PASSWORD=secret -v pgdata:/var/lib/postgresql/data -d postgres:15.1
docker run --name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 -e ZOOKEEPER_TICK_TIME=2000 -p 2181:2181 -d confluentinc/cp-zookeeper:7.3.2
docker run --name=kafka -e KAFKA_BROKER_ID=1 \
-e KAFKA_ZOOKEEPER_CONNECT=$(docker inspect zookeeper --format='{{ .NetworkSettings.IPAddress }}'):2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
-e KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1 \
-e KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1 \
-p 9092:9092 -d confluentinc/cp-kafka:7.3.2
Для Windows:
docker run --name niffler-all -p 5432:5432 -e POSTGRES_PASSWORD=secret -v pgdata:/var/lib/postgresql/data -d postgres:15.1
docker run --name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 -e ZOOKEEPER_TICK_TIME=2000 -p 2181:2181 -d confluentinc/cp-zookeeper:7.3.2
docker run --name=kafka -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=$(docker inspect zookeeper --format='{{ .NetworkSettings.IPAddress }}'):2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 -e KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1 -e KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1 -p 9092:9092 -d confluentinc/cp-kafka:7.3.2
confluentinc/cp-docker-images#801 (comment)
Например, DBeaver или Datagrip. Мы рекомендуем бесплатную PgAdmin 4.
6. Подключиться к БД postgres (host: localhost, port: 5432, user: postgres, pass: secret, database name: postgres) из PgAdmin и создать пустые БД микросервисов
create
database "niffler-userdata" with owner postgres;
create
database "niffler-spend" with owner postgres;
create
database "niffler-currency" with owner postgres;
create
database "niffler-auth" with owner postgres;
Версию установленной Java необходимо проверить командой java -version
Dmitriis-MacBook-Pro ~ % java -version
openjdk version "19.0.1" 2022-10-18
OpenJDK Runtime Environment Homebrew (build 19.0.1)
Если у вас несколько версий Java одновременно - то хотя бы одна из них должна быть 17+ Если java не установлена вовсе, то рекомендую установить OpenJDK (например, из https://adoptium.net/en-GB/)
Инструкция. Рекомендованная версия Node.js - 18.13.0 (LTS)
1. Выбрать какой фронтенд предполагается запускать - REST или GraphQL, и перейти в соответсвующий каталог
для REST:
Dmitriis-MacBook-Pro niffler % cd niffler-frontend
или для GraphQL:
Dmitriis-MacBook-Pro niffler % cd niffler-frontend-gql
Для *nix:
Dmitriis-MacBook-Pro niffler-frontend % npm i
Dmitriis-MacBook-Pro niffler-frontend % npm run build:dev
Для Windows:
Dmitriis-MacBook-Pro niffler-frontend % npm i
Dmitriis-MacBook-Pro niffler-frontend % npm run build:windows
Для этого зайти в меню Run -> Edit Configurations -> выбрать main класс -> указать Active profiles: local Инструкция.
-
Запустить сервис auth
Dmitriis-MacBook-Pro niffler % cd niffler-auth
Dmitriis-MacBook-Pro niffler-auth % gradle bootRun --args='--spring.profiles.active=local'
Или просто перейдя к main-классу приложения NifflerAuthApplication выбрать run в IDEA (предварительно удостовериться что выполнен предыдущий пункт)
5 Запустить в любой последовательности другие сервисы: niffler-currency, niffler-spend, niffler-gateway, niffler-userdata
1. Создать бесплатную учетную запись на https://hub.docker.com/ (если отсутствует)
Dmitriis-MacBook-Pro niffler % vi /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
127.0.0.1 frontend.niffler.dc
127.0.0.1 auth.niffler.dc
127.0.0.1 gateway.niffler.dc
Dmitriis-MacBook-Pro niffler % cd niffler
для REST:
Dmitriis-MacBook-Pro niffler % bash docker-compose-dev.sh
для GraphQL:
Dmitriis-MacBook-Pro niffler % bash docker-compose-dev.sh gql
Текущая версия docker-compose-dev.sh удалит все старые Docker контейнеры в системе, поэтому если у вас есть созданные
контейнеры для других проектов - отредактируйте строку posh docker rm $(docker ps -a -q)
, чтобы включить в grep
только те контейнеры, что непосредственно относятся к niffler.
Niffler при запуске в докере будет работать для вас по адресу http://frontend.niffler.dc:80, этот порт НЕ НУЖНО указывать в браузере, таким образом переходить напрямую по ссылке http://frontend.niffler.dc
Если при выполнении скрипта вы получили ошибку
* What went wrong:
Execution failed for task ':niffler-auth:jibDockerBuild'.
> com.google.cloud.tools.jib.plugins.common.BuildStepsExecutionException:
Build to Docker daemon failed, perhaps you should make sure your credentials for 'registry-1.docker.io...
То необходимо убедиться, что в $USER/.docker/config.json
файле отсутствует запись "credsStore": "desktop"
При наличии такого ключа в json, его надо удалить
1. Войти в свою УЗ на https://hub.docker.com/ и последовательно создать публичные репозитории
- niffler-frontend
- niffler-frontend-gql
- niffler-userdata
- niffler-spend
- niffler-gateway
- niffler-currency
- niffler-auth
Допустим, что ваш username на https://hub.docker.com - foobazz
- где foobazz - ваш юзернэйм на https://hub.docker.com/
3. заменить в файле build.gradle (в корне проекта) imagePrefix = "qaguru" на imagePrefix = "foobazz"
- где foobazz - ваш юзернэйм на https://hub.docker.com/
Dmitriis-MacBook-Pro niffler % cd niffler
5. Собрать все имеджи, запушить и запустить niffler одной командой, если необходим фронтенд GraphQL, то это указывается аргументом к скрипту:
для REST:
Dmitriis-MacBook-Pro niffler % bash docker-compose-dev.sh push
для GraphQL:
Dmitriis-MacBook-Pro niffler % bash docker-compose-dev.sh gql push
Dmitriis-MacBook-Pro niffler % cd niffler
2. Запустить все сервисы и тесты, если необходим фронтенд GraphQL, то это указывается аргументом к скрипту:
для REST:
Dmitriis-MacBook-Pro niffler % bash docker-compose-e2e.sh
для GraphQL:
Dmitriis-MacBook-Pro niffler % bash docker-compose-e2e.sh gql