Skip to main content

Service Architecture

Peak Gateway runs 6 Kotlin/Spring Boot microservices on Google Cloud Run.

Service Map

ServicePortPurposeKey Dependencies
auth8081OAuth2 token issuance, JWK publishing, client adminschema, security, Spring Authorization Server
processing8082Core payment engine: sale, auth, capture, void, refund, subscriptionstransit-client, schema, security, notifications
management8083Portal backend: merchants, users, SAML SSO, reports, auditschema, security, notifications
online-txn8084E-commerce: checkout sessions, hosted payments, webhooks, API keystransit-client, schema, security, notifications
merchant-onboarding8085CDE-scoped: TransIT credentials, NexGO XTMS device bindingtransit-client, xtms-client, schema, security, Cloud KMS
status8086Health aggregator (no database, no Pub/Sub)security only

Communication Flow

Auth (:8081) ──JWK──> Public services validate OAuth tokens via JWK endpoint
Processing (:8082) <──IAM── Management (:8083) <──Firebase── Portal
Processing (:8082) <──IAM── Online-Txn (:8084) <──OAuth── Checkout/E-commerce
Merchant-Onboarding (:8085) <──IAM── Management (:8083) --> TransIT + XTMS
Status (:8086) ──health──> All services

Two-tier security model:

  • Public-facing (auth, management, online-txn, status): Firebase Auth + OAuth2 via JWK
  • Internal-only (processing, merchant-onboarding): Cloud Run IAM only — no public access, no LB route

Shared Library Dependencies

Servicesecurityschematransit-clientxtms-clientnotifications
auth
processing
management
online-txn
merchant-onboarding
status

Tech Stack

LayerTechnology
LanguageKotlin 2.2.2, Java 25
FrameworkSpring Boot 4.0.2, Spring Security 7.0
DatabaseCloud Spanner (PostgreSQL dialect) via SQLDelight 2.2.1
AuthOAuth2 (Spring Authorization Server) + Firebase Auth + SAML SSO
MessagingCloud Pub/Sub (email, SMS, transaction events)
External APIsTSYS TransIT Multipass (payments), NexGO XTMS (devices)
BuildBazel with rules_kotlin 2.2.2
DeploymentGCP Cloud Run (us-east1)
ObservabilityStructured ECS logging, OpenTelemetry -> Cloud Trace

Environments

EnvironmentAPI DomainPortalCloud Run Prefix
Productionapi.peakgateway.cosupport.peakgateway.cogateway-{service}
Stagingstaging-api.peakgateway.costaging-support.peakgateway.cogateway-{service}-staging

Request Flow

  1. Client sends request with Bearer token (OAuth2 or Firebase ID token)
  2. Cloud Run routes to the target service
  3. Security filters validate the token via JWK endpoint (auth service)
  4. Controller checks @RequireScope (API clients) or @RequireRole (portal users)
  5. Service layer executes business logic
  6. Repository layer queries Cloud Spanner via SQLDelight/PGAdapter
  7. External calls to TransIT/XTMS if needed
  8. Response wrapped in ApiResponse<T> envelope