只是一个使用方式的memo,防止以后记不住还要查(其实就是个简易版翻译。。。毕竟是个垃圾的自己)
git地址:https://github.com/gin-gonic/gin
API列表:https://godoc.org/github.com/gin-gonic/gin
安装
1 | go get -u github.com/gin-gonic/gin |
要装好多东西。。。而且网。。。慢慢等就是了
运行基础代码:
1 | func main() { |
router
默认路由
gin.Default()
go gin在内部封装好了一套路由管理机制,主要介绍一下里面获取参数的方式吧。(其实就是翻译git文档)
路径匹配参数
1 | func main() { |
GET 传入的参数
query string: /welcome?firstname=Jane&lastname=Doe
1 | router.GET("/welcome", func(c *gin.Context) { |
其中DefaultQuery:DefaultQuery(key, defaultValue string) string,有默认值的获取参数。
POST表单获取参数
1 | router.POST("/form_post", func(c *gin.Context) { |
用map的方式获取query里的数组
request:
1 | POST /post?ids[a]=1234&ids[b]=hello HTTP/1.1 |
server代码:
1 | func main() { |
获取文件
request:
1 | curl -X POST http://localhost:8080/upload \ |
server代码:
1 | func main() { |
参数类型绑定
针对json,xml,YAML等其他类型的request或者传统query,我们把request body绑定到某一特定类型上,再对这种类型的数据进行进一步处理。
bind分为两类:mustbind 和shouldbind,区别是当mustbind出错的时候,返回error并且强制终止后续处理并返回error 400。shouldbind当出错的时候只会返回error,是否继续执行由编写者自己决定。
1 | // Binding from JSON |
利用bind+validator可以实现鉴权,用到再说。
Html 渲染
Using LoadHTMLGlob() or LoadHTMLFiles()
1 | func main() { |
templates/index.tmpl
1 | <html> |
渲染这部分用到的频率一直不算太高就这样吧
不含middleware的路由
也就是不像default一样封装好包括log等等,具体也等用到了再说
用gin运行多个server
1 | package main |
Graceful Restart and Stop
随手查了一下,优雅重启和优雅关闭实际上是一种策略,就是在shutdown的时候先执行完手中所有的当下所有的请求再关闭,优雅重启就是要在重启的过程中更加平滑(说了等于没说
下面是抄的别的博客:
一种GracefulRestart的方法是,通过部署系统配合nginx来完成。由于大部分业务系统都是挂在nginx之后通过nginx进行反向代理的,因此在重启某台机器的进程A时,可以把该机器IP从nginx的upstream中摘除掉,等一段时间比如1分钟,该进程差不多也处理完了所以请求,实际上已经处于空闲状态了。这时就可以kill掉该进程并重启,等重启成功之后,再把该机器的IP加回到nginx对应的upstream中去。
这种方式是语言、平台无关的一种技术方案,但是缺点也很明显:
- 首先就是复杂,需要部署系统和网关(nginx)恰到好处地配合。开发人员点击部署时,部署系统需要通知nginx摘掉某个upstream的某个IP;然后等进程重启成功之后,部署系统需要通知nginx在某个upstream中加上某个IP。这一整套系统的开发测试还是有一定复杂性的。
- 其次是等待时间的未知性。当把机器A摘掉以后过多久进程才能处理完请求?10秒?1分钟?谁也不知道…间隔短了,会出问题,因为部分请求被卡断了;间隔长了,上线又慢,而且你还是不能确定是否请求都处理完了(其实基本上没问题,但是理论上无法保证)。
- 另一个问题是压力陡增。对于大公司动辄几百台的集群,摘一两台无关紧要。但是对于小公司,比如某个服务只有两台机器,并且每台机器压力都挺大。这时如果直接摘一台,所有流量到另一台机器上,使得那台机器承受不住,那么可能会导致整个服务不可用。
因此这里引出第二种实现方式——fd继承
后面的不抄了,等有时间慢慢整理一下。