开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:支持ClickHouse

简介: GoWind Admin|风行,企业级中后台框架,集成ClickHouse支持,专为海量数据实时分析打造。开箱即用,提供高性能列式存储、高吞吐写入与毫秒级聚合查询能力,适用于大数据仓库、实时报表等场景,助力企业高效构建数据分析应用。

开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:支持ClickHouse

ClickHouse 是一款由俄罗斯搜索引擎公司 Yandex 开发的开源列式存储数据库,专为海量数据实时分析设计。它以极致的查询性能高吞吐写入能力著称,尤其擅长处理PB 级别的结构化数据,并能在毫秒到秒级内完成复杂的聚合分析(如多维度统计、漏斗计算、用户行为分析等),是大数据分析、数据仓库、实时报表等场景的核心工具。

ClickHouse 的核心概念

概念 说明
表(Table) 类似关系型数据库的表,存储结构化数据,但底层按列存储。
引擎(Engine) 决定表的存储方式、查询特性和分布式行为,是 ClickHouse 的核心设计。例如:
- MergeTree 系列:最常用,支持索引、分区、副本,适合海量数据存储;
- Log 系列:轻量无索引,适合临时小表;
- Distributed:分布式表,用于管理集群分片。
分区(Partition) 按规则(如时间、地区)将表数据拆分,查询时可快速过滤分区,减少扫描范围(如按 “日期” 分区,查询 “2023 年 10 月数据” 仅需扫描对应分区)。
主键(Primary Key) 用于排序和快速查找,不同于关系型数据库的唯一约束,ClickHouse 主键允许重复,主要作用是优化查询性能。
跳数索引(Skip Index) 辅助索引,用于快速判断某一范围内是否存在符合条件的数据(如 “数值是否在 100-200 之间”),进一步减少扫描量。
分片(Shard) 集群中数据的物理拆分单位,每个分片存储表的一部分数据,分布在不同节点,实现并行处理。
副本(Replica) 同一分片的冗余备份,用于故障恢复和负载均衡(查询可分散到不同副本),保证数据不丢失。

ClickHouse 与其他数据库的差异

维度 ClickHouse 传统关系型数据库(如 MySQL) Hadoop 生态(如 Hive)
核心场景 实时海量数据分析(PB 级,毫秒 / 秒级响应) 事务性业务(增删改查,强一致性) 离线批处理分析(TB/PB 级,分钟 / 小时级)
存储方式 列式存储,高压缩 行式存储,压缩率低 列式存储(ORC/Parquet),压缩率高
写入特性 高吞吐,近实时,不支持事务 支持事务,写入性能适中 批处理写入,延迟高
查询性能 极致的聚合查询速度 适合单行 / 小批量查询,复杂分析慢 支持复杂分析,但速度慢(依赖 MapReduce/Spark)
灵活性 不支持行级更新 / 删除,事务弱 支持行级增删改查,事务强 不支持实时更新,灵活性低

Docker部署

docker pull bitnami/clickhouse:latest

docker run -itd \
    --name clickhouse-server \
    --network=app-tier \
    -p 8123:8123 \
    -p 9000:9000 \
    -p 9004:9004 \
    -e ALLOW_EMPTY_PASSWORD=no \
    -e CLICKHOUSE_ADMIN_USER=default \
    -e CLICKHOUSE_ADMIN_PASSWORD=123456 \
    bitnami/clickhouse:latest

在 Go Wind Admin 中使用 ClickHouse

我把ClickHouse的SDK封装了起来,并且提供了配置文件的支持,使用起来非常简单。

ClickHouse支持go的sql标准库更新查询,但是,会有一些限制,比如不支持事务等。所以,想要完整的功能,还是需要使用ClickHouse的官方SDK。因此,我们仅提供了原生的ClickHouse SDK 封装。

首先,我们需要安装库:

go get github.com/tx7do/kratos-bootstrap/database/clickhouse

接着在数据库的配置文件data.yaml中添加ClickHouse的配置:

data:
  clickhouse:
    addresses:
      - "localhost:9000"
    username: "default"
    password: "123456"
    database: "finances"

添加好了配置之后,我们就可以在data包里面创建Clickhouse的客户端了:

package data

import (
    "github.com/tx7do/kratos-bootstrap/database/clickhouse"
)

func NewClickHouseClient(logger log.Logger, cfg *conf.Bootstrap) *clickhouse.Client {
   
    cli, err := clickhouse.NewClient(logger, cfg)
    if err != nil {
   
        return nil
    }
    return cli
}

data/init.go注入到wire:

//go:build wireinject
// +build wireinject

package data

import "github.com/google/wire"

var ProviderSet = wire.NewSet(
    NewClickHouseClient,
)

