Gin框架(八):中间件

中间件(英语:Middleware),又译中间件、中介层,是一类提供系统软件和应用软件之间连接、便于软件各部件之间的沟通的软件,应用软件可以借助中间件在不同的技术架构之间共享信息与资源。

1.介绍

在Gin框架中,中间件本质上是gin.HandlerFunc 函数,如果我们要自定义中间件,只需要返回类型是gin.HandlerFunc 即可。

Gin框架(七):文件上传

1.介绍

在Gin框架中已经支持文件上传,包括单文件上传和多文件上传。

2. 单文件上传

在Gin框架中可以通过FormFile("param")来接收上传的单个文件信息,具体使用参考下面代码:

Gin框架(四):路由组

1.什么是路由组?

从字面意思理解,路由组指的就是一组路由。那么什么样的路由可以归类到一组呢?在实际使用中,比较常见的场景的是根据版本分组。比如下图

image-20210427215858441

2.使用语法

在Gin框架中提供了一个函数Group可以将路由进行分组管理。使用语法如下:

Gin框架(三):路由初使用

1.介绍

Gin框架的路由功能是基于httprouter(https://github.com/julienschmidt/httprouter)设计的,httprouter是一个由golang实现的路由组件。httprouter使用基数树(也叫基数特里树或压缩前缀树)这种数据结构来维护映射路由关系,通过前缀树快速路由。同时其里面的HttpRouter结构体实现了golang的net.http.server的Handler接口,可以作为httpHandle发布。

基数树(Radix Tree)又称为PAT位树(Patricia Trie or crit bit tree),是一种更节省空间的前缀树(Trie Tree)。对于基数树的每个节点,如果该节点是唯一的子树的话,就和父节点合并。

Gin框架(二):启动流程分析

1.启动服务

1.1 服务源码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main
// 引入gin框架
import "github.com/gin-gonic/gin"
func main() {
	// 创建一个默认的路由引擎
	engine := gin.Default()
	// 注册Get路由
	engine.GET("/", func(ctx *gin.Context) {
		ctx.JSON(200,gin.H{
			"msg":"请求成功",
		})
	})
  // 默认监听的是 0.0.0.0:8080
	_ = engine.Run()
}

1.2 启动输出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
➜ go run main.go 
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /                         --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080

2.代码分析

2.1 import “github.com/gin-gonic/gin”

在引入Gin框架时,包内相关的init()方法都会被执行;经查找发现下面两个init方法;

Gin框架(一):快速入门

1.什么是Gin

Gin 是一个用Go (Golang)编写的 开源web 框架。 目前在GitHub Start 47.4K, 它是一个类似于 martini 但拥有更好性能的 API 框架,路由解析由于使用的是httprouter,速度提高了近 40 倍。

基金分析系统(六):通过docker-compose项目部署

1.项目目录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
├── Dockerfile  # dockerFile文件
├── config-dev.yaml # dev环境配置文件
├── config-local.yaml # 本地测试文件 
├── docker-compose.yaml # docker-compose文件
├── .env # 环境变量文件
....
├── go.mod
├── go.sum
├── logs
├── main.go

2. 新增dockerfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
FROM golang:1.16.9-stretch AS builder

# 环境变量
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY="https://goproxy.cn,direct"

# 切换到工作目录
WORKDIR /build

# 将代码复制到容器中
COPY . .

# 下载依赖
RUN go mod download

# 编译成二进制文件,二进制文件名:app
RUN go build -o app .


### --------- 二阶段,构建一个小镜像 ---------
FROM registry.cn-beijing.aliyuncs.com/liuqinghui/go-env:stretch-slim

# 项目目录
WORKDIR /www

## 复制配置文件
ARG APP_ENV
COPY ./config-${APP_ENV}.yaml /www/config.yaml

# 从builder镜像中把二进制文件/build/app 拷贝到当前目录
COPY --from=builder /build/app /www

3. 新增docker-compose.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
version: '3'
networks:
  backend:
    driver: ${NETWORKS_DRIVER}
services:
  app:
    build:
      context: .
      args:
        - APP_ENV=${APP_ENV}
    command: sh -c "./app -c ./config.yaml"
    volumes:
      - ${PROJECT_PATH}/config-${APP_ENV}.yaml:/www/config.yaml
      - ${LOG_PATH}/logs:/www/logs
    ports:
      - "${APP_PORT}:8088"

4. 新增环境变量文件.env

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 项目地址(绝对路径)
PROJECT_PATH=..
# 日志目录
LOG_PATH=
# 网络
NETWORKS_DRIVER=bridge
# 环境
APP_ENV=local
# 端口
APP_PORT=8081

5.编译docker-compose build

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
➜ docker-compose build
WARNING: Some networks were defined but are not used by any service: backend
Building app
Step 1/11 : FROM golang:1.16.9-stretch AS builder
 ---> 8a22bd5879d4
Step 2/11 : ENV GO111MODULE=on     CGO_ENABLED=0     GOOS=linux     GOARCH=amd64     GOPROXY="https://goproxy.cn,direct"
 ---> Using cache
 ---> f1201d2611b7
Step 3/11 : WORKDIR /build
 ---> Using cache
 ---> 7e157372b7c9
Step 4/11 : COPY . .
 ---> 515c90ffcd8d
Step 5/11 : RUN go mod download
 ---> Running in 0a52cfdd5444
Removing intermediate container 0a52cfdd5444
 ---> 6f5f983a8fd5
Step 6/11 : RUN go build -o app .
 ---> Running in a76302af8f8e
Removing intermediate container a76302af8f8e
 ---> 7195b4de462c
Step 7/11 : FROM registry.cn-beijing.aliyuncs.com/liuqinghui/go-env:stretch-slim
 ---> f9204dd33156
Step 8/11 : WORKDIR /www
 ---> Using cache
 ---> b87192a29265
Step 9/11 : ARG APP_ENV
 ---> Using cache
 ---> fad4cc8a171b
Step 10/11 : COPY ./config-${APP_ENV}.yaml /www/config.yaml
 ---> Using cache
 ---> bc7e2bb9dfcb
Step 11/11 : COPY --from=builder /build/app /www
 ---> 951dce0d6536
Successfully built 951dce0d6536
Successfully tagged fund-server_app:latest

6.运行docker-compose up -d

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 运行
➜ docker-compose up -d
WARNING: Some networks were defined but are not used by any service: backend
fund-server_app_1 is up-to-date

# 查看日志
➜ docker-compose logs
WARNING: Some networks were defined but are not used by any service: backend
Attaching to fund-server_app_1
app_1  | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
app_1  |  - using env:	export GIN_MODE=release
app_1  |  - using code:	gin.SetMode(gin.ReleaseMode)
app_1  |
app_1  | [GIN-debug] GET    /system/config            --> shershon1991/fund-analye-system/api/demo.GetConfig (3 handlers)
app_1  | [GIN-debug] POST   /demo/user/login          --> shershon1991/fund-analye-system/api/demo.Login (3 handlers)
app_1  | 【 当前环境: dev 当前版本: v1.0.0 接口地址: http://0.0.0.0:8081 启动时间:2021-10-18 22:10:23 】

7. 踩坑记录connect: no route to host

启动容器后,在容器内访问本地mysql报错: connect: no route to host