Lion Travel - GlobeConnect Product Hub 系統總覽
完整的 B2C 旅遊產品平台架構文件 - 中央與區域雙層架構
最後更新: 2026-02-07
📚 目錄
系統概述
GlobeConnect Product Hub (GPH) 是 Lion Travel 的全球化 B2C 旅遊產品平台,採用中央與區域雙層架構,實現全球產品資源的統一管理與區域化運營。
核心目標
- 中央化產品採購 - 從外部供應商(如 SERP)統一採購產品
- 區域化產品運營 - 各區域站點(TW, US, JP)獨立管理與銷售
- AI 增強產品內容 - 多語言翻譯與描述優化
- 全球訂單交換 (GOX) - 跨區域訂單協作系統
關鍵特性
- ✅ 雙層架構 - 中央 (Central) + 區域 (Regions)
- ✅ 多語言支援 - en-US, zh-TW, ja-JP
- ✅ 多幣別定價 - 支援 12+ 種貨幣動態轉換
- ✅ 高效能搜尋 - Elasticsearch 全文搜尋(區域層)
- ✅ 事件驅動架構 - Webhooks + Domain Events
- ✅ 整潔架構 - DDD + CQRS + Clean Architecture
- ✅ 容器化部署 - Docker + GitLab CI/CD
架構理念:中央與區域
為什麼需要雙層架構?
中央層 (Central)
├─ 統一採購產品資源
├─ AI 資料豐富化
└─ 分發到各區域
區域層 (Regions: TW, US, JP, HK...)
├─ 本地化產品內容
├─ 區域定價與促銷
├─ 本地化客戶服務
└─ 區域法規遵循
職責劃分
| 層級 | 職責 | 專案 |
|---|---|---|
| 中央 (Central) | 產品採購、資料豐富化、全球分發 | GlobalHub + GlobalHub API |
| 區域 (Regions) | 產品管理、搜尋服務、訂單處理 | ProductsAPI + ProductBackend |
專案架構圖
整體系統架構
┌─────────────────────────────────────────────────────────────────┐
│ 中央層 (Central) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────────────────────┐ │
│ │ SERP API │────────▶│ GlobalHub API │ │
│ │ (外部供應商) │ 產品資料 │ (.NET 10) │ │
│ │ │ │ - 匯入 SERP 產品 │ │
│ └──────────────┘ │ - AI 資料豐富化 │ │
│ │ - 分發到各區域 │ │
│ └──────────┬───────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────┐ │
│ │ GlobalHub │ │
│ │ (Next.js 16) │ │
│ │ - 中央 B2C 前台 │ │
│ │ - 產品展示 │ │
│ └──────────────────────────────┘ │
│ │ │
└──────────────────────────────────────┼──────────────────────────┘
│
同步產品到各區域 (Webhook/Scheduled)
│
┌──────────────────┼──────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ 區域層 (Regions: TW, US, JP) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ ProductsAPI (TW/US/JP) │ │
│ │ (.NET 10 + PostgreSQL + Elasticsearch + Redis) │ │
│ │ - 區域產品目錄 │ │
│ │ - Elasticsearch 搜尋 │ │
│ │ - 訂單管理 │ │
│ │ - 金流整合 │ │
│ └──────────────────────┬───────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ ProductBackend (TW/US/JP) │ │
│ │ (Next.js 16 + shadcn/ui) │ │
│ │ - 區域 CMS 管理後台 │ │
│ │ - 產品內容編輯 │ │
│ │ - 本地化設定 │ │
│ └──────────────────────┬───────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────┐ │
│ │ 區域 B2C 前台 │ │
│ │ (終端消費者網站) │ │
│ └────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────┘
完整資料流架構
┌─────────── 上游同步 ───────────┐
│ │
▼ │
SERP API (外部供應商) │
│ │
│ 1. 產品資料(團體旅遊、票券) │
▼ │
GlobalHub API (中央匯入服務) │
│ │
│ 2. 資料處理 │
│ - 驗證與轉換 │
│ - AI 豐富化(多語言翻譯) │
│ - 儲存到中央資料庫 │
▼ │
中央資料庫 (PostgreSQL) │
│ │
│ 3. 展示 │
▼ │
GlobalHub (中央 B2C 前台) │
│
┌─────────── 下游同步 ───────────┘
│
│ 4. 推送到各區域
│
├────────────────┬────────────────┬────────────────┐
│ │ │ │
▼ ▼ ▼ ▼
ProductsAPI TW ProductsAPI US ProductsAPI JP ...
│ │ │
│ 5. 區域處理 │ │
│ - 同步產品 │ │
│ - 索引到 ES │ │
│ - 本地化 │ │
▼ ▼ ▼
ProductBackend ProductBackend ProductBackend
│ │ │
│ 6. CMS 編輯 │ │
│ - 內容調整 │ │
│ - 定價設定 │ │
▼ ▼ ▼
區域 B2C 前台 區域 B2C 前台 區域 B2C 前台
│ │ │
│ 7. 終端使用者 │ │
▼ ▼ ▼
👥 TW 客戶 👥 US 客戶 👥 JP 客戶
核心專案詳解
中央層專案
1. 🌐 GlobalHub (中央 B2C 前台)
技術: Next.js 16 + React 19 + Tailwind CSS 4
職責:
- 中央站點的 B2C 客戶端產品展示
- 多語言界面(中央層面向全球)
- 多幣別價格顯示
- 購物車與訂單流程
特色:
- Server-Side Rendering (SSR)
- Static Site Generation (SSG)
- Image Optimization
- SEO 優化
定位: 中央管理的全球產品展示平台
GitLab: liongroup/liontech/lionglobal/b2c/globalhub
2. ⚙️ GlobalHub API (中央匯入與分發服務)
技術: .NET 10 + PostgreSQL + Hangfire
核心職責:
A. 上游同步 (SERP → GlobalHub)
- 從 SERP API 匯入產品資料
- 資料驗證與轉換
- AI 資料豐富化(多語言翻譯、描述優化)
- 儲存到中央資料庫
B. 下游同步 (GlobalHub → 各區域)
- 推送產品到 ProductsAPI (TW/US/JP)
- 區域化資料轉換
- 批次同步與錯誤處理
架構:
- Domain-Driven Design (DDD)
- Clean Architecture
- CQRS (部分實作)
- Result Pattern (錯誤處理)
同步機制:
- ✅ Webhook (即時推送)
- ✅ 定時輪詢(全量/增量)
- ✅ 手動觸發
- ✅ 冪等性設計
- ✅ 重試與斷路器(Polly)
- ✅ 死信佇列
主要 API:
POST /products/import- 啟動 SERP 匯入任務GET /products/import/{jobId}- 查詢匯入狀態POST /webhooks/serp- 接收 SERP WebhookPOST /regions/{code}/sync- 同步到特定區域GET /health/sync- 同步健康檢查
詳細設計: GlobalHub 同步架構
GitLab: liongroup/liontech/lionglobal/b2c/globalhubapi
區域層專案
3. 🏢 ProductsAPI (區域產品服務核心)
技術: .NET 10 + PostgreSQL + Elasticsearch 8.11 + Redis + Hangfire + Wolverine
定位: 區域站點 (TW/US/JP) 的產品核心服務
職責:
- 接收來自 GlobalHub API 的產品同步
- 區域產品目錄管理 (Vouchers + Package Tours)
- 高效能全文搜尋(Elasticsearch)
- 多幣別價格轉換(區域化)
- 多語言內容管理(區域化)
- 訂單管理 (本地 + 跨站)
- 金流整合 (Stripe, Elavon, Moneris)
- Webhook 事件發布
架構:
- Clean Architecture (Domain / Application / Infrastructure / Presentation)
- CQRS with Wolverine Messaging
- Event-Driven Architecture
- Multi-Site Database Design
資料庫:
- productsdb (ApplicationDbContext) - 產品目錄,區域內共享
- stationorderdb (StationOrderDbContext) - 訂單資料,站點本地
主要 API:
POST /products/sync-from-globalhub- 接收中央同步 ⭐GET /products- 搜尋產品GET /products/{id}- 產品詳情POST /bookings- 建立訂位GET /tours/{id}/departures- 可用出發日期POST /webhooks/*- Webhook 端點
GitLab: liongroup/liontech/lionglobal/b2c/productsapi
4. 🎛️ ProductBackend (區域 CMS 管理後台)
技術: Next.js 16 + React 19 + shadcn/ui + Zustand
定位: 區域站點 (TW/US/JP) 的內容管理系統
職責:
- 區域產品內容管理
- 區域化編輯(語言、幣別、定價)
- 首頁內容編輯 (整合 ApostropheCMS)
- 多語言內容編輯
- 多幣別定價設定
- 媒體上傳管理(AWS S3)
- AI 聊天輔助
核心功能:
- 產品 CRUD(基於同步自 GlobalHub 的產品)
- 行程編輯器
- 套餐編輯器
- 費用項目編輯器
- 旅客欄位設定
- CMS Widget 編輯
與 GlobalHub 的關係:
- ProductBackend 管理的產品來源於 GlobalHub API
- 區域營運人員可以調整本地化內容
- 不直接匯入外部產品(由 GlobalHub API 負責)
GitLab: liongroup/liontech/lionglobal/b2c/productbackend
技術棧總覽
中央層技術
| 專案 | 框架 | 資料庫 | 背景任務 | 備註 |
|---|---|---|---|---|
| GlobalHub | Next.js 16 | - | - | 中央 B2C 前台 |
| GlobalHub API | .NET 10 | PostgreSQL | Hangfire | 匯入與分發服務 |
區域層技術
| 專案 | 框架 | 資料庫 | 搜尋引擎 | 背景任務 |
|---|---|---|---|---|
| ProductsAPI | .NET 10 | PostgreSQL | Elasticsearch 8.11 | Hangfire |
| ProductBackend | Next.js 16 | - | - | - |
前端技術
| 專案 | 框架 | UI 庫 | 狀態管理 | 樣式 |
|---|---|---|---|---|
| GlobalHub | Next.js 16 | React 19 | - | Tailwind CSS 4 |
| ProductBackend | Next.js 16 | React 19 + shadcn/ui | Zustand | Tailwind CSS 4 |
後端技術
| 專案 | 框架 | 架構模式 | 訊息處理 | 背景任務 |
|---|---|---|---|---|
| GlobalHub API | .NET 10 | DDD + Clean Arch | - | Hangfire |
| ProductsAPI | .NET 10 | DDD + Clean Arch + CQRS | Wolverine | Hangfire |
資料儲存
| 技術 | 用途 | 使用專案 |
|---|---|---|
| PostgreSQL | 主資料庫 | GlobalHub API (中央), ProductsAPI (各區域) |
| Elasticsearch 8.11 | 全文搜尋 | ProductsAPI (各區域) ⭐ |
| Redis | 快取層 | ProductsAPI (各區域) |
| AWS S3 | 圖片儲存 | ProductsAPI (各區域) |
DevOps
| 工具 | 用途 |
|---|---|
| Docker | 容器化 |
| GitLab CI | CI/CD 流程 |
| Seq | 結構化日誌 |
| Hangfire Dashboard | 背景任務監控 |
| Prometheus + Grafana | 同步監控(GlobalHub API) |
資料流與整合
1. 產品完整生命週期
┌──── 產品採購階段 (中央) ────┐
│ │
│ 1. SERP API │
│ ↓ 提供產品資料 │
│ 2. GlobalHub API │
│ ├─ 匯入任務 │
│ ├─ 資料驗證 │
│ ├─ AI 豐富化 │
│ └─ 儲存中央資料庫 │
│ ↓ │
│ 3. GlobalHub (前台) │
│ └─ 中央站點展示 │
│ │
└─────────────────────────────┘
│
│ 推送同步
▼
┌──── 產品區域化階段 (區域) ────┐
│ │
│ 4. ProductsAPI (TW/US/JP) │
│ ├─ 接收同步資料 │
│ ├─ 儲存區域資料庫 │
│ ├─ 索引到 Elasticsearch │
│ └─ 本地化處理 │
│ ↓ │
│ 5. ProductBackend (CMS) │
│ ├─ 營運人員編輯 │
│ ├─ 調整定價 │
│ ├─ 本地化內容 │
│ └─ 設定促銷 │
│ ↓ │
│ 6. 區域 B2C 前台 │
│ └─ 終端客戶瀏覽購買 │
│ │
└───────────────────────────────┘
2. 上游同步流程 (SERP → GlobalHub)
觸發方式:
- Webhook (即時)
- 定時輪詢
- 全量同步: 每天 02:00 AM
- 增量同步: 每小時
- 價格同步: 每 15 分鐘
- 手動觸發
處理流程:
SERP API
↓ HTTP JSON
GlobalHub API (SerpApiClient)
↓ 驗證
SerpProductMapper
↓ 轉換
ProductEnrichmentService (AI)
↓ 豐富化
ImportProductsJob (Hangfire)
↓ 批次儲存
中央 PostgreSQL
3. 下游同步流程 (GlobalHub → 各區域)
同步策略:
- 全量同步: 每天凌晨 3-5 AM (各區域錯開)
- 增量同步: 每 30 分鐘
- 即時同步: Webhook 觸發
處理流程:
GlobalHub API (RegionSyncService)
↓ 批次處理 (50個/批)
├─ TW: POST https://tw.productsapi.liontravel.com/api/products/sync-from-globalhub
├─ US: POST https://us.productsapi.liontravel.com/api/products/sync-from-globalhub
└─ JP: POST https://jp.productsapi.liontravel.com/api/products/sync-from-globalhub
↓
ProductsAPI (SyncFromGlobalHubCommandHandler)
↓ 冪等性處理
├─ 檢查 GlobalHubProductId
├─ 更新 or 新增
├─ 儲存 PostgreSQL
└─ 同步 Elasticsearch
4. 產品搜尋流程 (區域層)
區域 B2C 前台 (TW/US/JP)
↓ 使用者搜尋
ProductsAPI (TW/US/JP)
↓ GET /products?search=bali¤cy=JPY&locale=zh-TW
├─ Elasticsearch 搜尋 ⭐
├─ PostgreSQL 取得詳細資料
├─ 多幣別價格轉換
└─ 多語言內容過濾
↓ JSON Response
區域 B2C 前台
└─ 顯示搜尋結果
5. 訂單建立流程 (區域層)
使用者選擇產品 (區域 B2C 前台)
↓
ProductsAPI (區域)
↓ POST /bookings
├─ 檢查可用名額
├─ 鎖定座位
├─ 建立訂單 (stationorderdb)
└─ 發布 BookingCreated 事件
↓
金流處理
└─ Stripe Payment Link
↓ Webhook 回調
訂單確認
部署架構
區域層 Docker Compose 配置 (ProductsAPI 範例)
services:
product-api:
image: webapi
ports:
- 5050:8080
environment:
- ConnectionStrings__Database=Host=postgres;...
- Elasticsearch__Uri=http://elasticsearch:9200
depends_on:
- postgres
- redis
- elasticsearch
postgres:
image: postgres:17
ports:
- 5432:5432
volumes:
- ./.containers/db:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- 6380:6379
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- 9201:9200
volumes:
- ./.containers/elasticsearch:/usr/share/elasticsearch/data
seq:
image: datalust/seq:2024.3
ports:
- 8081:80
環境分離
| 環境 | 層級 | 分支 | 域名範例 |
|---|---|---|---|
| Development | 中央 + 區域 | develop | localhost:* |
| Staging | 中央 + 區域 | staging | *.107.liondev.work |
| Production | 中央 | main | globalhub.liontravel.com |
| Production | 區域 TW | main | tw.liontravel.com |
| Production | 區域 US | main | us.liontravel.com |
| Production | 區域 JP | main | jp.liontravel.com |
開發流程
本地開發環境設定
中央層
1. GlobalHub (中央前台)
cd globalhub
npm ci
npm run dev
# → http://localhost:3000
2. GlobalHub API (匯入服務)
cd globalhubapi
dotnet run --project src/Presentation/Web.Api
# → http://localhost:8080
# → Swagger: http://localhost:8080/swagger
# → Hangfire: http://localhost:8080/hangfire
區域層
3. ProductsAPI (區域產品服務)
cd productsapi
docker-compose up -d # 啟動 PostgreSQL, Redis, Elasticsearch, Seq
dotnet run --project src/Web.Api
# → http://localhost:5050
# → Swagger: http://localhost:5050/swagger
# → Hangfire: http://localhost:5050/hangfire
4. ProductBackend (區域 CMS)
cd productbackend
npm install
npm run dev
# → http://localhost:3001
測試策略
| 測試類型 | 專案 | 工具 | 說明 |
|---|---|---|---|
| 單元測試 | GlobalHub API, ProductsAPI | xUnit | 領域邏輯測試 |
| 整合測試 | GlobalHub API, ProductsAPI | xUnit + Testcontainers | 資料庫與外部服務 |
| 契約測試 | GlobalHub API → ProductsAPI | xUnit | 同步 API 契約 |
| 架構測試 | ProductsAPI | NetArchTest | 架構規則檢查 |
| E2E 測試 | GlobalHub, ProductBackend | Vitest + Testing Library | 前端元件測試 |
Git 分支策略
main (production)
↑
└─ staging
↑
└─ develop
↑
├─ feature/xxx
├─ bugfix/xxx
└─ hotfix/xxx
團隊協作
專案角色
| 角色 | 負責專案 | 技能需求 |
|---|---|---|
| 前端工程師 | GlobalHub, ProductBackend | React, Next.js, TypeScript, Tailwind |
| 後端工程師 (中央) | GlobalHub API | .NET, Clean Architecture, Hangfire, Polly |
| 後端工程師 (區域) | ProductsAPI | .NET, DDD, CQRS, Elasticsearch, Wolverine |
| DevOps 工程師 | 所有專案 | Docker, GitLab CI, Kubernetes |
| QA 工程師 | 所有專案 | 測試策略, 自動化測試 |
關鍵文件
GlobalHub API
ProductsAPI (最完整文件)
- 專案內
docs/目錄包含詳細架構與 API 文件
關鍵設計決策
1. 為何採用中央與區域雙層架構?
優點:
- ✅ 統一產品資源管理(中央採購)
- ✅ 區域化運營靈活性(本地定價、促銷)
- ✅ 資料主權與隱私(訂單資料區域化)
- ✅ 可擴展性(新增區域不影響中央)
2. 為何 Elasticsearch 只在區域層?
理由:
- 中央層:產品採購與分發,不需要複雜搜尋
- 區域層:終端客戶搜尋,需要高效能全文搜尋
- 避免重複建置,各區域獨立優化
3. 為何使用 Wolverine 取代 MediatR?(ProductsAPI)
優點:
- ✅ 更好的效能
- ✅ 內建訊息持久化
- ✅ 更靈活的訊息路由
- ✅ 支援分散式追蹤
4. 為何分離產品與訂單資料庫?(ProductsAPI)
理由:
- 產品資料區域共享 → 集中管理
- 訂單資料站點本地 → 資料主權與隱私
- 支援跨站訂單轉發
同步機制關鍵指標
監控指標 (GlobalHub API)
| 指標 | 目標值 | 說明 |
|---|---|---|
| SERP 同步成功率 | \u003e 95% | 上游同步健康度 |
| 區域同步成功率 | \u003e 98% | 下游同步健康度 |
| SERP 同步延遲 | \u003c 30 分鐘 | 全量同步完成時間 |
| 區域同步延遲 | \u003c 10 分鐘 | 增量同步完成時間 |
| 死信佇列項目 | \u003c 10 | 失敗重試項目數 |
監控工具
- Prometheus + Grafana - 同步指標視覺化
- Seq - 結構化日誌
- Hangfire Dashboard - 背景任務監控
- 健康檢查端點 -
GET /health/sync
效能指標
目標指標
| 指標 | 目標值 | 說明 |
|---|---|---|
| API 回應時間 | \u003c 200ms | P95 |
| 搜尋查詢 (ES) | \u003c 100ms | Elasticsearch |
| 頁面載入 | \u003c 1s | First Contentful Paint |
| 背景任務 | 30 分鐘內 | 產品匯入完成 |
安全性
認證與授權
- API 金鑰 - GlobalHub API ↔ ProductsAPI 同步認證
- Webhook 簽章 - SERP → GlobalHub API 驗證
- JWT Token - 使用者認證
- HTTPS - 強制加密傳輸
資料保護
- SQL Injection - EF Core 參數化查詢
- XSS - React 自動跳脫
- CSRF - SameSite Cookie
敏感資料管理
- 環境變數 - Docker Secrets
- User Secrets - 本地開發
- Key Vault - 生產環境
未來規劃
短期 (Q1 2026)
- 完成 GlobalHub API 同步架構設計
- 實作 SERP 匯入功能
- 實作區域同步機制
中期 (Q2-Q3 2026)
- 全球訂單交換 (GOX) 系統
- 多區域管理介面
- 進階分析儀表板
長期 (Q4 2026+)
- AI 自動產品重新包裝
- 動態定價引擎
- 區塊鏈訂單追蹤
總結
GlobeConnect Product Hub 是一個採用中央與區域雙層架構的企業級旅遊產品平台:
架構亮點
✅ 中央集權,區域自治 - 統一採購 + 區域運營
✅ 職責清晰分離 - 中央負責採購,區域負責搜尋與訂單
✅ 可擴展性 - 新增區域站點不影響中央架構
✅ 高效能 - Elasticsearch 搜尋在區域層獨立優化
✅ 完整監控 - Prometheus + Grafana + Seq
專案連結
| 專案 | 層級 | GitLab URL |
|---|---|---|
| GlobalHub | 中央 | https://gitlab.com/liongroup/liontech/lionglobal/b2c/globalhub |
| GlobalHub API | 中央 | https://gitlab.com/liongroup/liontech/lionglobal/b2c/globalhubapi |
| ProductsAPI | 區域 | https://gitlab.com/liongroup/liontech/lionglobal/b2c/productsapi |
| ProductBackend | 區域 | https://gitlab.com/liongroup/liontech/lionglobal/b2c/productbackend |
關鍵文件
- 📄 GlobalHub 完整同步架構
- 📄 任務清單
文件版本: 2.0 (更新:中央與區域架構)
維護者: Lion Travel Development Team
最後更新: 2026-02-07