在这里,我们以股票的K线(蜡烛图)为实例,来讲解如何使用ClickHouse。

首先,定义模型:

package data

import "time"

type Candle struct {
   
    Timestamp *time.Time `json:"timestamp" ch:"timestamp"`
    Symbol    *string    `json:"symbol" ch:"symbol"`
    Open      *float64   `json:"open" ch:"open"`
    High      *float64   `json:"high" ch:"high"`
    Low       *float64   `json:"low" ch:"low"`
    Close     *float64   `json:"close" ch:"close"`
    Volume    *float64   `json:"volume" ch:"volume"`
}

最后,实现CandleRepo

package data

import (
    "github.com/go-kratos/kratos/v2/log"
    "github.com/tx7do/kratos-bootstrap/database/clickhouse"
)

const candleTableName = "candles"

type CandleRepo struct {
   
    client *clickhouse.Client
    log    *log.Helper
}

func NewCandleRepo(logger log.Logger, client *clickhouse.Client) *CandleRepo {
   
    repo := &CandleRepo{
   
        log:    log.NewHelper(log.With(logger, "module", "candle/ck/repo")),
        client: client,
    }

    return repo
}

func (r *CandleRepo) Create(ctx context.Context, req *Candle) error {
   
    if req == nil {
   
        return candleV1.ErrorBadRequest("request data is required")
    }

    err := r.client.Insert(ctx, candleTableName, "", req)
    if err != nil {
   
        r.log.Errorf("create candle failed: %s", err.Error())
        return candleV1.ErrorInternalServerError("create candle failed")
    }
    return nil
}

项目代码

目录
相关文章
|
4月前
|
SQL 存储 关系型数据库
吃透 MySQL 核心
本文深入解析MySQL核心原理与阿里实战调优,涵盖架构分层、索引机制、事务锁、SQL优化及阿里云RDS部署。从底层B+树到高并发调优,助你掌握大厂级数据库技能,轻松应对面试与生产挑战。(239字)
idea提示Your idea evaluation has expired. Your session will be limited to 30 minutes[亲测解决]
解决方法: 在idea中安装插件idea eval Reset,应用市场如果搜不到就安装离线的
2271 0
idea提示Your idea evaluation has expired. Your session will be limited to 30 minutes[亲测解决]
|
10月前
|
NoSQL Redis
跨redis迁移数据的增量迁移方案和工具
面对这个不能完全覆盖的需求,使用RDB备份的需求是无法满足,因为RDB文件会将B的全部数据改为A的数据,显然是不可行的。后来我用了yunedit-redis,这款客户端工具,完美实现了数据的迁移,而且全程都在客户端操作,无需通过编码的方式来实现。
759 1
verbose stack FetchError: request to https://registry.npm.taobao.org/md-editor-v3 failed, reason: ce
这篇文章描述了在安装npm包`md-editor-v3`时遇到的淘宝镜像证书过期问题,并提供了解决方案,即通过切换npm镜像源到`https://registry.npmmirror.com/`来解决安装失败的问题。
verbose stack FetchError: request to https://registry.npm.taobao.org/md-editor-v3 failed, reason: ce
|
消息中间件 Java RocketMQ
Spring Boot与RocketMQ的集成
Spring Boot与RocketMQ的集成
|
存储 消息中间件 缓存
Redis 简介
10月更文挑战第14天
381 58
|
SQL 存储 Java
Java中使用ClickHouseDriver连接和基本操作
通过上述步骤,你可以轻松地在Java应用中集成ClickHouse数据库,执行基本的CRUD操作。需要注意的是,实际开发中应当根据实际情况调整数据库连接配置(如URL中的主机、端口、数据库名等),并根据应用需求选择合适的异常处理策略,确保代码的健壮性和资源的有效管理。此外,对于复杂查询和大批量数据处理,建议充分利用ClickHouse的特性(如分布式处理、列式存储优化等),以进一步提升性能。
1465 2
|
运维 监控 安全
【TiDB原理与实战详解】2、部署与节点的扩/缩容~学不会? 不存在的!
TiUP 是 TiDB 4.0 引入的集群运维工具,TiUP cluster 用于部署、管理 TiDB 集群,支持 TiDB、TiFlash、TiDB Binlog 等组件。本文介绍使用 TiUP 部署生产环境的具体步骤,包括节点规划、工具安装、配置文件修改及集群部署等。同时,提供了常用命令和安全优化方法,并详细说明了如何进行集群的扩缩容操作,以及时区设置等维护工作。
|
JavaScript 应用服务中间件 nginx
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
621 10
|
监控 前端开发 安全
超级炫酷的终端神器 eDEX-UI
超级炫酷的终端神器 eDEX-UI
1499 0