# dbproxy **Repository Path**: llyb120/dbproxy ## Basic Information - **Project Name**: dbproxy - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-27 - **Last Updated**: 2025-04-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 数据库代理项目 这是一个用Go语言实现的数据库代理项目,分为服务器和客户端两个部分。服务器通过HTTP接收SQL指令并执行,客户端实现了一个自定义的数据库驱动,通过HTTP请求与服务器通信。此外,项目还支持Redis的TCP代理功能,实现内网穿透。 ## 支持的数据库和服务 目前支持以下数据库和服务: - **MySQL** - 支持完整的事务、预处理语句和标准SQL操作 - **BigQuery** - 支持查询和执行操作,不支持事务 - **Redis** - 支持TCP代理,实现内网穿透 ## 项目结构 ``` dbproxy/ ├── server/ # 服务器端代码 │ ├── main.go # 服务器实现 │ ├── mysql_server.go # MySQL处理 │ ├── bigquery_server.go # BigQuery处理 │ └── redis_server.go # Redis代理实现 └── client/ # 客户端代码 ├── mysql_driver.go # MySQL数据库驱动实现 └── main.go # 客户端示例程序 ``` ## 功能特点 - 服务器通过HTTP接口接收SQL命令并执行 - 客户端提供标准数据库驱动接口 - 支持事务(仅MySQL,使用RequestID维护事务状态) - 支持预处理语句 - 支持查询和执行操作 - 使用统一的接口支持不同的数据库后端 - **Redis TCP代理**支持内网穿透,在本地监听端口并将流量转发到远程Redis服务器 ## 服务器端 服务器端实现了以下功能: 1. 启动HTTP服务接收SQL指令 2. 执行SQL查询并返回结果 3. 管理事务状态(开始、提交、回滚) 4. 处理预处理语句 5. 提供Redis TCP代理服务 ### 配置和启动 服务器支持MySQL、BigQuery和Redis代理配置: ```go config := Config{ // MySQL配置 MySQLEnabled: true, MySQLConnections: map[string]string{ "default": "root:password@tcp(127.0.0.1:3306)/test", }, // BigQuery配置 BigQueryEnabled: false, BigQueryConnections: map[string]BigQueryConnection{ "default": { Project: "your-project-id", Dataset: "your_dataset", CredentialsFile: "credentials.json", }, }, // Redis代理配置 RedisProxyEnabled: true, RedisProxyConfig: RedisProxyConfig{ LocalAddr: ":6380", // 本地监听端口 RemoteAddr: "127.0.0.1:6379", // Redis真实地址 }, HTTPAddr: ":8080", } ``` 根据实际情况修改以上配置,然后运行: ```bash cd server go run *.go ``` ## Redis代理功能 服务器集成了Redis TCP代理功能,可以实现Redis的内网穿透。这个功能使用纯TCP转发,不依赖HTTP API。 ### 如何工作 Redis代理在指定的本地端口上监听TCP连接,当收到连接请求时,会建立到远程Redis服务器的连接,并将两端的数据进行双向转发。 ### 配置说明 在服务器配置中设置Redis代理参数: ```go RedisProxyEnabled: true, // 是否启用Redis代理 RedisProxyConfig: RedisProxyConfig{ LocalAddr: ":6380", // 本地监听地址,如":6380" RemoteAddr: "127.0.0.1:6379", // 远程Redis服务器地址 }, ``` ### 使用方法 1. 在服务器配置中启用Redis代理功能 2. 设置本地监听地址和远程Redis服务器地址 3. 启动服务器后,代理会自动运行 4. 客户端可以直接连接到代理的本地端口 例如,如果代理监听在`localhost:6380`,客户端可以使用以下方式连接: ```bash # 使用redis-cli连接到代理 redis-cli -h localhost -p 6380 # 或在应用程序中连接 redis.NewClient(&redis.Options{ Addr: "localhost:6380", }) ``` 所有请求都会被自动转发到配置的远程Redis服务器。 ## 客户端 客户端提供了一个符合`database/sql/driver`接口的数据库驱动实现,可以像使用普通数据库驱动一样使用它。 ### 驱动注册 驱动已在包初始化函数中自动注册为"mysqlproxy": ```go func init() { sql.Register("mysqlproxy", &MySQLProxyDriver{}) } ``` ### 连接字符串格式 驱动支持以下连接字符串格式: ``` // 默认使用MySQL http://localhost:8080 // 显式指定MySQL mysql://http://localhost:8080 // 指定BigQuery bigquery://http://localhost:8080 ``` ### 使用示例 ```go import ( "database/sql" _ "path/to/client" // 导入数据库代理驱动 ) func main() { // 连接到MySQL代理 db, err := sql.Open("mysqlproxy", "mysql://http://localhost:8080") if err != nil { log.Fatal(err) } defer db.Close() // 使用标准database/sql接口进行操作 rows, err := db.Query("SELECT * FROM users") // ... // 或者连接到BigQuery代理 bqdb, err := sql.Open("mysqlproxy", "bigquery://http://localhost:8080") if err != nil { log.Fatal(err) } defer bqdb.Close() // 查询公共数据集 rows, err := bqdb.Query("SELECT name FROM bigquery-public-data.usa_names.usa_1910_2013 LIMIT 10") // ... } ``` ## 功能演示 客户端示例程序展示了以下功能的使用: ### MySQL 1. 基本查询操作 2. 使用预处理语句插入数据 3. 事务处理(提交和回滚) ### BigQuery 1. 基本查询操作 2. 查询公共数据集 3. 创建和查询临时表 运行示例程序: ```bash # MySQL示例 cd client go run main.go # BigQuery示例 cd client go run main.go bigquery ``` ## 注意事项 1. 服务器需要有权限连接到MySQL、BigQuery或Redis 2. 客户端需要能够访问服务器的HTTP端口和Redis代理端口 3. 本项目适用于内网环境,默认不包含身份验证机制 4. 所有SQL参数都通过JSON序列化传输,某些复杂的数据类型可能需要特殊处理 5. BigQuery不支持事务,如尝试在BigQuery模式下使用事务将返回错误 6. Redis代理仅提供TCP层面的数据转发,不处理Redis协议内容