Gin Web Framework
Gin 是用Go语言编写的Web框架。它具有类似于martini的API,其性能最高可提高40倍,这要归功于httprouter。
安装要安装Gin,你需要安装Go并且设置Go工作区。
1、你需要安装Go(1.12+),然后你可以使用下面的Go命令安装Gin。
1$ go get -u github.com/gin-gonic/gin
2、导入它到你的代码。
1import "github.com/gin-gonic/gin"
3、(可选)导入net/http,例如,在使用诸如http.StatusOk之类的常量时,这是必须的。
1import "net/http"
快速开始首先创建一个名为example.go的文件
1$ touch example.go
将下面的代码写入example.go中
1234567891011121314151617package mainimport ( "github.com/gin-gonic/gin" "net/http")func main() & ...
29、kafka
1、下载镜像12345//下载zookeeperdocker pull wurstmeister/zookeeper//下载kafkadocker pull wurstmeister/kafka:2.11-0.11.0.3
2、启动镜像1234567891011//启动zookeeperdocker run -d --name zookeeper --publish 2181:2181 --volume /etc/localtime:/etc/localtime wurstmeister/zookeeper//启动kafkadocker run -d --name kafka --publish 9092:9092 \--link zookeeper \--env KAFKA_ZOOKEEPER_CONNECT=192.168.121.205:2181 \--env KAFKA_ADVERTISED_HOST_NAME=192.168.121.205 \--env KAFKA_ADVERTISED_PORT=9092 \--volume /etc/localtime:/etc/lo ...
28、Context
在Go http包的Server中,每一个请求都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务。比如数据库的RPC服务。用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的token、请求截止时间。当一个请求被取消或者超时时,所有用来处理该请求的goroutine都应该迅速被退出,然受系统才能释放这些goroutine占用的资源。
为什么需要context基本示例123456789101112131415161718var wg sync.WaitGroupfunc work(){ for { fmt.Println("worker") time.Sleep(time.Second) } //如何接收外部命令实现退出,现在永远不会执行到这里,也就不会退出 wg.Done()}func main() { wg.Add(1) go work() //如何优雅的实现结 ...
27、依赖管理
为什么需要依赖管理最早的时候,Go所依赖的所有的第三方库放在GOPATH目录下。这就导致了同一个库只能保存一个版本的代码。
godepGo语言从v1.5开始引入vendor模式,如果项目目录下有vendor目录,那么go工具链会优先使用vendor内的包进行编译,测试等。
godep是一个通过vendor模式实现的Go语言第三方依赖管理工具,类似的还有由社区维护准官方包管理工具dep。
安装执行以下命令安装godep工具。
1go get github.com/tools/godep
基本命令安装godep之后,在终端输入godep查看支持的所有命令。
12345678godep save 将依赖项输出并复制到Godeps.json文件中godep go 使用保存的依赖项运行go工具godep get 下载并安装具有指定依赖项的包godep path 打印依赖的GOPATH路径godep restore 在GOPATH中拉取依赖的版本godep update 更新选定的包或go版本godep diff 显示当前和以前保存的依赖项集之 ...
26、nsq
NSQ介绍NSQ是Go语言编写的一个开源的实时分布式的内存消息队列,性能十分优异。
有以下优势:
1、NSQ提倡分布式和分散的拓扑,没有单点故障,支持容错和高可用性,并提供可靠的消息交付保证。
2、NSQ支持横向拓展,没有任何集中式代理。
3、NSQ易于配置和部署,并内置了管理界面。
NSQ的使用场景异步处理参照下图利用消息队列把业务流程中的非关键流程异步化,从而显著降低业务请求响应时间。
应用解耦通过使用消息队列将不同的业务逻辑解耦,降低系统间的耦合,提高系统的健壮性。后续有其他业务要使用订单数据可直接订阅消息队列,提高系统的灵活性。
流量削峰类似于秒杀等场景下,某一时间可能会产生大量的请求,使用消息队列能够为后端处理请求提供一定的缓冲区,保证后端服务的稳定性。
安装运行NSQ1、下载nsq docker镜像1docker pull nsqio/nsq
2、运行docker容器nsqlookupdnslookup是维护所有nsqd状态、提供服务发现的守护进程。它能为消费者查找特定topic下的nsqd提供了运行时的自动发现服务。他不维持持久状态,也不需要与任何其它nsql ...
25、Redis
介绍Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构。很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外,通过复制,持久化和客户端分片等特性,我们可以很方便地将Redis拓展成一个能包含数百万GB数据、每秒处理上百万次请求的系统。
Redis支持的数据结构Redis支持诸如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、带范围查询的排序集合(sortedsets)、位图(bitmaps)、hyperloglogs、带半径查询和流的地理空间索引等数据结构(geospatial indexes)。
Redis应用场景
1、缓存系统,减轻主数据库(MySql)的压力。
2、计数场景,如微博、抖音中的关注数和粉丝数。
3、热门排行榜,需要排序的场景特别适合使用ZSET。
4、利用LIST可以实现队列的功能。
准备Redis环境使用Docker启动一个Redis环境。
1$ docker pull redis:latest
运行容器:
1$ docker run -itd --name redis-test -p 6 ...
24、Sqlx
介绍在项目中通常会使用database/sql连接MySql数据库。sqlx可以认为是Go语言内置database/sql的超集,它在优秀的内置database/sql基础上提供了一组拓展。这些拓展中除了大家常用来查询的Get 和Select外还有很多其它强大的功能。
安装sqlx1go get github.com/jmoiron/sqlx
基本使用连接数据库1234567891011121314//连接数据库func initDb() (err error) { dataSourceName := `root:Lys52014.@tcp(127.0.0.1:3306)/sql_test` //也可以使用MustConnect连接不成功就panic //sqlx.MustConnect("mysql", dataSourceName) db, err = sqlx.Connect("mysql", dataSourceName) if err != nil { fmt.Printf(" ...
23、Go语言操作MySql
连接Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动。使用database/sql包时必须注入(至少)一个数据库驱动。
下载依赖1go get -u github.com/go-sql-driver/mysql
使用MySql驱动1func Open(driverName, dataSourceName string) (*DB, error)
Open打开一个driverName指定的数据库,database指定的数据库,dataSourceName指定数据源,一般至少包括数据库文件名和其它连接必要的信息。
12345678910111213141516171819202122import ( "database/sql" "fmt" //连接数据库的驱动 _ "github.com/go-sql-driver/mysql" //init()初始化驱动)//Go连接MYSQL数据库示例func main() { //数据库连接信息 dataBasesNa ...
22、Go性能调优
在计算机性能调试领域里,profiling是指对应用程序的画像,画像就是应用程序使用CPU和内存的情况。Go语言是一个对性特别看重的语言,因此语言中自带了profiling的库。
Go性能优化Go语言项目中的性能优化主要有以下几个方面:
CPU profile:报告程序的CPU使用情况,按照一定的频率去采集应用程序在CPU和寄存器上面的数据。
Memory Profile(Heap Profile):报告程序的内存情况。
Block Profile:报告groutine不在运行的状况下,可以用来分析和查找死锁的性能瓶颈。
Groutine Profile:报告goroutine的使用情况,有哪些goroutine,他们的调用关系是怎样的。
采集性能数据Go语言内置了获取程序的运行数据的工具,包括以下两个标准库:
runtime/pprof:采集工具型应用运行数据进行分析
net/http/pprof:采集服务型应用运行时数据进行分析
pprof开启后,每隔一段时间(10ms)就会收集当前的堆栈信息,获取个个函数占用的CPU以及内存资源,最后通过对这些采样数据进行分析,形成一个性 ...
21、flag
Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。
os.Argsos.Args可以简单获取命令行参数。
123456func main() { //os.Args 是一个[]string fmt.Printf("%#v\n", os.Args) fmt.Println(os.Args[0], os.Args[2]) fmt.Printf("%T\n", os.Args)}
编译后执行:
12345606osargs>06osargs.exe a b c[]string{"06osargs.exe", "a", "b", "c"}06osargs.exe b[]string
os.Args是一个储存命令行参数的字符串切片,它的第一个参数是执行文件的名称。
flag包的基本使用flag参数类型flag包支持的命令行参数类型有:bool, int, int64, uint ...