Overview

digraph LambdaArchitecture {
    // 全局属性设置
    rankdir=LR;
    node [shape=box, style=filled, fontname="Microsoft YaHei", fontsize=10, margin="0.15,0.08"];
    edge [fontname="Microsoft YaHei", fontsize=9, color="#555555"];

    // 定义颜色风格
    // 蓝色:交互/应用
    // 橙色/黄色:调度/同步/可视化
    // 绿色:数据缓冲/计算/缓存
    // 灰色:日志采集
    // 黑色/黄色:离线数仓集群

    // ================= 1. 数据源与接入层 =================
    subgraph cluster_source {
        label="数据源与接入";
        fontname="Microsoft YaHei";
        style=dashed;
        color="#4A90E2";

        WebApp1 [label="Web/App 业务交互", fillcolor="#4A90E2", fontcolor="white"];
        WebApp2 [label="Web/App 前端埋点 用户行为数据", fillcolor="#4A90E2", fontcolor="white"];

        Nginx1 [label="Nginx", fillcolor="#F5A623"];
        Nginx2 [label="Nginx", fillcolor="#F5A623"];

        WebApp1 -> Nginx1;
        WebApp2 -> Nginx2;
    }

    // ================= 2. 业务服务与日志服务 =================
    subgraph cluster_server {
        label="业务服务与日志服务";
        fontname="Microsoft YaHei";
        style=dashed;
        color="#4A90E2";

        Springboot1 [label="业务服务器\n(Springboot)", fillcolor="#4A90E2", fontcolor="white"];
        Springboot2 [label="业务服务器\n(Springboot)", fillcolor="#4A90E2", fontcolor="white"];

        LogServer1 [label="日志服务器\n(文件)(Springboot)", fillcolor="#4A90E2", fontcolor="white"];
        LogServer2 [label="日志服务器\n(文件)(Springboot)", fillcolor="#4A90E2", fontcolor="white"];

        LogFile1 [label="日志文件\nlogFile", fillcolor="#D3D3D3"];
        LogFile2 [label="日志文件\nlogFile", fillcolor="#D3D3D3"];

        Nginx1 -> Springboot1;
        Nginx1 -> Springboot2;
        Nginx2 -> LogServer1;
        Nginx2 -> LogServer2;

        LogServer1 -> LogFile1;
        LogServer2 -> LogFile2;
    }

    // ================= 3. 消息队列与同步层 =================
    subgraph cluster_mq {
        label="消息队列与同步层";
        fontname="Microsoft YaHei";
        style=dashed;
        color="#7ED321";

        MySQL [label="业务数据\nMySQL", fillcolor="#7ED321"];
        Maxwell [label="增量同步\nMaxwell", fillcolor="#F5A623"];

        Kafka [label="消息缓存\nKafka集群", fillcolor="#7ED321"];
        ZK [label="分布式协调\nZookeeper", fillcolor="#4A90E2", fontcolor="white"];

        FlumeCollect1 [label="采集日志\nFlume", fillcolor="#9B9B9B"];
        FlumeCollect2 [label="采集日志\nFlume", fillcolor="#9B9B9B"];

        FlumeConsume1 [label="业务消费\nFlume", fillcolor="#9B9B9B"];
        FlumeConsume2 [label="日志消费\nFlume", fillcolor="#9B9B9B"];

        Springboot1 -> MySQL;
        Springboot2 -> MySQL;
        MySQL -> Maxwell -> Kafka;

        LogFile1 -> FlumeCollect1 -> Kafka;
        LogFile2 -> FlumeCollect2 -> Kafka;
        ZK -> Kafka;

        Kafka -> FlumeConsume1;
        Kafka -> FlumeConsume2;
    }

    // ================= 4. 调度中心 =================
    Scheduler [label="定时调度\nDolphinScheduler", fillcolor="#F5A623"];
    DataX1 [label="每日全量\nDataX", fillcolor="#F5A623"];
    Scheduler -> DataX1;

    // ================= 5. 离线数仓 =================
    subgraph cluster_offline {
        label="离线数仓";
        fontname="Microsoft YaHei";
        style=dashed;
        color="#F5A623";
        rankdir=TB;

        Hadoop [label="集群存储\nHadoop", fillcolor="#000000", fontcolor="white"];

        ODS [label="原始数据层\nODS层", fillcolor="#000000", fontcolor="white"];
        DIM [label="公共维度层\nDIM层", fillcolor="#F5A623"];
        DWD [label="明细数据层\nDWD层", fillcolor="#F5A623"];
        DWS [label="汇总数据层\nDWS层", fillcolor="#4A90E2", fontcolor="white"];
        ADS [label="数据应用层\nADS层", fillcolor="#7ED321"];

        DataX1 -> Hadoop;
        FlumeConsume1 -> Hadoop;
        FlumeConsume2 -> Hadoop;

        Hadoop -> ODS -> DIM -> DWD -> DWS -> ADS;
    }

    // ================= 6. 实时数仓 =================
    subgraph cluster_realtime {
        label="实时数仓";
        fontname="Microsoft YaHei";
        style=dashed;
        color="#BD10E0";
        rankdir=TB;

        Flink [label="Flink", fillcolor="#7ED321"];
        Redis [label="旁路缓存\nRedis", fillcolor="#7ED321"];
        HBase [label="维度数据\nPhoenix + HBase", fillcolor="#4A90E2", fontcolor="white"];
        ClickHouse [label="查询宽表\nClickHouse", fillcolor="#F8E71C"];

        Kafka -> Flink;
        Flink -> Redis [dir=both, label=" "];
        Flink -> HBase [label="查询维度数据", color="#D0021B", fontcolor="#D0021B"];
        Flink -> ClickHouse [label="查询维度数据", color="#D0021B", fontcolor="#D0021B"];
    }

    // ================= 7. 数据应用与可视化层 =================
    subgraph cluster_app {
        label="数据应用与可视化";
        fontname="Microsoft YaHei";
        style=dashed;
        color="#F5A623";

        DataX2 [label="每日同步\nDataX", fillcolor="#F5A623"];
        ResultMySQL [label="结果数据\nMySQL", fillcolor="#4A90E2", fontcolor="white"];
        Superset [label="离线可视化\nSuperset", fillcolor="#F5A623"];

        SpringAPI [label="SpringBoot 数据\n接口服务", fillcolor="#4A90E2", fontcolor="white"];
        Sugar [label="实时可视化\nSugar", fillcolor="#F5A623"];

        ADS -> DataX2 -> ResultMySQL -> Superset;
        ClickHouse -> SpringAPI -> Sugar;
    }
}
@startuml
Alice -> Bob : start checking weather
loop
  Bob -> WeatherAPI : check weather
  WeatherAPI --> Bob : weather status
  alt rain
    Bob -> Alice : It's raining, staying at home
    break count >= 5
    Bob -> Alice : Bye!
    end
  else no rain
    Bob -> Alice : It's sunny, going out
  end
end
@enduml