logrus
18.logrus 01.logrus基础 参考GitHub(opens new window) 参考博客1(opens new window) 参考博客2(opens new window) 安装 1go get github.com/sirupsen/logrus 1.1 简介 Logrus是Go(golang)的结构化logger,与标准库logger完全API兼容,它有以下特点 完全兼容标准日志库,拥有七种日志级别:Trace, Debug, Info, Warning, Error, Fataland Panic。 可扩展的Hook机制,允许使用者通过Hook的方式将日志分发到任意地方 如本地文件系统,logstash,elasticsearch或者mq等,或者通过Hook定义日志内容和格式等 可选的日志输出格式,内置了两种日志格式JSONFormater和TextFormatter,还可以自定义日志格式 Field机制,通过Filed机制进行结构化的日志记录 线程安全 1.2 简单导报使用 1234567891011package mainimpor...
Makefile
16.Makefile 01.介绍 1.1 make介绍 make是一个构建自动化工具,会在当前目录下寻找Makefile或makefile文件 如果存在相应的文件,它就会依据其中定义好的规则完成构建任务。 1.2 Makefile介绍 借助Makefile我们在编译过程中不再需要每次手动输入编译的命令和编译的参数,可以极大简化项目编译过程。 我们可以把Makefile简单理解为它定义了一个项目文件的编译规则。 借助Makefile我们在编译过程中不再需要每次手动输入编译的命令和编译的参数,可以极大简化项目编译过程。 同时使用Makefile也可以在项目中确定具体的编译规则和流程,很多开源项目中都会定义Makefile文件。 1.3 win10安装make MinGW下载网页:http://sourceforge.net/projects/mingw/files/latest/download?source=files 右击计算机->属性->高级系统设置->环境变量,在系统变量中找到PATH 将MinGW安装目录里的bin文件夹的地址添加到PATH里面...
go-wrk
15.go-wrk压测 01.压测介绍 1.1 压测作用 在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug 同时了解了程序的实际处理能力能够帮我们更好的匹配项目的实际需求,节约资源成本。 1.2 压测相关术语 响应时间(RT) :指系统对请求作出响应的时间. 吞吐量(Throughput) :指系统在单位时间内处理请求的数量 QPS每秒查询率(Query Per Second) :“每秒查询率”,是一台服务器每秒能够响应的查询次数 是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 TPS(TransactionPerSecond):每秒钟系统能够处理的交易或事务的数量 并发连接数:某个时刻服务器所接受的请求总数 02.压力测试工具 2.1 ab ab全称Apache Bench,是Apache自带的性能测试工具。 使用这个工具,只须指定同时连接数、请求数以及URL,即可测试网站或网站程序的性能。 通过ab发送请求模拟多个访问者同时对某一URL地址进行访问,可以得到每秒传送字节数、每秒处理请求数、每请求处...
jwt-go
14.jwt-go 01.JWT介绍 1.1 什么是JWT? JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式 目前多用于前后端分离项目和OAuth2.0业务场景下。 1.2 jwt三部分 基于JWT技术及RSA非对称加密实现真正无状态的单点登录 02.JWT基本用法 2.1 定义需求 我们需要定制自己的需求来决定JWT中保存哪些数据 比如我们规定在JWT中要存储username信息 那么我们就定义一个MyClaims结构体如下 12345678// MyClaims 自定义声明结构体并内嵌jwt.StandardClaims// jwt包自带的jwt.StandardClaims只包含了官方字段// 我们这里需要额外记录一个username字段,所以要自定义结构体// 如果想要保存更多信息,都可以添加到这个结构体中type MyClaims struct { Username string `json:"username"` jwt.StandardClaims}...
gRPC
13.gRPC 01.gRPC基础 1.1 RPC是什么 在分布式计算,远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序 而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。 RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。 1.2 gRPC是什么 gRPC是一种现代化开源的高性能RPC框架,能够运行于任意环境之中。 最初由谷歌进行开发,它使用HTTP/2作为传输协议。 在gRPC里,客户端可以像调用本地方法一样直接调用其他机器上的服务端应用程序的方法,帮助你更容易创建分布式应用程序和服务。 与许多RPC系统一样,gRPC是基于定义一个服务,指定一个可以远程调用的带有参数和返回类型的的方法。 在服务端程序中实现这个接口并且运行gRPC服务处理客户端调用。 在客户端,有一个stub提供和服务端相同的方 1.3 为什么要用gRPC 使用...
viper配置管理
12.viper配置管理 01.viper介绍 参考博客(opens new window) 1.1 viper是什么? Viper (opens new window)是适用于Go应用程序的完整配置解决方案。 它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式 viper功能 设置默认值 从JSON、TOML、YAML、HCL、envfile和Java properties格式的配置文件读取配置信息 实时监控和重新读取配置文件(可选) 从环境变量中读取 从远程配置系统(etcd或Consul)读取并监控配置变化 从命令行参数读取配置 从buffer读取配置 显式配置值 1.2 为什么选择Viper? 在构建现代应用程序时,你无需担心配置文件格式; Viper能够为你执行下列操作: 查找、加载和反序列化JSON、TOML、YAML、HCL、INI、envfile和Java properties格式的配置文件。 提供一种机制为你的不同配置选项设置默认值。 提供一种机制来通过命令行参数覆盖指定选项的值。 提供别名系统,以便在不破坏现有代码的情况下轻松...
zap
11.zap日志包 01.日志模块介绍 参考博客(opens new window) 1.1 介绍 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能 能够将事件记录到文件中,而不是应用程序控制台。 日志切割-能够根据文件大小、时间或间隔等来切割日志文件。 支持不同的日志级别。例如INFO,DEBUG,ERROR等。 能够打印基本信息,如调用文件/函数名和行号,日志时间等。 1.2 默认的Go Logger 实现一个Go语言中的日志记录器非常简单——创建一个新的日志文件,然后设置它为日志的输出位置。 1234567891011121314151617181920212223242526272829package mainimport ( "log" "net/http" "os")// 第一:设置Loggerfunc SetupLogger() { logFileLocation, _ := os.OpenFile("./test.log", os.O_CREA...
reflect
10.reflect 01.反射 反射是指在程序运行期对程序本身进行访问和修改的能力 1.1 变量的内在机制 变量包含类型信息和值信息 var arr [10]int arr[0] = 10 类型信息:是静态的元信息,是预先定义好的 值信息:是程序运行过程中动态改变的 1.2 反射的使用 反射是指在程序运行期对程序本身进行访问和修改的能力。 程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。 在运行程序时,程序无法获取自身的信息。 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中 并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。 Go程序在运行期使用reflect包访问程序的反射信息。 02.反射方法 反射可以在运行时动态获取程序的各种详细信息 2.1 TypeOf reflect.TypeOf()获取类型信息 12345678910111213141516package mainimport ("fmt""ref...
Context
09.Context 01.context介绍 1.1 context由来 context在Go1.7之后就进入标准库中了,是在于控制goroutine的生命周期。 由于在Golang severs中,每个request都是在单个goroutine中完成 并且在单个goroutine(不妨称之为A)中也会有请求其他服务(启动另一个goroutine(称之为B)去完成)的场景 这就会涉及多个Goroutine之间的调用 如果某一时刻请求其他服务被取消或者超时,则作为深陷其中的当前goroutine B需要立即退出,然后系统才可回收B所占用的资源。 即一个request中通常包含多个goroutine,这些goroutine之间通常会有交互。 那么,如何有效管理这些goroutine成为一个问题(主要是退出通知和元数据传递问题) Google的解决方法是Context机制,相互调用的goroutine之间通过传递context变量保持关联 这样在不用暴露各goroutine内部实现细节的前提下,有效地控制各goroutine的运行。 如此一来,通过传递Context就可...
net/http
08.net/http 01.net/http(GET) Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现。 1.1 无参GET 使用net/http包编写一个简单的发送HTTP请求的Client端 12345678910111213141516171819202122package mainimport ( "fmt" "io/ioutil" "net/http")func main() { resp, err := http.Get("https://www.baidu.com/") if err != nil { fmt.Println("get failed, err:", err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("...
