- 博客(116)
- 收藏
- 关注
原创 28-gin框架中间件
Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫做中间件,中间件适合处理一些公共的业务逻辑,比如登录认证,权限校验,数据分页,记录日志,耗时统计等。Gin中的中间件必须是一个类型。例如我们像下面的代码一样定义一个统计请求耗时的中间件。注册中间件在gin框架中,我们可以为每个路由添加任意数量的中间件。为全局路由注册结果:可以取到。为某个路由单独注册运行结果:为路由组注册中间件有以下两种写法。写法1:写法2:中间件注意事项gin默认中间件 默认使用了和
2022-07-08 11:44:31 1194 1
原创 27-gin框架路由管理
HTTP重定向很容易。内部、外部重定向均支持。路由重定向(内部重定向)路由重定向,使用:结果:此外,还有一个可以匹配所有请求方法的方法如下:为没有配置处理函数的路由添加处理程序,默认情况下它返回404代码,下面的代码为没有匹配到路由的请求都返回页面。路由组我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对包裹同组的路由,这只是为了看着清晰,你用不用包裹功能上没什么区别。路由组也是支持嵌套的,例如:通常我们将路由分组用在划分业务逻辑或划分API版本时。Gin框架中的路由使用的是h
2022-07-08 11:40:12 519 1
原创 26-gin框架参数处理以及文件上传
指的是是URL中后面携带的参数,例如:。获取请求的querystring参数的方法如下:结果:当前端请求的数据通过form表单提交时,例如向发送一个POST请求,获取请求数据的方式如下:结果:当前端请求的数据通过JSON提交时,例如向发送一个POST请求,则获取请求参数的方式如下:更便利的获取请求参数的方式,参考下面参数绑定小节。请求的参数通过URL路径传递,例如:。获取请求URL路径参数的方式如下。为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的识别请求数据类型并利用反射机制自动
2022-07-08 11:34:24 887
原创 25-Go的web框架gin基本介绍
Go世界里最流行的web框架,github上有32k+的star。基于httprouter开发的web框架。中文文档齐全,简单易用的轻量级框架。下载并安装:第一个Gin示例:RESTfulREST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。简单来说,REST的含义就是客户端与web服务器之间进行交互的时候,使用HTTP协议中的4个请求方法代表不同的动作。只要API程序遵循了REST
2022-07-08 11:09:24 375
原创 24-Go操作redis
学redis主要是学习常用数据结构的命令:https://www.redis.com.cn/commands.html。推荐使用docker快速起一个环境go-redis库驱动包目前社区里用的比较多的是 redigo 和 go-redis我推荐使用,目前最新的是v8版本v8新版本相关最新版本的库相关命令都需要传递参数,例如:连接redis哨兵模式连接redis集群基本使用https://redis.uptrace.dev/guide/hll.htmlzset示例根据前缀获取Key
2022-07-08 10:56:36 243
原创 23-Go更强大的库-sqlx
在项目中我们通常可能会使用database/sql连接mysql数据库。sqlx可以认为是go语言内置database/sql的超集,它在优秀的内置database/sql基础上提供了一组扩展。这些扩展中除了大家常用来查询的,还有其他强大的功能。基本使用连接数据库查询查询单行数据示例代码如下:查询多行数据示例代码如下:插入、更新、删除sqlx中的exec方法与原生sql中的exec使用基本一致:NamedExec方法用来绑定SQL语句与结构体或map中的同名字段。NamedQuery
2022-07-07 11:08:04 1622 1
原创 22-Go操作mysql
docker快速启动一个MySQL Server容器启动一个终端容器 连接上面的MySQL Server连接Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动。使用database/sql包必须注入一个数据库驱动。使用MYSQL驱动Open打开一个driverName指定的数据库,dataSourceName指定数据源,一般包括数据库文件名和其他连接必要的信息。初始化连接Open函数只是验证其参数格式是否正确,世纪上并不创建于数据库连
2022-07-07 11:05:28 276
原创 21-并发错误处理
error:是程序运行过程中预期可能出现的问题(错误)panic:恐慌,是一些程序运行期间不可预期(意想不到的)的问题;代码写的有瑕疵程序遇到panic就崩掉了,可以通过recover实现平滑退出。我们知道可以在代码中使用recover来恢复程序中意想不到的panic, 而panic只会触发当前goroutine中的defer操作。例如在下面的示例代码中,无法在main函数中recover另一个goroutine中引发的panic.执行上面的函数得到如下结果:从输出的结果可以看出程序并没有正常退出,而是
2022-07-07 09:34:17 219
原创 20-Go语言之context
在Go http包的server中,每一个请求在都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户身份认证信息,验证相关token,请求截止时间。当一个请求被取消或超时,所有用来处理该请求的goroutine都应该迅速退出,然后系统才能释放这些goroutine占用的资源。共有的问题:如何在goroutine外部通知goroutine退出?有并发风险
2022-07-05 15:15:34 204
原创 19-Go语言之网络编程-net/http
Go语言内置的包提供了HTTP客户端和服务端的实现。HTTP协议是互联网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。Get、Head、Post和PostForm函数发送HTTP/HTTPS请求。程序在使用完response后必须关闭回复的主体。GET请求示例使用包编写一个简单的发送HTTP请求的Client端,代码如下:将上面的代码保存之后编译成可执行文件,执行之后就能在终端打印网站首页的内容了,我们浏览器其
2022-07-05 15:12:13 199
原创 18-Go语言之单元测试
Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法或工具。go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以为后缀的源代码文件都是go test测试的一部分,不会被go build编译到最终的可执行文件中。在文件中有三种类型的函数,单元测试函数,基准测试函数和示例函数。go test命令会遍历所有的文件中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然后构建并运行,报告测试结果,最后清理测试
2022-07-05 15:06:33 271
原创 17-Go并发之锁
互斥锁是一种常见的控制共享资源访问的方法,它能够保证同一时间只有一个goroutine在访问共享资源。Go语言中使用包中的类型实现互斥锁。提供两个方法供我们使用。我们在下面的示例代码中使用互斥锁限制每次只有一个 goroutine 才能修改全局变量,从而修复上面代码中的问题。将上面的代码编译后多次执行,每次都会得到预期的10000.使用互斥锁能够保证同一时间有且只有一个goroutine进入临界区,其他的goroutine则在等待锁;当互斥锁释放后,等待的goroutine才能获取锁进入临界区,多个gor
2022-07-04 17:39:05 521
原创 16-Go语言并发之goroutine,channel
首先我们先了解几个与并发编程相关的概念。进程:程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立的单位。线程:操作系统调度执行的最小单位。协程:非操作系统提供而是由用户自行创建和控制的用户态线程,比线程更轻量级。Go语言中的并发程序主要是通过基于CSP的goroutine和channel来实现,当然也支持使用传统的多线程共享内存的并发方式。Goroutine是GO语言支持并发的核心,在一个GO程序中同时创建成百上千个goroutine是非常普遍的,一个goroutine会以一个很小的栈开始其生
2022-07-03 16:34:07 785 1
原创 15-Go语言time和strconv包
时间和日期是我们编程中经常会用到的,本文主要介绍了Go语言内置的time包的基本用法。time包提供了一些关于时间显示和测量用的函数。time包中日历的计算采用的是公历,不考虑润秒。Go语言中使用的类型表示时间。我们可以通过函数获取当前的时间对象,然后从时间对象中可获取到年、月、日、时、分、秒等信息。Location 和time zoneGo语言中使用location来映射具体的时区。时区(Time Zone)是根据世界各国家与地区不同的经度而划分的时间定义,全球共分为24个时区。中国差不多跨5个时区,
2022-07-03 12:00:00 445
原创 14-Go语言之反射
程序运行的时候动态的获取变量值或者类型。两个函数 和 反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。Go程序在运行期使用reflect包访问程序的反射信息。在上一篇博客中我们介绍了空接口。 空接口可以存
2022-07-03 11:52:35 94
原创 13-Error接口错误处理以及go Module
Go语言中的错误处理和其他语言不一样,它把错误当成一种值来处理,更强调判断错误,处理错误,而不是一股脑的catch错误。Go语言中把错误当成一种特殊的值来处理,不支持其他语言的 捕获异常的方式。接口只包含一个方法----,这个函数需要返回一个描述错误信息的字符串。当一个函数或者方法需要返回错误时,我们通常是把错误作为最后一个返回值。例如下面标准库os打开文件的函数。由于error是一个接口类型,默认零值为 。所以我们通常将调用函数返回的错误与进行比较,以此来判断函数书否返回错误。例如你经常看到类似下面的
2022-07-01 09:04:41 509
原创 12-Go语言接口interface
在Go语言中接口(interface)是一种类型,一种抽象的类型。相较于之前章节讲到的那些具体类型,接口更注重“我能做什么的问题”。接口类型就像是一种约定–概括了一种类型应具备的那些方法,在Go语言中提倡使用面向接口的编程方式实现解耦。每个接口类型由任意个方法签名组成,接口的定义格式如下:其中:举个例子,定义一个包含方法的接口。当你看到一个接口类型的值时,你不知道它是什么,唯一知道的就是可以通过调用它的方法来做一些事情。接口就是规定了一个需要实现的方法列表,在GO语言中一个类型只要实现了接口中规定的所有
2022-07-01 08:52:15 354
原创 11-标准库fmt以及文件操作
系列函数会将内容输出到系统的标准输出,区别在于函数直接输出内容,函数支持格式化输出字符串,函数会在输出内容结尾天际一个换行符。Fprint系列函数会将内容输出到接口类型的变量w中,通常用这个函数往文件中写入内容。Sprint系列函数会把传入的数据生成并返回一个字符串。格式化占位符系列函数都支持format格式化参数,在这里我们按照占位符将被替换的变量类型划分,方便查询和记忆。示例代码如下:布尔型占位符说明%ttrue或false整型占位符说明
2022-07-01 08:47:03 1052 1
原创 10-Go语言结构体
Go语言中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或者部分属性时,这时候在用单一的基本数据类型就无法满足要求了,G哦语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫做结构体,英文。Go语言中通过来实现面向对象。使用和关键字来定义结构体,具体代码格式如下:其中:举个例子,我们定一个的结构体,代码如下:这样我们就有了一个的自定义类型,他有 三个字段。这样我们就可以使用这个结构体就能方便的在程序中表示和存储人信息了。结构体实例化只有当结构体实例化
2022-06-30 17:27:05 832 3
原创 09-自定义类型和类型别名
在Go语言中有一些基本的数据类型,如、、、等数据类型, Go语言中可以使用关键字来定义自定义类型。通过关键字的定义,就是一种新的类型,它具有的特性。自定义类型是程序员根据自己的需要创造的新类型。让代码更易读内置的和 就是类型别名自定义类型和类型别名区别类型别名类型定义表面上看只有一个等号的差异,我们通过下面的这段代码来理解他们之间的区别。结果显示的是类型,表示包下定义的类型。b的类型为。类型别名只在源文件中生效,编译时会被替换成原始类型。...
2022-06-30 17:18:06 137
原创 08-Go语言中函数和指针
Go语言中定义函数使用关键字,具体格式如下:其中:函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名(包的概念详见后文)。参数:参数由参数变量和参数变量的类型组成,多个参数之间使用分隔。返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用包裹,并用分隔。函数体:实现指定功能的代码块。我们先来定义一个求两个数之和的函数:函数的参数和返回值都是可选的,例如我们可以实现一个既不需要参数也没有返回值的函数:函数调用定义了函.
2022-06-30 17:15:42 756 1
原创 kubernetes基于ingress的灰度发布(二)
配置Ingress规则配置一个生产环境的ingress规则#vim pro.yamlapiVersion: extensions/v1beta1kind: Ingressmetadata: name: pro annotations: kubernetes.io/ingress.class: nginx #指定ingress-controller为nginxspec: rules: - host: canary-service.abc.com #定义虚拟主机
2020-08-27 13:51:53 844 1
原创 kubernetes基于ingress的灰度发布(一)
概念灰度发布也叫金丝雀发布,通俗来说,即让产品的迭代能够按照不同的灰度策略对新版本进行线上环境的测试,灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以对新版本进行测试、发现和调整问题,以保证其影响度。方式目前流行的恢复发布方式大概有两种:一种是基于istio的servicemesh技术,但是部署使用起来相对来说比较麻烦,后续会专门出istio系列文章;另外一种是使用ingress和ingress-controller来进行灰度发布。下面主要介绍基于ingress的灰度发布。Ingress-co
2020-08-27 13:46:37 2221 1
原创 基于Kubernetes的DevOps平台企业级实践(二)
接着上一篇继续:gitlab与jenkins集成操作步骤安装gitlab plugin插件中心搜索并安装gitlab,直接安装即可。系统管理,配置Gitlab其中的API Token,需要从下个步骤中获取获取AccessToken登录gitlab,选择user->profile->access tokens新建一个访问token。获取Secret Token新建job->构建触发器选择 Build when a change is pushed to G
2020-08-14 15:31:07 2031 4
原创 基于Kubernetes的DevOps平台企业级实践(一)
概况基于k8s集群部署gitlab、Jenkins等工具,并把上述工具集成到Jenkins中,通过pipline及Jenkinsfile实现项目代码提交、自动代码扫描、单元测试、docker容器构建、k8s服务的自动部署。演示的架构是以gitlab+jenkins(pipline流水线)+kubernetes+钉钉(结果通知)。kubernetes环境部署jenkins注意点1.因为后面Jenkins会与kubernetes集群进行集成,会需要调用kubernetes集群的api,因此安装的 时候创建
2020-08-14 15:21:15 2464 1
原创 Linux命令四剑客~sed grep awk find
linux四剑客~grep参数详解:-v: 取反;-i: 忽略字符大小写;-n: 显示匹配的行数;-c:统计匹配的行数;-o:仅显示匹配到的字符串;-q:静默模式,不会输出任何信息;-e:搜索多个条件,是或的关系;-w:只匹配整个单词; egrep是支持正则表达式,其他参数与grep一样。linux四剑客~sed命令行格式 sed [选项] command 文件 选项:-i:直接修改要编辑的文件 常用命令:a: 新增,a 的后面可以接字串,而这些字串会在新的一行出现(目前的
2020-08-11 17:32:51 580
原创 nginx之HTTPS配置
公钥和私钥的概念具体配置只需要在nginx的配置文件中增加:nginx配置证书和私钥#cd /etc/nginx/conf.d/#创建服务器私钥,#openssl genrsa -des3 -out server.key 1024#创建签名请求的证书(CSR)#openssl req -new -key server.key -out server.csr#加载ssl支持的nginx中使用上述私钥时去除密码#openssl rsa -in server.key -out s
2020-08-09 20:36:20 499
原创 nginx之rewrite用法
rewrite用法【语法】 rewrite regex replacement [flag];flag=【break|last|redirect|permant】regex: 是正则表达式;replacement:是替换值,是新值;flag: 处理标志,可以省略。rewrite配置文件server {listen 80;server_name rewrite.smallboy.com;location /a.html { root html;}#访问
2020-08-09 20:08:45 1211
原创 nginx之location规则详解
1.nginx执行过程首先,浏览器访问一个url;然后,图中虚拟主机匹配过程。进入到对应的nginx配置的虚拟机主机(也就是/etc/nginx/conf.d/下面的哪个虚拟主机);其次,图中location匹配。进入到对应的虚拟主机里面的location进行匹配,会分为匹配到的path和未匹配到的path。2.location中root和alias命令(静态文件处理)root命令:root后面路径+location路径进行查找(默认是安装nginx时的html目录,建议生产环境写绝对路径)
2020-08-09 16:30:07 925
原创 nginx概念及其配置(二)
虚拟主机一般定义虚拟主机时,会把nginx.conf中server部分单独拿出来,具体操作如下:1. 在主配置文件中作如下修改用来关联虚拟主机#vim /usr/local/nginx/conf/nginx.conf#将server下面全部删除,增加一行 #gzip on include /etc/nginx/conf.d/*.conf #nginx -t ----检查nginx配置文件有无语法错误 #nginx -s reload --------重启nginx服务方
2020-08-09 13:55:22 150
原创 nginx概念(一)
功能:1.路由功能;2.负载均衡功能;3.静态web功能工作模式:正向代理:代理客户端,比如访问谷歌,要找代理ip翻墙,这就是正向代理;反向代理:代理服务端,比较常见。基础概念:分为master进程和worker进程,master进程:管理worker进程;向各worker进程发送信号;监控worker进程运行状态。worker进程:真正提供服务的进程安装(源码安装):#wget http://nginx.org/download/nginx-1.9.0.tar.gz -
2020-08-06 14:58:52 220 2
原创 shell从入门到精通之OpenStack P版一键安装shell 方法
VM虚拟机8G内存,安装完毕,半个小时左右#在线安装#环境 centos 7.4.1708 x86_64#在线安装openstack pike#!/bin/sh# openstack pike 单机 一键安装# 环境 centos 7.4.1708 x86_64# blog: https://blog.csdn.net/weixin_38753143# Myde by wanglei[[ `uname -r` = *el7* ]] && { echo '开启
2020-08-06 11:27:53 511 2
原创 shell从入门到精通之shell编程开发生产环境跳板机案例
生产环境中为了保证服务器安全,所以在生产环境服务器前会有一台跳板机来作为中转。开源的jumpserver是很好的解决方案,还有一些成熟的产品,比如堡垒机,等等。现在我们自己开发一个跳板机。步骤:1.首先跳板机以普通用户登陆,然后登陆同时,运行我们跳板机脚本,进入跳板机界面:##在环境变量中配置脚本[root@master ~]# cat /etc/profile.d/jump.sh #!/bin/sh[ $UID -ne 0 ] && sh /tmp/jump.sh ---.
2020-08-06 10:58:54 302 2
原创 shell从入门到精通之trap信号捕获处理
linux系统的信号处理1. 查看linux系统中信号:[root@master shell]# kill -l 或trap -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13)
2020-08-06 09:56:03 356 1
原创 shell从入门到精通之shell脚本调试工具
shell开发规范1.开头指定脚本编辑器2.开头加版本、版权信息,便于维护3.脚本中不用中文注释,拼音都比中文强4.脚本以sh为扩展名5.代码书写优秀习惯,该有空格,就空格6.通过缩进,让代码易读。shell脚本调试1.调试技巧~用echo关键命令进行调试 echo命令是脚本调试的最重要的工具。一般在可能出现问题的地方或重要部分中要加入echo命令进行调试。2.调试技巧~用bash参数进行调试 参数:-n:不会执行脚本,仅查询脚本语法是否有错误,并给出提示信息。-v:
2020-08-05 16:02:05 1154
原创 shell从入门到精通之数组定义以及增删改查
shell数组 如果有python语言基础的朋友,shell的数组和python中的列表很像,包括一些增删改查操作,但是python中的list是多维的,而shell基本上是一维的。数组的定义与读取1)数组定义 [root@master shell]# arr=(1 2 3)查看数组长度[root@master shell]# echo ${#arr[@]} 3[root@master shell]# echo ${#arr[*]} 3打印数组元素[root@master
2020-08-05 14:39:52 359
原创 shell入门到精通实战1-生产环境批量检查web url并通过手机邮件报警
生产环境批量检查web url并通过手机邮件报警场景:*用于服务启动后快速检查,常用于和服务启动脚本放一起。*#!/bin/bash######################################### this script is created by wanglei# mail: 353938339@qq.com# qq: 353938339# version: 1.0######################################## function:
2020-08-05 13:40:54 261
原创 shell从入门到精通之循环语句命令continue、break、exit区别
循环结构中多个控制命令1.break continue exit区别break: 跳出整个循环 continue:忽略本次循环的剩余代码,继续执行下次循环exit: 退出当前shell程序2.事例break例:#!/bin/shfor i in `seq 5`do if [ $i -eq 3 ] then break else echo $i fidoneecho "ok"[root@master shel
2020-08-05 11:22:56 287
原创 shell从入门到精通之for循环以及六种随机数生成法
For 循环1.【语法结构】 for 变量 in 变量取值列表 do 指令 done2.语法seq用法: # seq 10 #从1打到10 # seq 2 10 #从2打到10 # seq 1 3 100 #从1打到100,步长为3shell下面生成随机数:[root@master shell]# echo $RANDOM| md5sum | cut -c 15-22 #从第15位取到第22位,总共取八位a30e42d8linux产生随机数的六种方法方法一:
2020-08-05 10:44:26 844
原创 shell从入门到精通之while循环和until循环
1.语法格式while 条件语句 --------条件满足就执行下面的指令 while 条件 do 指令 doneuntil 条件语句 untile条件 ---------条件满足就跳出指令 do 指令 done2.事例计算apache一天的日志所有行访问日志的大小。方法1:#!/bin/bash#author=wanglei 2020-08-05 #mail=353938339@qq.comsum=0w
2020-08-05 09:44:37 162
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人