Rozszerzanie i współtworzenie

Przewodnik dla programistów

Ten przewodnik jest przeznaczony dla inżynierów budujących na platformie DataFlow AI Platform. Obejmuje układ monorepo, sposób skonfigurowania lokalnego środowiska deweloperskiego, polecenia budowania i testowania dla każdego komponentu, standardy kodowania wymuszane przez projekt, pętlę deweloperską Docker Compose, debugowanie, proces współtworzenia oraz sposób dodawania nowej usługi backendowej lub funkcji frontendowej.


Architektura w skrócie

DataFlow AI to platforma mikrousługowa z granicami usług zorientowanymi na domeny. API gateway stoi przed sześcioma usługami backendowymi, które współdzielą pojedynczą bazę danych PostgreSQL.

                    +-------------------+
                    |    API Gateway    |
                    |   (Spring Cloud)  |
                    |     port 8080     |
                    +---------+---------+
                              |
        +-------+-------+----+----+-------+-------+
        |       |       |         |       |       |
   +----+--+ +--+---+ +-+------+ +---+--+ +--+--+ +---+----+
   |Metadata| |Engine| |Lineage | |Monitor| | AI  | |Migrate |
   |Service | |      | |Service | |Service| |Copilot| |Engine |
   | :8081  | | :8082| | :8084  | | :8085 | | :8086| | :8087 |
   +---+----+ +--+---+ +---+----+ +---+---+ +--+--+ +---+---+
       |          |         |          |        |         |
       +----------+---------+----------+--------+---------+
                           |
                    +------+------+
                    | PostgreSQL  |
                    | (shared DB) |
                    +-------------+

Odpowiedzialności usług

UsługaJęzykPortOdpowiedzialność
api-gatewayKotlin8080Routing, ograniczanie liczby żądań, przekazywanie uwierzytelniania, proxy SSE/WS
metadata-serviceKotlin8081CRUD pipeline'ów, połączenia, reguły jakości, katalog, audyt
pipeline-engineKotlin8082Kompilacja, wykonywanie, harmonogramowanie, Git, orkiestracja
lineage-serviceKotlin8084Graf lineage, lineage kolumn, analiza wpływu, wyszukiwanie
monitor-serviceKotlin8085Metryki dashboardu, alerty, strumieniowanie SSE, kondycja systemu
copilot (AI)Python8086NL-do-pipeline, czat, generowanie SQL, RAG, sugestie
migration-enginePython8087Konwersja XML PowerCenter / YXMD Alteryx do YAML
cliGoInterfejs wiersza poleceń dla programistów

Komunikacja jest synchroniczna REST między gateway'em a usługami, SSE dla strumieniowania alertów/metryk oraz WebSocket dla statusu pipeline'ów. Kafka do zorientowanego na zdarzenia przyjmowania lineage jest planowana, ale jeszcze nie podłączona.


Układ monorepo

Repozytorium to wielojęzyczne monorepo. Katalogi najwyższego poziomu istotne dla rozwoju to:

polcomtel/
├── backend/
│   ├── platform/            Kotlin services (Gradle multi-project build)
│   │   ├── api-gateway/
│   │   ├── metadata-service/
│   │   ├── pipeline-engine/
│   │   ├── lineage-service/
│   │   ├── monitor-service/
│   │   ├── common/          Shared model + enums
│   │   ├── connector-sdk/   Connector framework + 21 connectors
│   │   ├── pushdown-sql/    SQL dialect / push-down support
│   │   ├── integration-tests/
│   │   ├── settings.gradle.kts
│   │   └── gradlew
│   ├── ai-services/         Python services (Poetry)
│   │   ├── copilot/
│   │   └── migration-engine/
│   ├── cli/                 Go CLI (cmd/, internal/, pkg/)
│   ├── docker/
│   ├── docker-compose.yml
│   └── Makefile
├── frontend/                React + Vite + TypeScript SPA
│   └── src/                 api/, auth/, components/, pages/, hooks/, stores/
├── docs/                    Markdown reference docs + OpenAPI specs
├── docs-ts/                 This documentation site (Next.js + Markdoc)
└── scripts/

Systemy budowania według komponentu

