Linux部署Go
Linux部署Gobash一键部署bash地址
下载# 安装wget命令yum install -y wget# 在 ~ 下创建 go 文件夹,并进入 go 文件夹mkdir ~/go && cd ~/go# 下载的 go 压缩包wget https://studygolang.com/dl/golang/go1.17.linux-amd64.tar.gz
解压tar -C /usr/local -zxvf go1.17.0.linux-amd64.tar.gz
添加到环境变量vi /etc/profile# 在/etc/profile最后一行添加export GOROOT=/usr/local/goexport PATH=$PATH:$GOROOT/bin# 保存退出后source一下source /etc/profile
验证GOgo version
linux上运行Gin# 更换代理源export GOPROXY=https://mirrors.aliyun.com/goproxy/# 开启go modexport GO111MODULE=on
进入到Gin ...
整合sql和sqlx
整合sql和sqlxWhat is sqlx
sqlx是Go语言内置database/sql的超集,它在优秀的内置database/sql基础上提供了一组扩展
Get sqlx
go get github.com/jmoiron/sqlx
Prepare sqlxpackage mysqlimport ( "bluebell/setting" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx")var db *sqlx.DB// Init 初始化MySQL连接func Init(cfg *setting.MySQLConfig) (err error) { // "user:password@tcp(host:port)/dbname" dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?parseTime=true&loc=Local" ...
整合限流策略
整合限流策略限流
限流又称为流量控制(流控),通常是指限制到达系统的并发请求数
常用的限流策略漏桶法
漏桶法限流很好理解,假设我们有一个水桶按固定的速率向下方滴落一滴水,无论有多少请求,请求的速率有多大,都按照固定的速率流出,对应到系统中就是按照固定的速率处理请求
uber-go/ratelimit实现
uber-go/ratelimit
Example uber-go/ratelimit// 漏桶法// 定义全局限流器对象var rateLimit ratelimit.Limiter// 在 gin.HandlerFunc 加入限流逻辑func leakyBucket() gin.HandlerFunc { prev := time.Now() return func(c *gin.Context) { now := rateLimit.Take() fmt.Println(now.Sub(prev)) // 为了打印时间间隔 prev = now // 记录上一次的时间,没有这个打印的会有问题 }}f ...
整合管理配置 - viper
整合管理配置 - viper
Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式
viper是一个配置管理的解决方案,它能够从 json,toml,ini,yaml,hcl,env 等多种格式文件中,读取配置内容,它还能从一些远程配置中心读取配置文件,如consul,etcd等;它还能够监听文件的内容变化
读取 json,toml,ini,yaml,hcl,env 等格式的文件内容
读取远程配置文件,如 consul,etcd 等和监控配置文件变化
读取命令行 flag 的值
从 buffer 中读取值
viper 读取配置文件的优先顺序,从高到低,如下:
显式设置的Set函数
命令行参数
环境变量
配置文件
远程k-v 存储系统,如consul,etcd等
默认值
Viper 配置key是不区分大小写的
Famous parsing library
toml :https://github.com/BurntSushi/toml
json :
https://github.com/json-iterator/g ...
整合热加载
整合热加载热加载 和 热部署
热加载:代码进行修改时,程序能重新加载(部分代码),减少手动编译
热部署:代码修改时,程序能重新加载(整个应用或容器),热部署比热加载更为强大
Go实现热加载工具库Air
彩色日志输出
自定义构建或二进制命令
支持忽略子目录
启动后支持监听新目录
更好的构建过程
Get Air
go get -u github.com/cosmtrek/air
How to use Air
进入到项目目录
生成.air.conf文件: 首先在当前目录下查找 .air.conf配置文件,如果找不到就使用默认的air -c .air.conf
air_emxaple.conf:# [Air](https://github.com/cosmtrek/air) TOML 格式的配置文件# 工作目录# 使用 . 或绝对路径,请注意 `tmp_dir` 目录必须在 `root` 目录下root = "."tmp_dir = "tmp"[build]# 只需要写你平常编译使用的shell命令。你也可以使用 `make`# W ...
整合Swagger
整合SwaggerWhat is Swagger
Swagger 是 描述使用JSON表示的RESTful API 接口文档描述语言,实现了自动文档,代码生成和测试用例功能
Get Swagger(Gin)
go get -u github.com/swaggo/swag/cmd/swag
import("github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger")
Prepare Swagger
在根目录执行swag init 生doc文件
在main写入项目介绍 // @title Tets Swaggper项目接口文档// @version 1.0// @description Go web Swagger// @termsOfService http: //swagger.io/terms/// @contact.name Piwriw// @contact.url http://www.swagger.io/support// @contact. ...
自定义业务状态码
自定义业务状态码业务状态码和HTTP状态码
业务状态码:在 REST 接口设计规范中,我们通常都会被引导为这里的 Code 应该是 HTTP 协议状态码 200,404 或者 501 等
HTTP状态码:HTTP 请求状态码是 HTTP 协议的一部分,用于表明 HTTP 响应状态
How to prepare code1. Code业务状态码封装package controllertype ResCode int64const ( CodeSuccess ResCode=1000+iota CodeInvalidParam CodeUserExist CodeUserNotExist CodeInvalidPassword CodeServeBusy)var codeMsgMap=map[ResCode]string{ CodeSuccess: "success", CodeInvalidParam:"请求参数错误", CodeUserExist: "用户已存在", CodeUserNotExist:"用 ...
整合JWT
整合JWTWhat is JWT
JWT 是 JSON Web Token 的缩写,是为了在⽹络应⽤环境间传递声明⽽执⾏的⼀种基于JSON的开放标准((RFC 7519)。JWT 本身没有定义任何技术实现,它只是定义了⼀种基于 Token 的会话管理的规则,涵盖 Token 需要包含的标准内容和 Token 的⽣成过程,特别适⽤于分布式站点的单点登录(SSO)场景
一段JWT Token 由”.”切割成头部、负载、签名三部分
JWT优缺点
JWT 拥有基于 Token 的会话管理⽅式所拥有的⼀切优势,不依赖 Cookie,使得其可以防⽌ CSRF 攻击,也能在禁⽤ Cookie 的浏览器环境中正常运⾏。
⽽ JWT 的最⼤优势是服务端不再需要存储 Session,使得服务端认证鉴权业务可以⽅便扩展,避免存储Session 所需要引⼊的 Redis 等组件,降低了系统架构复杂度。但这也是 JWT 最⼤的劣势,由于有效期存储在 Token 中,JWT Token ⼀旦签发,就会在有效期内⼀直可⽤,⽆法在服务端废⽌,当⽤户进⾏登出操作,只能依赖客户端删除掉本地存储的 JWT Token, ...
整合validation库
整合validation库Background
利用validation库进行对参数校验,减少业务逻辑的手动校验
Get validation
go get github.com/go-playground/validator/v10
validation 配置项目
逗号( ,):把多个验证标记隔开。注意:隔开逗号之间不能有空格, validate:”lt=0,gt=100”,逗号那里不能有空格,否则panic
横线( - ):跳过该字段不验证
竖线( | ):使用多个验证标记,但是只需满足其中一个即可
Tag
Description
Example
required
必填
Field或Struct validate:"required"
omitempty
空时忽略
And more
len
长度
Field validate:”len=0”
eq
等于
Field validate:”eq=0”
gt
大于
Field validate:”gt=0”
gte
大于等于
Fie ...
整合zap日志
数据库(MySql)篇连接数据库 db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/DB_TEST") // 测试连接 db.Ping() // 使用 defer 释放连接 defer db.Close()``` ## insert 插入数据```java db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() defer db.Close() if err != nil { fmt.Println("数据库连接失败!") } _, err := db.Query("INSERT INTO user VALUES(1, 'test')") if err != nil { fmt.Println(err.Error()) ...