Backend-сервисы предназначены для обработки запрос от UI и других сервисов.
Solution делится на следующий части:
Common
- общие библиотеки для всех проектов. В последующем будет выноситься в отдельные nuget-пакеты.Notification
- микросервис для работы с уведомлениями. Получает шаблон уведомления отStatic
, параметризирует и отправляет на почту черезExchange
, но если включено параметром, если выключено пишет в лог текст письма.Security
отвечает за идентификацию, аутентификацию, авторизацию пользователей. Для работы с пользователями интегрируется сkeycloak
.Static
содержит статичные файлы. Кэширует ответы.
Api
могут в зависимостях иметь только два типа проектов:Contracts
иHandlers
. Для обработки сервисов извне(например, ui) созданы проекты с постфиксомPublic.Api
, например:InsuranceGoSmoke.Security.Public.Hosts.Api
. Для обработки внутренних запросов создаются проекты с постфиксомPrivate.Api
, например:InsuranceGoSmoke.Notification.Private.Hosts.Api
. При этом Public сервисы работают с авторизацией черезKeycloak
, а Private сервисы проверяют доверенные сетиMigrations
проекты с миграциями и Seed'ами.Hanlders
имеют в зависимостяхAppSettings
, в которых находятся основные сервисы бизнес-логики. При этом следует заметить, что обработка команд происходит в транзакции и елси требуются вычисления или действия, которые должны выполняться за транзакцией, например отправка уведомления, то необходимо добавлять вIEventMessageProvider
событие для обработки отправки уведомления(смотретьUpdateUserRequestHandler
)AppSettings
содержат сервисы для бизнес-логики, могут инжектитьIRepository
для работы с базой данных.Domain
содержат классы сущности таблиц БД.Contracts
содержат контракты для общения с внешними источниками.Clients
содержит реализацию клиентов для доступа к сервису. Данный проект будет публиковаться nuget-пакетом в хранилище для других сервисов, чтобы они могли общаться с этим сервисов посредством обычного вызова метода.Infrastructures.DataAccess
проекты для конфигураций работы с базой данных.Tests
проект с тестами, от этого проекта никто не должен зависеть.
Возможные зависимости между проектами:
Api | Hanlders | AppSettings | Domain | Contracts | Clients | Infrastructures | Tests | |
---|---|---|---|---|---|---|---|---|
Api | \ | + | + | |||||
Hanlders | \ | + | + | + | ||||
AppSettings | \ | + | + | + | + | |||
Domain | \ | |||||||
Contracts | \ | |||||||
Clients | + | \ | ||||||
Infrastructures | + | \ | ||||||
Tests | + | + | + | + | + | + | + | \ |
Проект AppSettings
внутри себя делит бизнес-логику на контексты, например в проекте Security
следующие контексты:
Внутри контекста логика делится на более мелкие структурные части:
-
Models
: сущности, используемые только в бизнес-логике. Содержит промежуточные классы. Например, партнер содержит большое количество свойств иHandler
не может передать сущность команды или запроса в сервис, т.к. уAppService
нет зависимости отHandler
, поэтому данные мапятся в сущность модели и передаётся в сервис. -
Services
: логика обработки запроса -
Factories
: фабрики -
StateMachines
: машины-состояний -
и т.д.
-
redis:
localhost:6379 пароль: pa55w0rd
-
postgres:
postgres:5432 postgres/postgres
-
pgadmin:
localhos:5050
-
keycloak:
localhos:8090 admin/admin
-
opensearch-dashboards:
localhos:5601
-
grafana:
localhost:3050 admin/P@ssw0rd
-
jaeger:
localhost:16686
- Перейти по адресу http://localhost:8090/
- Нажать на
Administration Console
- Ввести логин/пароль
- Перейти в
Clients
, выбратьadmin-cli
, убедиться что настройки аутентификации и авторизации включены Если нет - включить. - Перейти на вкладку
Credentials
, скопироватьClient secret
. - Перейти на вкладку
Service accounts roles
, если в списке нету ролиadmin
, то нажатьAssign role
и выбратьadmin
. - Выбрать realm: insuranceGoSmoke Если же он отсутствует, то необходимо создать realm и при создании импортировать файл из папки
./localhost/keycloak/import/realm-export.json
- Перейти в
Clients
, выбратьinsuranceGoSmoke
. - Перейти на вкладку
Credentials
, сгенерировать новыйClient secret
(если кнопка генерации заблочена, обновить страницу), скопироватьClient secret
. - Данные
Client secret
необходимо прописать во всехappsettings.Development.json
проектаbackend
. Пример:
"Keycloak": {
"Authority": "http://localhost:8090/realms/insuranceGoSmoke",
"Realm": "insuranceGoSmoke",
"ClientId": "insuranceGoSmoke",
"ClientUuid": "3ac3b9a6-c1ad-4d68-ae19-4071c1e5d48c",
"ClientSecret": "CWexDUgylZQtRiqkGyd6SUUCgtcieiMV", // secret из insuranceGoSmoke realm insuranceGoSmoke client
"MetadataAddress": "http://localhost:8090/realms/insuranceGoSmoke/.well-known/openid-configuration",
"ApiAdminBaseUrl": "http://localhost:8090",
"ApiClientId": "admin-cli",
"ApiClientSecret": "tDZUqDNxHIfJ3kt4jnbTvYEVa2T2vnTU" // secret из realm master client admin-cli
}