KomponentJęzykNarzędzie budowaniaManifest
backend/platform/*KotlinGradle (multi-project)settings.gradle.kts, build.gradle.kts
backend/ai-services/*PythonPoetrypyproject.toml
backend/cliGomoduły Gogo.mod
frontendTypeScript / ReactVite + npmpackage.json
docs-tsTypeScript / Next.jsnpmpackage.json

Usługi Kotlina to pojedyncze wieloprojektowe budowanie Gradle zakorzenione w backend/platform/settings.gradle.kts; moduły adresuje się ścieżkami takimi jak :platform:metadata-service.


Konfiguracja lokalnego środowiska deweloperskiego

Wymagania wstępne

NarzędzieWersjaInstalacja
JDK21+sdk install java 21-graal (SDKMAN)
Gradle8.xDołączony przez wrapper ./gradlew
Python3.12+pyenv install 3.12
Poetry1.8+curl -sSL install.python-poetry.org | python3
Go1.22+go install golang.org/dl/go1.22@latest
Node.js20+nvm install 20
Docker24+Docker Desktop lub colima
Docker Compose2.xDołączony do Docker Desktop

Uruchomienie lokalnej infrastruktury

# From backend/ — start PostgreSQL, Keycloak, and Redis
docker-compose up -d

# Verify the stack
docker-compose ps

Stos Compose uruchamia:

UsługaWersjaPortUwagi
PostgreSQL155432Współdzielona baza danych dla wszystkich usług
Keycloak249090Dostawca tożsamości — login administratora admin/admin
Redislatest6379Wspiera ograniczanie liczby żądań gateway'a

Polecenia budowania i testowania dla poszczególnych komponentów

Usługi Kotlina (Gradle)

Uruchom usługę lokalnie zadaniem Spring Boot bootRun:

# Run each service on its port
./gradlew :platform:metadata-service:bootRun    # 8081
./gradlew :platform:pipeline-engine:bootRun     # 8082
./gradlew :platform:lineage-service:bootRun     # 8084
./gradlew :platform:monitor-service:bootRun     # 8085
./gradlew :platform:api-gateway:bootRun         # 8080
ZadaniePolecenie
Zbuduj wszystko./gradlew build
Wszystkie testy jednostkowe./gradlew test
Testy jednego modułu./gradlew :platform:metadata-service:test
Testy z pokryciem./gradlew test jacocoTestReport
Testy integracyjne (wymagany Docker)./gradlew integrationTest
Lint Kotlina./gradlew ktlintCheck

Usługi AI w Pythonie (Poetry)

# Copilot service (port 8086)
cd backend/ai-services/copilot
poetry install
poetry run uvicorn copilot.main:app --host 0.0.0.0 --port 8086 --reload

# Migration engine (port 8087)
cd backend/ai-services/migration-engine
poetry install
poetry run uvicorn migration.main:app --host 0.0.0.0 --port 8087 --reload
ZadaniePolecenie
Zainstaluj zależnościpoetry install
Uruchom testy Copilotapoetry run pytest tests/ -v (w copilot/)
Uruchom testy Migrationpoetry run pytest tests/ -v (w migration-engine/)
Lint Pythonapoetry run ruff check .

CLI w Go

cd backend/cli
go build -o dataflow ./cmd

# Verify
./dataflow version
./dataflow login --server http://localhost:8080
ZadaniePolecenie
Budowaniego build -o dataflow ./cmd
Testgo test ./...
Formatowaniegofmt -w .

Frontend

cd frontend
npm install
npm run dev          # Vite dev server at http://localhost:5173
ZadaniePolecenie
Zainstaluj zależnościnpm install
Serwer deweloperskinpm run dev
Budowanie produkcyjnenpm run build
Testy (pojedyncze uruchomienie)npm run test:run
Testy (tryb watch)npm run test
Testy z pokryciemnpm run test:coverage
LintESLint przez konfigurację projektu

Walidacja specyfikacji OpenAPI

cd docs/api
npx vitest run __tests__/validate-openapi.test.ts

Lokalna pętla deweloperska Docker Compose

Typowa sesja pętli wewnętrznej łączy skonteneryzowaną infrastrukturę z lokalnie uruchomionymi usługami, dzięki czemu możesz przeładowywać na gorąco (hot-reload) komponent, nad którym pracujesz.

KrokDziałanie
1docker-compose up -d z backend/, aby uruchomić PostgreSQL, Keycloak, Redis
2docker-compose ps, aby potwierdzić, że wszystkie trzy są zdrowe (healthy)
3Uruchom zmienianą usługę (usługi) za pomocą bootRun / uvicorn --reload / npm run dev
4Uruchom gateway (:platform:api-gateway:bootRun), aby frontend miał pojedynczy punkt wejścia
5Edytuj, zapisz, pozwól serwerowi deweloperskiemu przeładować się; ponownie uruchom odpowiednie zadanie testowe
6docker-compose down po zakończeniu (down -v, aby usunąć wolumeny dla czystej bazy danych)

Uruchamiaj tylko to, czego dotykasz

Rzadko potrzebujesz, aby działała każda usługa. Aby pracować nad lineage, uruchom PostgreSQL przez Compose, uruchom :platform:lineage-service:bootRun oraz :platform:api-gateway:bootRun i pozostaw pozostałe zatrzymane. Gateway toleruje brak usług w dół łańcucha i zwraca jasny błąd dla tras, które ich wymagają.


Debugowanie

KomponentJak debugować
Usługi KotlinabootRun udostępnia JVM; podłącz zdalny debugger lub uruchom klasę Application usługi bezpośrednio z IDE
Usługi PythonaUruchom uvicorn z --reload; użyj pdb/debugpy lub podłącz debugger IDE do procesu Uvicorn
CLI w GoZbuduj przez go build i uruchom pod dlv (Delve) lub użyj debuggera Go w IDE na ./cmd
FrontendSerwer deweloperski Vite dostarcza source mapy; użyj DevTools przeglądarki i React DevTools
Kontrakty APIUruchom dowolną usługę i otwórz /swagger-ui.html lub załaduj specyfikację z docs/api/ do Swagger Editor

Specyfikacje OpenAPI

Pełne specyfikacje OpenAPI znajdują się w docs/api/:

Plik specyfikacjiUsługa
openapi-metadata.yamlmetadata-service
openapi-pipeline-engine.yamlpipeline-engine
openapi-monitor.yamlmonitor-service
openapi-lineage.yamllineage-service
openapi-gateway.yamlapi-gateway (zagregowana, z uwierzytelnianiem)

Standardy kodowania

Projekt wymusza jeden styl na język. CI uruchamia odpowiedni linter i zawiesza budowanie przy naruszeniu.

JęzykLinter / formaterReguły
KotlinktlintReguły domyślne, wcięcie 4-spacjowe
Pythonruff + BlackReguły domyślne, długość wiersza 120 znaków
GogofmtStandardowe formatowanie
TypeScript / ReactESLint + PrettierKonfiguracja ESLint projektu

Uruchom lintery przed wypchnięciem (push):

./gradlew ktlintCheck            # Kotlin
poetry run ruff check .          # Python (from a service directory)
gofmt -l .                       # Go — lists files needing formatting

Proces współtworzenia

Nazewnictwo gałęzi

feature/<ticket-id>-<short-description>    # New features
fix/<ticket-id>-<short-description>        # Bug fixes
refactor/<description>                     # Refactoring
docs/<description>                          # Documentation only

Przykłady: feature/DF-1234-add-kafka-connector, fix/DF-5678-scheduler-timezone-bug.

Format komunikatu commita

Projekt stosuje Conventional Commits:

<type>(<scope>): <subject>

<body>

<footer>
PoleDozwolone wartości
typefeat, fix, refactor, test, docs, chore, ci
scopemetadata, engine, lineage, monitor, copilot, migration, gateway, cli, ui
feat(engine): add Kafka streaming connector support

Implements KafkaConnector extending NativeConnectorBase with
consumer group management, offset tracking, and exactly-once
semantics via idempotent producer.

Closes: DF-1234

Proces pull request

  1. Utwórz gałąź feature z main.
  2. Zaimplementuj zmianę razem z jej testami.
  3. Upewnij się, że wszystkie testy przechodzą: ./gradlew test.
  4. Upewnij się, że lint przechodzi: ./gradlew ktlintCheck (Kotlin), poetry run ruff check . (Python).
  5. Wypchnij gałąź i otwórz PR na GitHubie.
  6. PR można scalić, gdy ma co najmniej jedno zatwierdzenie od właściciela kodu (code owner), wszystkie kontrole CI przechodzą (budowanie, test, lint, skanowanie bezpieczeństwa) i nie ma konfliktów scalania.
  7. Scal do main metodą squash-merge.

Testy nie są opcjonalne

PR dodający funkcję bez testów nie przejdzie recenzji. Testy jednostkowe to minimum; jeśli zmiana dotyka granicy usługi lub bazy danych, dodaj test integracyjny uruchamiany pod ./gradlew integrationTest na stosie Docker.


Dodawanie nowej usługi backendowej

Nowa usługa Kotlina dołącza do wieloprojektowego budowania Gradle. Kroki wysokiego poziomu:

KrokDziałanie
1Utwórz backend/platform/<service-name>/ z plikiem build.gradle.kts
2Dodaj include(":platform:<service-name>") do settings.gradle.kts
3Zależ od :platform:common dla współdzielonego modelu i enumów
4Wybierz nieużywany port (8081–8087 są zajęte) i ustaw go w konfiguracji usługi
5Dodaj trasę w api-gateway, aby usługa była osiągalna przez port 8080
6Napisz specyfikację OpenAPI w docs/api/ i podłącz ją do testu walidacji
7Jeśli usługa posiada tabele, dodaj migracje bazy danych do współdzielonego schematu PostgreSQL
8Dodaj testy jednostkowe; dodaj testy integracyjne w :platform:integration-tests

Usługa AI w Pythonie ma tę samą formę w backend/ai-services/: projekt Poetry z pyproject.toml, aplikacja FastAPI serwowana przez Uvicorn, katalog tests/ testowany przez pytest oraz trasa gateway'a.


Dodawanie nowej funkcji frontendowej

Frontend to jednostronicowa aplikacja React + Vite + TypeScript. Kod źródłowy jest zorganizowany według odpowiedzialności w frontend/src/:

KatalogZawartość
api/Typowane moduły klienta API dla poszczególnych domen backendu
auth/Integracja z Keycloakiem i stan uwierzytelniania
components/Komponenty interfejsu wielokrotnego użytku
pages/Komponenty stron na poziomie tras
hooks/Niestandardowe hooki React
stores/Stan po stronie klienta
router.tsxTablica tras

Aby dodać funkcję:

KrokDziałanie
1Dodaj komponent strony w src/pages/
2Zarejestruj jej trasę w src/router.tsx
3Dodaj typowany moduł API w src/api/, który wywołuje backend przez gateway
4Wyodrębnij współdzielony interfejs do src/components/
5Dodaj testy komponentów/jednostkowe; uruchom npm run test:run
6Zweryfikuj na serwerze deweloperskim: npm run dev, otwórz http://localhost:5173

Rozmawiaj z gateway'em, nie z usługami

Moduły API frontendu powinny wywoływać API gateway na porcie 8080, nigdy bezpośrednio portu usługi backendowej. Gateway obsługuje przekazywanie uwierzytelniania, ograniczanie liczby żądań oraz proxy SSE/WebSocket — pomijanie go psuje te gwarancje i zawiedzie we wdrożonych środowiskach.


Przegląd poleceń

CelPolecenie
Uruchom infrastrukturędocker-compose up -d (z backend/)
Uruchom usługę Kotlina./gradlew :platform:<service>:bootRun
Zbuduj wszystkie moduły Kotlina./gradlew build
Wszystkie testy jednostkowe Kotlina./gradlew test
Testy integracyjne Kotlina./gradlew integrationTest
Lint Kotlina./gradlew ktlintCheck
Uruchom usługę Pythonapoetry run uvicorn <module>.main:app --reload --port <port>
Testy Pythonapoetry run pytest tests/ -v
Lint Pythonapoetry run ruff check .
Zbuduj CLIgo build -o dataflow ./cmd
Uruchom frontendnpm run dev
Testy frontendunpm run test:run
Zwaliduj specyfikacje OpenAPInpx vitest run __tests__/validate-openapi.test.ts (z docs/api/)
Poprzednia
SDK konektorów