0.1、索引 https://waterflow.link/articles/1666716727236 1、panic 当我们执行panic的时候会结束下面的流程: package main import "fmt" func main() { fmt.Println("hello") panic("stop") fmt.Println("world") } go run 9.go hello panic: stop 但是panic也…
0.1、索引 https://waterflow.link/articles/1666716727236 1、panic 当我们执行panic的时候会结束下面的流程: package main import "fmt" func main() { fmt.Println("hello") panic("stop") fmt.Println("world") } go run 9.go hello panic: stop 但是panic也…
最好的防御方式就是攻击 知己知彼,百战不殆。掌握攻击者的套路才好顶得住攻击。 可能我的读者多少了解过Nginx,我先给不了解的同学简单说一下原理。已经了解的跳到第二节。 3分钟了解Nginx Nginx是一款高性能的Web服务器和反向代理服务器。 它可以用来搭建网站、做应用服务器,能够处理大量的并发连接和请求。 静态内容托管(主要):可以用来做网页、图片、文件的 “静态”内容托管。 动态内容托管(主要):将经常访问的动态内容缓存到内存中,提高访问速度和性能。 反向代理(主要):将客户端的请求发送到后端真实服务器,并…
hello,大家好呀,我是小楼。 最近我又双叒叕写了个BUG,一个线上服务死锁了,不过幸亏是个新服务,没有什么大影响。 出问题的是Go的读写锁,如果你是写Java的,不必划走,更要看看本文,本文的重点在于Java和Go的读写锁对比,甚至看完后你会有一个隐隐的感觉:Go的读写锁是不是有BUG? 故障回放 背景简单抽象一下:一个server服务(Go语言实现),提供了一个http接口,另有一个client服务来调用这个接口,整体架构非常简单,甚至都不用画架构图你也能够理解。 这两个服务上线运行了一段时间都没什么问题,突…
我的设计模式之旅,使用 Golang 实现。本程序实现状态模式。一个玩家从满血到死亡的过程有多个状态,假定健康、轻伤、重伤、死亡状态,当玩家扣血时判断切换状态,更改对象的行为。 编程旅途是漫长遥远的,在不同时刻有不同的感悟,本文会一直更新下去。 程序介绍 本程序实现状态模式。一个玩家从满血到死亡的过程有多个状态,假定健康、轻伤、重伤、死亡状态,当玩家扣血时判断并切换状态,触发不同状态的行为。 健康状态 HP 90 健康状态->轻伤状态 轻伤状态 HP 70 轻伤状态->重伤状态 重伤状态 HP 50 重…
促使我写这篇文章主要是在写一个关于虚拟货币账户监控的项目时使用 Ticker 的问题。 Ticker 的问题 如果用过 Ticker 的朋友会知道,创建 Ticker 后并不会马上执行,而是会等待一个时间 d,这就是创建时的间隔时间。如果间隔时间很短这基本上不会有太大问题,但是如果对首次执行时间有要求,就会很麻烦。例如以下这个案例: package main import ( "fmt" "sync" "time" ) func main() { ts :…
最近开发的telemetry采集系统上线了。听起来高大上,简单来说就是一个grpc/udp服务端,用户的机器(路由器、交换机)将它们的各种统计数据上报采集、整理后交后端的各类AI分析系统分析。目前华为/思科的大部分设备支持。 上线之后,各类用户开始找来要求帮忙定位问题,一般是上报的数据在后端系统中不存在等等。 在一通抓包分析后,百分之99都是用户自己的问题。但频繁的抓包定位问题,严重的压缩了我摸鱼的时间。而且,这套系统采用多实例方式部署在腾X云多个容器中,一个个的登录抓包,真的很烦。 这让我萌生了一个需求: 主动给…
1. 简介 本文介绍使用sync.Once来实现单例模式,包括单例模式的定义,以及使用sync.Once实现单例模式的示例,同时也比较了其他单例模式的实现。最后以一个开源框架中使用sync.Once实现单例模式的例子来作为结尾。 2. 基本实现 2.1 单例模式定义 单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。在整个应用程序中,所有对于这个类的访问都将返回同一个实例对象。 2.2 sync.Once实现单例模式 下面是一个简单的示例代码,使用 sync.Once 实现…
众所周知,Go lang的作用域相对严格,数据之间的通信往往要依靠参数的传递,但如果想在多个协程任务中间做数据通信,就需要通道(channel)的参与,我们可以把数据封装成一个对象,然后把这个对象的指针传入某个通道变量中,另外一个协程从这个通道中读出变量的指针,并处理其指向的内存对象。 通道的声明与创建 package main import "fmt" func main() { var a chan int if a == nil { fmt.Println("通道是空的, 不能使…
0.1、索引 https://blog.waterflow.link/articles/1663688140724 1、简介 单元测试是测试代码、组件和模块的单元函数。单元测试的目的是清除代码中的错误,增加代码的稳定性,在更改代码时提供正确性。单元测试是软件测试的第一级,然后是集成测试和 ui 测试。 2、编写测试代码 首先测试文件的命名必须以_test.go结尾,测试方法必须以Test开头 我们创建一个testexample项目,执行go mod init初始化项目。 然后创建一个uri.go的文件,里面的代码是…
0、转载 go-zero docker-compose 搭建课件服务(四):生成Dockerfile并在docker-compose中启动 0.1源码地址 https://github.com/liuyuede123/go-zero-courseware 1、目前的目录文件结构 目前只是创建好了courseware服务,这一章节我我们先在docker-compose跑通课件服务 . ├── courseware │ ├── api │ │ ├── courseware.api │ │ ├── courseware.…