ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

GoFr 如何连接 Cassandra:环境变量配置、驱动注入与 CQL 查询

GoFr 如何连接 Cassandra:环境变量配置、驱动注入与 CQL 查询 GoFr 如何连接 Cassandra环境变量配置、驱动注入与 CQL 查询【免费下载链接】gofrAn opinionated GoLang framework for accelerated microservice development. Built in support for databases and observability.项目地址: https://gitcode.com/GitHub_Trending/go/gofr如果你要在一个 Go 微服务中读写 Apache Cassandra又不想自己处理驱动初始化、认证、日志与埋点GoFr 提供了一个可插拔的 Cassandra 数据源通过app.AddCassandra()注入一个实现了 GoFr 接口的驱动客户端之后就能在 handler 里直接执行 CQL 查询。本文基于 Cassandra 数据源文档 和仓库内的驱动实现pkg/gofr/datasource/cassandra/cassandra.go走一遍“配置环境变量 → 注入驱动 → 执行 CQL → 验证连接”的完整路径。环境变量配置GoFr 通过环境变量管理配置见 配置文档。连接 Cassandra 需要提供以下 5 个变量定义来自 Cassandra 文档变量含义HOSTSCassandra 服务器的主机名或 IP 地址KEYSPACE键空间名类似“数据库”存放表并定义复制与持久性设置PORT端口号USERNAME连接数据库的用户名PASSWORD对应用户的密码GoFr 的约定是在项目根目录创建configs目录并放置.env文件再用APP_ENV决定叠加哪个环境文件如APP_ENVdev时加载configs/.env再叠加configs/.dev.env# configs/.env HOSTSlocalhost KEYSPACEtest_keyspace PORT9042 USERNAMEcassandra PASSWORDcassandra多节点说明驱动实现中HOSTS会被按逗号拆分后传入 gocql 的集群配置pkg/gofr/datasource/cassandra/internal.go 中hosts : strings.Split(config.Hosts, ,)因此多节点时可以用逗号分隔的形式填写多个地址。安装驱动并注入到 AppGoFr 对 Cassandra 定义了一套接口QueryWithCtx、ExecWithCtx、ExecCASWithCtx、NewBatchWithCtx及批量操作接口任何遵守该接口的驱动都能接入。官方外部驱动通过 Go module 安装go get gofr.dev/pkg/gofr/datasource/cassandralatest该驱动模块要求 Go 1.26见 pkg/gofr/datasource/cassandra/go.mod底层使用github.com/gocql/gocqlv1.7.0。注入代码的核心部分import ( gofr.dev/pkg/gofr cassandraPkg gofr.dev/pkg/gofr/datasource/cassandra ) config : cassandraPkg.Config{ Hosts: app.Config.Get(HOSTS), Keyspace: app.Config.Get(KEYSPACE), Port: app.Config.GetInt(PORT), // 见下文类型说明 Username: app.Config.Get(USERNAME), Password: app.Config.Get(PASSWORD), } cassandra : cassandraPkg.New(config) app.AddCassandra(cassandra)这里要留意一个类型问题cassandraPkg.Config的Port字段是int定义见 cassandra.go而 GoFr 的Config接口只提供Get(string) stringpkg/gofr/config/config.go。Cassandra 文档示例 中直接写了Port: app.Config.Get(PORT)按 Go 的类型规则这段无法通过编译。上面代码块中的app.Config.GetInt(PORT)是为保证可编译而做的等价替换——如果你的版本没有GetInt请自行将app.Config.Get(PORT)的字符串结果转为int例如用标准库strconv.Atoi再赋值。AddCassandra会替你完成两件容易遗漏的事实现见 pkg/gofr/external_db.goinstrumentDatasource通过鸭子类型自动为驱动挂载应用级的 Logger、Metrics 和名为gofr-cassandra的 OpenTelemetry Tracer自动调用驱动的Connect()建立会话并注册app_cassandra_stats直方图指标Cassandra 查询响应时间单位微秒。所以注入后不需要再手动调用Connect()。执行 CQL 查询下面是文档给出的完整示例来自 Cassandra 文档仅将上文说明的Port类型问题做了替换。persons表需在目标键空间中已存在。package main import ( gofr.dev/pkg/gofr cassandraPkg gofr.dev/pkg/gofr/datasource/cassandra ) type Person struct { ID int json:id,omitempty Name string json:name Age int json:age // db tag specifies the actual column name in the database State string json:state db:location } func main() { app : gofr.New() config : cassandraPkg.Config{ Hosts: app.Config.Get(HOSTS), Keyspace: app.Config.Get(KEYSPACE), Port: app.Config.GetInt(PORT), // 见前文类型说明 Username: app.Config.Get(USERNAME), Password: app.Config.Get(PASSWORD), } cassandra : cassandraPkg.New(config) app.AddCassandra(cassandra) app.POST(/user, func(c *gofr.Context) (any, error) { person : Person{} err : c.Bind(person) if err ! nil { return nil, err } err c.Cassandra.ExecWithCtx(c, INSERT INTO persons(id, name, age, location) VALUES(?, ?, ?, ?), person.ID, person.Name, person.Age, person.State) if err ! nil { return nil, err } return created, nil }) app.GET(/user, func(c *gofr.Context) (any, error) { persons : make([]Person, 0) err : c.Cassandra.QueryWithCtx(c, persons, SELECT id, name, age, location FROM persons) return persons, err }) app.Run() }字段映射规则查询结果按列名匹配结构体字段字段上的dbtag 指定数据库列名如示例中State对应列location没有dbtag 时字段名会转成 snake_case 匹配列名实现见 cassandra.go 中的getFieldNameIndex。除ExecWithCtx写入/执行和QueryWithCtx查询支持扫到*[]Struct、*Struct外接口还提供ExecCASWithCtx执行带IF子句的轻量级事务查询返回applied bool和错误批量操作NewBatchWithCtx(ctx, name, batchType)创建名为name的批次BatchQueryWithCtx向批次追加语句ExecuteBatchWithCtx提交。批次类型常量为LoggedBatch、UnloggedBatch、CounterBatch定义见 cassandra.go传其他值会返回errUnsupportedBatchType。批量查询会先校验批次名是否存在未创建则返回“batch not initialized”错误。验证连接是否成功有三个文档/实现中明确的验证手段启动日志。连接成功时驱动会打印connected to test_keyspace keyspace at host localhost and port 9042注意这是基于 cassandra.go 中connected to %s keyspace at host %s and port %d日志模板、用本文环境值填充出的示例输出。连接失败时打印error connecting to Cassandra: 底层驱动返回的错误失败不会让进程退出驱动只记录错误并保持会话为空后续查询/健康检查会反映故障。健康检查。驱动实现了HealthCheckcassandra.go内部执行SELECT now() FROM system.local。会话为空时返回状态DOWN、message 为cassandra not connected查询失败时返回DOWN并附带错误信息成功则返回UP以及host、keyspace两个 detail。GoFr 应用默认暴露健康检查端点可通过它确认 Cassandra 数据源状态。指标。每次查询会记录app_cassandra_stats直方图带hostname与keyspace标签可结合应用的 metrics 端点确认查询确实经过驱动执行。限制与边界连接失败不阻断启动Connect()出错只记日志cassandra.go需要靠健康检查和日志发现。认证方式固定为用户名/密码驱动内部使用gocql.PasswordAuthenticator配置里没有 TLS、超时等扩展项文档未覆盖更多集群级调优选项。QueryWithCtx的目标必须是指针且最终类型是切片或结构体否则驱动返回错误errDestinationIsNotPointer/errUnexpectedPointer。驱动接口面向 Cassandra 语义ExecCASWithCtx的目标不能是切片或 map对应errUnexpectedSlice/errUnexpectedMap。参考文档docs/datasources/cassandra/page.md、docs/quick-start/configuration/page.md驱动实现位于 pkg/gofr/datasource/cassandra。【免费下载链接】gofrAn opinionated GoLang framework for accelerated microservice development. Built in support for databases and observability.项目地址: https://gitcode.com/GitHub_Trending/go/gofr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进