菜鸟(指我😄)
- github.com/zbs-test/go_mods_with_gin
这是go 工程化实践(测试版)
使用lapce了
ch1
- what have I done
- 使用gin框架,go-1.20
mkdir ch1 && cd ch1
go mod init ch1
# go install 是安装到~/go/bin下
go get -u github.com/gin-gonic/gin
- main.go
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
//定义路由的GET方法及响应处理函数
r.GET("/hello", func(c *gin.Context) {
//将发送的信息封装成JSON发送给浏览器
c.JSON(http.StatusOK, gin.H{
//这是我们定义的数据
"message": "快速入门",
})
})
r.Run() //默认在本地8080端口启动服务
}
- download and run
go mod tidy
go mod vendor
go run main.go
# another shell
curl localhost:8080/hello
ch2
- what have I done
- restful api
GET用来获取资源
POST用来新建资源
PUT用来更新资源
DELETE用来删除资源
GET /student 查询学生信息
POST /create_student 创建学生信息
PUT /updata_student 更新学生信息
DELETE /delete_student 删除学生信息
- 简单实现restful api(main.go)
- 使用curl来模拟postman
# get
curl localhost:8080/student
# post 这里没有要传输的数据, 使用 -F "name=<something>" -F "email=qa@qq.com"来传值
curl localhost:8080/create_student
# put
curl -X PUT localhost:8080/update_student
# delete -v 是显示更多请求的信息
curl -v -X DELETE localhost:8080/delete_student
ch3
- what have I done
- 前面步骤类似,创建要渲染html页面
mkdir templates && touch index.html
- 运行和查看/index
- 自己创建页面和展示,使用数据绑定
ch4
- what have I done
- 获取url请求的参数,参数是使用?和&隔开,这里不再用curl,用浏览器
- localhost:8080/?name=admin&pwd=123456
- 页面呈现你的请求参数
ch5
- what have I done
- 获得Form表单的请求参数数据
- 在login.html实现登陆逻辑代码,涉及到input submit,和页面跳转(未实现)
- 在index.html实现渲染username,password(未实现)
ch5-1
- templates 多层目录的渲染方式
- LoadHTMLGlob templates/**/* {{define “user/index.html”}} {{end}} . “data”:
- 更多渲染指令(模版语法):
{{.title}}
{{$t := .title}} //将.title赋值给$t
{{$t}} //输出$t
// 逻辑判断
{{if gt .score 90}} ...html标签
{{ else if gt .score 80 }} ...
{{else}} ...
{{end}}
// 循环遍历
{{range $key, $value := .hobbies}} // .hobbies在后台是数组
<li>{{$key}} is {{$value}}</li>
{{else}} ...
{{end}}
// 解绑后台传到前台的结构体字段
{{with .user}} // user在后台是一个结构体
{{.Name}}
...
{{end}}
// 内置函数
{{len .somethins}} //
// 自定义模版函数
! 在main方法下加入配置 `r.SetFuncMap(template.FuncMap{
"UnixToTime":UnixToTime,
})` 和在main函数上面定义这个UnixToTime函数 (注册函数)
---
// 子模版(公共模版)定义和导入
1. 定义 {{define "public/te1.html"}} ...html {{end}}
2. 引入 {{template "public/te1.html" .}} //注意 `.`
// 配置静态文件
! main方法下 r.Static("/static","./static") // url request router , local static file path
ch6
- what I have done
- 实现url动态传参
- 浏览器输入: localhost:8080/user/
ch7
- what I have done
- 路由组的实现,统一处理路由,保持美观
- curl请求
curl -X GET localhost:8080/index
curl -X POST localhost:8080/login
- 注释和实现路由嵌套,按标注的方法查询
ch8
- what I have done
中间件:在处理请求的过程中,加入钩子函数,这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登陆认证,权限校验,记录日志等。具体使用方法如下
- 实现中间件, 做请求耗时统计
- 注释看第二段代码
当在中间件或 handler 中启动新的 Goroutine 时,不能使用原始的上下文,必须使用只读副本。(我不会)
ch9
- what I have done
- gin 参数绑定
为了能够更方便的获取请求相关参数,提高开发效率,我们可以使用ShouldBind,它能够基于请求自动提取JSON,Form表单,Query等类型的值,并把值绑定到指定的结构体对象,具体使用方法如下
- 创建查询: localhost:8080/user?username=good&password=123
- 查看后台的获取数据
ch10(已略过)
- what I have done
- 实现简单的文件上传
ch11
- what I have done
- 路由重定向和http重定向(就是请求到其他网络页面去)
- 查看main.go
ch12(已略过)
- what I have done
- 设置和获取cookie
ch13
- what I have done
- 日志记录到文件
- 这是信息不再输出到控制台,而是输入了gin.log文件,查看它
ch14(已失败)–(已修复用go install 代替go get就行)
- what I have done
- 实现热重栽(未实现)
go get -v -u github.com/pilu/fresh
ch15
-
请求返回的数据类型初谈
-
使用命令fresh 代替 go run main.go
开始使用go-micro微服务,因为我不会spring boot和spring cloud
- 更侧重服务治理,不是很侧重api
- 集成gin和go-micro
简单理一下思路
- 微服务就是举例来讲:
一个商城网站,可以拆分成
用户管理,订单管理,商品管理...
几个模块,这几个模块分别指定不同领域的人开发,最终部署到不同的服务器上,然后使用通信协议来互相访问模块(服务)
- 所以微服务重点在
服务部署和网络通信上
- 微服务衍生的个别名词:
服务注册与发现,远程调用接口注册和实现调用,负载均衡,服务熔断,路由网关,配置中心和对以上所有名词的集群化部署
m1
- what I have done
- 创建web api