[sponge](https://github.com/zhufuyi/sponge) 是一个集成了自动生成代码、gin框架和一些常用流行库的生产力工具。sponge拥有丰富的生成代码命令,生成不同的功能代码可以组合成完整的服务(类似人为打散的海绵细胞可以自动重组成一个新的海绵)。代码解耦模块化设计,很容易构建出从开发到部署的完整工程项目,让你开发web服务项目轻而易举、事半功倍,使用go也可以"低代码开发"。
Github地址: [https://github.com/zhufuyi/sponge](https://github.com/zhufuyi/sponge)
<br>
### 特点
- **使用简单**:使用UI界面操作,简单易用。
- **web框架**:内置了 Gin 框架和常用的中间件(日志、request_id、jwt鉴权、限流、熔断、链路跟踪、指标采集等)
- **自动生成代码**:根据sql或protobuf和参数生成不同功能代码,例如生成web服务代码、handler(CRUD)代码、dao(CRUD)代码、model代码、redis缓存代码等。
- **代码解耦可扩展**:所有生成的代码都可以无缝衔接,不需要手动调整代码,支持自动合并新增模板代码,实现api接口"低代码开发"。
- **高可靠**:服务代码解耦模块化设计,代码经过严格的测试,并遵循良好的编码规范。
- **高性能**:在单台服务器中的实际业务中压测获取数据api接口轻松过万qps。
- **部署简单**:支持一键部署到服务器、docker、k8s上。
<br>
### 优势
- **提高开发效率**:通过生成代码来提高开发效率,省去大量手写代码的时间。
- **降低开发成本**:集成了 gin 、gorm、go-redis 等流行库和生成代码功能,只需专注编写业务逻辑代码,可以快速开发高性能高可靠 web 服务,降低开发成本。
- **提高开发质量**:开发项目简单化、标准化,生成的代码包括了测试用例。
<br>
### 功能
sponge包含丰富的组件(按需使用):
- Web 框架 [gin](https://github.com/gin-gonic/gin)
- 配置解析 [viper](https://github.com/spf13/viper)
- 配置中心 [nacos](https://github.com/alibaba/nacos)
- 日志 [zap](https://github.com/uber-go/zap)
- 数据库组件 [gorm](https://github.com/go-gorm/gorm)
- 缓存组件 [go-redis](https://github.com/go-redis/redis), [ristretto](https://github.com/dgraph-io/ristretto)
- 自动化api接口文档 [swagger](https://github.com/swaggo/swag), [protoc-gen-openapiv2](https://github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2)
- 鉴权 [jwt](https://github.com/golang-jwt/jwt)
- 校验 [validator](https://github.com/go-playground/validator)
- 消息组件 [rabbitmq](https://github.com/rabbitmq/amqp091-go)
- 分布式事务管理器 [dtm](https://github.com/dtm-labs/dtm)
- 自适应限流 [ratelimit](https://github.com/zhufuyi/sponge/tree/main/pkg/shield/ratelimit)
- 自适应熔断 [circuitbreaker](https://github.com/zhufuyi/sponge/tree/main/pkg/shield/circuitbreaker)
- 链路跟踪 [opentelemetry](https://github.com/open-telemetry/opentelemetry-go)
- 监控 [prometheus](https://github.com/prometheus/client_golang/prometheus), [grafana](https://github.com/grafana/grafana)
- 服务注册与发现 [etcd](https://github.com/etcd-io/etcd), [consul](https://github.com/hashicorp/consul), [nacos](https://github.com/alibaba/nacos)
- 自适应采集 [profile](https://go.dev/blog/pprof)
- 资源统计 [gopsutil](https://github.com/shirou/gopsutil)
- 代码质量检查 [golangci-lint](https://github.com/golangci/golangci-lint)
- 持续集成部署 CICD [jenkins](https://github.com/jenkinsci/jenkins), [docker](https://www.docker.com/), [kubernetes](https://github.com/kubernetes/kubernetes)
<br>
### 目录结构
生成的服务代码目录结构遵循 [project-layout](https://github.com/golang-standards/project-layout),代码目录结构如下所示:
```bash
.
├── api # proto文件和生成的*pb.go目录
├── assets # 其他与资源库一起使用的资产(图片、logo等)目录
├── cmd # 程序入口目录
├── configs # 配置文件的目录
├── deployments # IaaS、PaaS、系统和容器协调部署的配置和模板目录
├── docs # 设计文档和界面文档目录
├── internal # 私有应用程序和库的代码目录
│ ├── cache # 基于业务包装的缓存目录
│ ├── config # Go结构的配置文件目录
│ ├── dao # 数据访问目录
│ ├── ecode # 自定义业务错误代码目录
│ ├── handler # http的业务功能实现目录
│ ├── model # 数据库模型目录
│ ├── routers # http路由目录
│ ├── rpcclient # 连接grpc服务的客户端目录
│ ├── server # 服务入口,包括http等
│ └── types # http的请求和响应类型目录
├── pkg # 外部应用程序可以使用的库目录
├── scripts # 用于执行各种构建、安装、分析等操作的脚本目录
├── test # 额外的外部测试程序和测试数据
└── third_party # 外部帮助程序、分叉代码和其他第三方工具
```
<br>
### 快速开始
#### 安装sponge
支持在windows、mac、linux、docker环境下安装sponge,点击查看[安装sponge说明](https://github.com/zhufuyi/sponge/blob/main/assets/install-cn.md)。
#### 启动UI服务
安装完成后,启动sponge UI服务:
```bash
sponge run
```
在本地浏览器访问 `http://localhost:24631`,进入sponge的UI界面,点击左边菜单栏【SQL】--> 【创建web服务】,填写`mysql dsn地址`,点击`获取表名`,然后选择表名(可多选),接着填写其他参数,鼠标放在问号`?`位置查看参数说明,填写完参数后,点击按钮`下载代码`生成web服务完整项目代码,如下图所示:
![web-http.png](https://static.golangjob.cn/240125/aef06c21ff1b9205d86d049affb11e2e.png)
解压代码,打开终端,切换到代码目录,执行命令:
```bash
# 生成swagger文档
make docs
# 编译和运行服务
make run
```
在浏览器打开 [http://localhost:8080/swagger/index.html](http://localhost:8080/swagger/index.html),在页面上进行增删改查、自定义条件分页查询的api接口测试,如下图所示:
![web-http-swagger.png](https://static.golangjob.cn/240125/5cc264e3451f930b52e52c185e6d0e40.png)
就这样在UI界面生成代码和几行命令就完成了一个简单的web服务开发,随着业务增加,需要添加更多mysql表的增删改查接口,在sponge的UI界面,点击左边菜单栏【Public】--> 【生成handler CRUD代码】,填写参数,然后点击按钮`下载代码`。
![web-http-handler.png](https://static.golangjob.cn/240126/af5cd441bcd4cb87a4347b83f6c43dd5.png)
解压代码,把internal目录移动到web服务目录代码中,然后执行同样的命令:
```bash
# 生成swagger文档
make docs
# 编译和运行服务
make run
```
接着在浏览器打开 [http://localhost:8080/swagger/index.html](http://localhost:8080/swagger/index.html)进行新增的api接口测试。
<br>
### sponge开发文档
更多使用sponge开发web项目的详情,点击查看[sponge开发文档](https://go-sponge.com/zh-cn/web-development-mysql)。
<br>
### 使用示例
- [web-gin-CRUD](https://github.com/zhufuyi/sponge_examples/tree/main/1_web-gin-CRUD)
- [web-gin-protobuf](https://github.com/zhufuyi/sponge_examples/tree/main/3_web-gin-protobuf)
<br>
### 视频教程
- [一键生成web服务完整项目代码](https://www.bilibili.com/video/BV1RY411k7SE/)
- [批量生成CRUD接口代码到web服务](https://www.bilibili.com/video/BV1AY411C7J7/)
- [一键生成通用的web服务项目代码](https://www.bilibili.com/video/BV1CX4y1D7xj/)
- [批量生成任意API接口代码到web服务](https://www.bilibili.com/video/BV1P54y1g7J9/)
<br>
### 结语
sponge是一个让开发者轻松快速开发web应用的好帮手,通过自动生成代码减少人工编写大量代码,让开发者只需专注编写业务逻辑代码,甚至实现零代码开发,极大提高了开发效率和降低了开发项目周期。开发者使用sponge在不同业务开发的web服务已在生产环境中稳定运行,如果你正在寻找高效率开发web服务框架,sponge是一个不错的选择。
<br>
<br>
有疑问加站长微信联系(非本文作者)