技术学习
未读日志框架logrus
介绍
Logrus是一个结构化日志处理框架,并且api完全兼容golang标准库的logger日志api, 意味着你可以直接使用Logrus替换logger。logrus具有以下特性:
完全兼容golang标准库日志模块:logrus拥有七种日志级别:debug、info、warn、error、fatal、panic和Trace,这是golang标准库日志模块的API的超集。如果您的项目使用标准库日志模块,完全可以以最低的代价迁移到logrus上。
可扩展的Hook机制:允许使用者通过hook的方式将日志分发到任意地方,如本地文件系统、标准输出、logstash、elasticsearch或者mq等,或者通过hook定义日志内容和格式等。
可选的日志输出格式:logrus内置了两种日志格式,JSONFormatter和TextFormatter,如果这两个格式不满足需求,可以自己动手实现接口Formatter,来定义自己的日志格式。
Field机制:logrus鼓励通过Field机制进行精细化的、结构化的日志记录,而不是通过冗长的消息来记录日志。
logrus是 ...
技术学习
未读实现步骤在Linux系统上安装Nginx服务器,配置图片访问路径(主要是配置nginx.conf的图片路径), 通过浏览器访问指定路径中的图片;
1没有安装的看这里[Nginx、Vsftpd 安装][https://juejin.cn/post/7201491839815368765]
2测试是否能够访问成功
检查nginx安装位置
1whereis nginx
3编辑配置文件1vim /etc/nginx/nginx.conf
在 http { 下面添加 server{…} 中的内容
{1234567891011121314151617181920212223242526272829303132http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; ...
技术学习
未读如何在 Ubuntu 云服务器上使用Nginx部署 Go 语言程序?
Nginx 是一个免费的、开源的、高性能的 HTTP 和反向代理服务,主要负责负载一些访问量比较大的站点。Nginx 可以作为一个独立的 Web 服务,也可以用来给 Apache 或是其他的 Web 服务做反向代理。相比于 Apache,Nginx 可以处理更多的并发连接,而且每个连接的内存占用的非常小。
Nginx的安装没有安装的可以看我的这篇文章,这里就不再水字数了,哈哈 :relieved:
Nginx常用命令
在这里补充几个 Nginx 常用命令。
1234nginx -s stop # 停止 Nginx 服务nginx -s reload # 重新加载配置文件nginx -s quit # 平滑停止 Nginx 服务nginx -t # 测试配置文件是否正确
Nginx反向代理部署推荐使用 nginx 作为反向代理来部署我们的程序,按下面的内容修改 nginx 的配置文件
1234567891011121314151617181920212223242526272829 ...
Go 1.18版本增加了一个主要的新语言特性: 对泛型的支持。在本文中,我不会描述泛型是什么,也不会描述如何使用它们。本文讨论在 Go 代码中何时使用泛型,以及何时不使用它们。
编写代码让我们从编写 Go 程序的一般准则开始:通过编写代码而不是定义类型来编写 Go 程序。在泛型方面,如果通过定义类型参数约束开始编写程序,那么你就错了。应该从编写函数开始。如果明确知道类型参数有用的情况下,很容易在以后添加类型参数。
应该使用类型参数让我们看一下类型参数对哪些情况有用。
使用语言定义的容器类型时当我们编写的是操作 Go 语言定义的特殊容器类型(slice、map和chennel)的函数。如果函数具有包含这些类型的参数,并且函数的代码并不关心元素的类型,那么使用类型参数可能是有用的。
例如,这里有一个函数,它的功能是返回任何类型map中所有的key:
12345678// MapKeys 返回m中所有key组成的切片func MapKeys[Key comparable, Val any](m map[Key]Val) []Key { s := make([]Key, 0, ...
Air能够实时监听项目的代码文件,在代码发生变更之后自动重新编译并执行,大大提高gin框架项目的开发效率。
为什么需要实时加载?之前使用Python编写Web项目的时候,常见的Flask或Django框架都是支持实时加载的,你修改了项目代码之后,程序能够自动重新加载并执行(live-reload),这在日常的开发阶段是十分方便的。
在使用Go语言的gin框架在本地做开发调试的时候,经常需要在变更代码之后频繁的按下Ctrl+C停止程序并重新编译再执行,这样就不是很方便。
Air介绍怎样才能在基于gin框架开发时实现实时加载功能呢?像这种烦恼肯定不会只是你一个人的烦恼,所以我报着肯定有现成轮子的心态开始了全网大搜索。果不其然就在Github上找到了一个工具:Air。它支持以下特性:
彩色日志输出
自定义构建或二进制命令
支持忽略子目录
启动后支持监听新目录
更好的构建过程
安装AirGo这也是最经典的安装方式:
1go get -u github.com/cosmtrek/air
MacOS1curl -fLo air https://git.io/darwin_air
Linux ...
单元测试前言不写测试的开发不是好程序员。我个人非常崇尚TDD(Test Driven Development)的,然而可惜的是国内的程序员都不太关注测试这一部分。 这篇文章主要介绍下在Go语言中如何做单元测试和基准测试。
Go test工具Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。
go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终的可执行文件中。
在*_test.go文件中有三种类型的函数,单元测试函数、基准测试函数和示例函数。
类型
格式
作用
测试函数
函数名前缀为Test
测试程序的一些逻辑行为是否正确
基准函数
函数名前缀为Benchmark
测试函数的性能
示例函数
函数名前缀为Example
为文档提供示例文档
go test命令会遍历所有的*_test.go文件中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然 ...
在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug,同时了解了程序的实际处理能力能够帮我们更好的匹配项目的实际需求,节约资源成本。
压测相关术语
响应时间(RT) :指系统对请求作出响应的时间.
吞吐量(Throughput) :指系统在单位时间内处理请求的数量
QPS每秒查询率(Query Per Second) :“每秒查询率”,是一台服务器每秒能够响应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
TPS(TransactionPerSecond):每秒钟系统能够处理的交易或事务的数量
并发连接数:某个时刻服务器所接受的请求总数
压力测试工具abab全称Apache Bench,是Apache自带的性能测试工具。使用这个工具,只须指定同时连接数、请求数以及URL,即可测试网站或网站程序的性能。
通过ab发送请求模拟多个访问者同时对某一URL地址进行访问,可以得到每秒传送字节数、每秒处理请求数、每请求处理时间等统计数据。
命令格式:
1ab [options] [http://]hostname[:port ...
技术学习
未读数据库数据安全在这里我们讨论如何对用户输入的数据(密码)进行加密,避免成为明文存入数据库中
加密解密在实际开发中应用比较广泛,常用加解密分为:“对称式”、“非对称式”和”数字签名“。
对称式:对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。具体算法主要有DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法。
**非对称加密(公钥加密)**:指加密和解密使用不同密钥的加密算法,也称为公私钥加密。具体算法主要有RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
数字签名:数字签名是非对称密钥加密技术与数字摘要技术的应用。如MD5、SHA1、HMAC等, 主要用于验证,防止信息被修改, 如:文件校验、数字签名、鉴权协议;
HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,
hmac算法是加密的hash算法,它需要一个hash算法(比如sha256、md5等)和一个密匙key,在hash计算的过程中将密匙key混入,产生一个和原来hash算 ...
Go 1.18版本增加了对泛型的支持,泛型也是自 Go 语言开源以来所做的最大改变。
什么是泛型泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。ーー换句话说,在编写某些代码或数据结构时先不提供值的类型,而是之后再提供。
泛型是一种独立于所使用的特定类型的编写代码的方法。使用泛型可以编写出适用于一组类型中的任何一种的函数和类型。
为什么需要泛型假设我们需要实现一个反转切片的函数——reverse。
1234567891011func reverse(s []int) []int { l := len(s) r := make([]int, l) for i, e := range s { r[l-i-1] = e } return r}fmt.Println(reverse([]int{1, 2, 3, 4})) // [4 3 2 1]
可是这个函数只能接收[]int类型的参数,如果我们想支持[]float64类型的参数,我们就需要再定义一个reverseFloat ...
基于 Ubuntu Server 20.04 LTS 64bit
Nginx卸载与安装安装Nginx 在默认的 Ubuntu 源仓库中可用。想要安装它,运行下面的命令:
12sudo apt updatesudo apt install nginx
一旦安装完成,Nginx 将会自动被启动。你可以运行下面的命令来验证它:
1sudo systemctl status nginx
输出类似下面这样:
1234 nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2020-05-02 20:25:43 UTC; 13s ago...
配置防火墙现在你已经在你的服务器上安装和运行了 Nginx,你需要确保你的防火墙(以及 = ...