go
文章平均质量分 53
1024-iot-SaltIce
熟悉Go与Java语言,目前主要使用golang,喜欢对微服务系统开发与设计,以及云原生的学习,和中间件的开发。
展开
-
使用 redis scan 踩了大坑记录
业务中有一个需求需要将数据先缓存到redis中以应对高并发的问题,然后后台定时的去将这些数据落盘mysql,叮叮当当的开发自测完成,经过测试大佬对业务功能测试和压测通过后,就马不停蹄的上线了,然而,刚上线不久,就发现服务cpu和内存占用持续升高,但没有达到100%,一只保持较高的水平。经过对服务pprof采集分析,发现居然是这个需求代码中的定时任务占用了大量的cpu占用。原创 2022-10-29 17:17:41 · 419 阅读 · 1 评论 -
Golang error 处理思路分享【详】
针对golang中 error 的处理思路原创 2022-10-15 14:43:27 · 1711 阅读 · 0 评论 -
Go AOP注解实现开源框架
记录Go相关开源AOP实现框架基于ast语法解析和monkey动态代理实现类似Java的注解,提供事务注解demo: https://github.com/handsomestWei/go-annotation【易懂】开课啦教育公司相关同学写了一个扫描代码的工具,在每个 RPC 服务方法前加上对应的注释,从而在服务启动前通过扫描注释生成元数据https://github.com/jack15083/dubbo-go-proxy-tool【秀】golangAnnotations工具将go原创 2021-11-07 22:19:35 · 1596 阅读 · 0 评论 -
怎么查看Go中全局变量存储的位置?
创建main.gopackage mainimport "fmt"var xxx = 0xEE // 通过值来推断类型var yyy int = 0xFF // 定义类型,并赋值var zzz int // 定义变量var ddd *intfunc main() { xxx = 0x11 yyy = 0x22 zzz = 0x33 k := 10 ddd = &k fmt.Println(xxx, yyy, zzz)}原创 2021-11-07 16:15:59 · 930 阅读 · 0 评论 -
Go ants中的指数退避算法抢锁技巧
首先看一下指数退避算法的维基百科解释看不了的直接看图片吧在go 协成池框架中有一把巧妙的锁:spinLockimport ( "runtime" "sync" "sync/atomic")type spinLock uint32const maxBackoff = 64func (sl *spinLock) Lock() { backoff := 1 // 巧妙之处 for !atomic.CompareAndSwapUint32((*uint32)(sl), 0, 1)原创 2021-10-22 22:02:29 · 644 阅读 · 0 评论 -
Go 指针陷阱
Go 指针陷阱uintptr被GC当做普通整数对象,不会阻止所“引用”的对象被回收package mainimport ( "time" "unsafe")type data struct { x [1024 * 100]byte}func test() uintptr { p := &data{} return uintptr(unsafe.Pointer(p))}func main() { const N = 10000 cache := new([N]ui原创 2021-10-21 12:35:53 · 675 阅读 · 0 评论 -
Go Docker镜像压缩减少体积【资料整理】
Docker镜像太大压缩减少99%原创 2021-10-14 20:52:39 · 257 阅读 · 0 评论 -
Go汇编入门资料【强!!!】
1. 汇编角度看go2. 《plan9 汇编入门,带你打通应用和底层》讲义3. 《plan9 汇编入门,带你打通应用和底层》视频地址【这B站里面有很多Go夜读活动视频可以学习】4. 曹大go源码阅读5. 曹大源码阅读【汇编篇】6. 曹大博客7. 字节开源性能强悍的工具库,里面用了不少汇编go tool compile -S生成的汇编代码中,常见的寄存器解释如下:PC:程序计数器,指下一步要执行的程序,伪寄存器PC和硬件寄存器PC作用差不多。SP:指向当前栈帧的栈顶。但是生成的汇编代码中都原创 2021-10-11 22:56:15 · 774 阅读 · 0 评论 -
SI-MQTT集群消息处理
SI-MQTT MQTT v5 Broker此si-mqtt提供了一种比较开放的集群消息处理方式:集群消息发送只开放一个方法,负责发送publish、subscribe、unsubscribe msg.// SendMsgToCluster 发送消息到集群// shareName 共享主题组// targetNode 目标节点// 这两个参数用于集群共享主题消息发送到特定的节点func SendMsgToCluster(msg messagev5.Message, shareName, t原创 2021-10-02 16:42:43 · 1009 阅读 · 0 评论 -
Go易产生的并发Bug记录
参考地址:https://gocn.vip/topics/125291. 该 bug 来自 etcd 项目,由于误用 WaitGroup 导致的非阻塞 bug1 func(p *peer) send() {2 p.mu.Lock()3 defer p.mu.Unlock()4 switch p.status {5 case idle:6 + p.wg.Add(1)7 go func() {.原创 2021-09-09 09:34:14 · 892 阅读 · 0 评论 -
GO项目性能优化大赏
本文旨在记录工作、学习过程中遇到的性能优化技巧,会不停的添加内容常规手段1.sync.Pool临时对象池应该是对可读性影响最小且优化效果显著的手段。基本上,业内以高性能著称的开源库,都会使用到。最典型的就是fasthttp了,它几乎把所有的对象都用sync.Pool维护。但这样的复用不一定全是合理的。比如在fasthttp中,传递上下文相关信息的RequestCtx就是用sync.Pool维护的,这就导致了你不能把它传递给其他的goroutine。如果要在fasthttp中实现类似接受请求-&g.原创 2021-08-27 12:51:19 · 1505 阅读 · 0 评论 -
//go:开头的注释学习
看go源码时,会经常看到很多这种 go:xxx 的注释//go:linkname reflect_typehash reflect.typehash//go:noescape//go:nosplit//go:nowritebarrierrec//go:yeswritebarrierrec//go:noinline//go:norace通过网上冲浪收集整理的知识如下://go:linkname localname [importpath.name]使用[importpath.name]原创 2021-08-20 11:50:18 · 1189 阅读 · 0 评论 -
SI-MQTT-v5版协议报文编解码实现
MQTT 控制报文编解码实现初版,还有许多协议细节未处理,正在完善中,欢迎共同参与有错误欢迎指出修改哦connectconnackpublishpubackpubrecpubrelpubcompsubscribesubackunsubscribeunsubackpingreqpingrespdisconnectauth...原创 2021-08-19 11:19:22 · 950 阅读 · 0 评论 -
MQTT协议之剩余长度编解码算法实现
MQTT协议中,剩余长度使用的是一种变长度的编码方案,其剩余长度 = 可变报头长度 + 负载长度。所以剩余长度最少占用1个字节,最多占用4个字节。下图就是MQTT协议中总结的剩余长度不同的取值范围,对应所占用的字节数。而这些范围对应到具体数据的编解码由下面的算法来实现。下图是从MQTT协议中copy的其编码解码算法MQTT采用大端序列传输数据,想知道自己计算机是大端还是小端可以通过一个int64的数据1,左移大于32位,强转为byte,看看是0还是大于0的,是0就是大端的一个字节包含8原创 2021-08-07 09:48:29 · 1227 阅读 · 0 评论 -
Golang:MQTT服务集群共享主题设计【通配符实现篇】
接上篇的初步思路,可以通过这样的方式获取所有的需要匹配的订阅主题接下来实现一波// 获取需要匹配的主题,简单方式,没有考虑性能了,怎么简单怎么来// 下面可优化的地方太多了,性能不是很好func matchTopicS(topic string) []string { tp := strings.Split(topic, "/") ret := list.New() ret.PushBack(tp[0]) // 直接限制订阅主题第一个不能是通配符,并且不能是单纯一个/,所以该方法就.原创 2021-04-08 00:09:04 · 1314 阅读 · 1 评论 -
Golang:MQTT服务集群共享主题设计
前言:本次设计的支持集群的共享订阅的思路,还存在缺陷,无法支持通配符订阅,正在努力实现中,敬请期待,或者有好的点子,欢迎分享哦,谢谢各位。具体实现用在了该项目中集群共享订阅单机共享订阅是非常容易实现的,代码改动也比较小,但是我们今天的角色不是单机的共享订阅,而是集群的我们采用一个简单的方式来实现部分功能,使用redis的set+hash具体结果如下图:订阅主题订阅主题时,需要一条lua脚本向redis中操作两个key,分别操作数据set 的key中往topic key中添加该shar原创 2021-04-03 22:14:39 · 2329 阅读 · 2 评论 -
Golang:Go 网络包默认值下的陷阱
Go 网络包默认值下的陷阱超时时间HTTP响应主体HTTP / 1.x保持活动连接池验证URIDNS缓存伪装的DualStacknet.Dial()错误net.IP 是可变的奖励:GOMAXPROCS,容器和CFS超时时间设置它们!网络不可靠,并且标准库默认客户端和服务器未设置其主要超时,并且所有这些都将零值解释为引导的无穷大。超时取决于用例,Go核心团队已避免进行任何笼统的概括。注意:这也包括对包级别便利功能的所有使用: http.Get客户端朋友http.ListenAn翻译 2021-03-31 22:24:25 · 1449 阅读 · 0 评论 -
Golang:深入理解 errgroup
深入理解 errgroup原文,此处只是做记录学习使用前言我们平时使用go来并发操作时,在主协程需要等待其他协成完成后才会继续执行的情况,我们会使用sync.WaitGroup 来进行操作。在一个 goroutine 需要等待多个 goroutine 完成和多个 goroutine 等待一个 goroutine 干活时都可以解决问题。虽然 WaitGroup 已经做了很好的封装,但是仍然存在一些问题,例如如果需要返回错误,或者只要一个 goroutine 出错我们就不再等其他 goroutin转载 2021-03-31 22:20:46 · 719 阅读 · 0 评论 -
Golang:Go如何知道time.Now的时间
Go如何知道时间。大约时间首先,它是非常有用的了解。该time.Time结构可以表示具有纳秒精度的时间瞬间。为了更可靠地测量经过的时间以进行比较,加法和减法,time.Time还可以包含当前过程单调时钟的可选的,纳秒级精度的读数。这是为了避免报告错误的持续时间,例如。如果是DST。type Time struct { wall uint64 ext int64 loc *Location}imeime结构在2017年初采用了这种形式。您可以浏览Russ Cox自己浏览的相关问题,建议和翻译 2021-03-31 22:10:10 · 1399 阅读 · 0 评论 -
Golang:监听binlog日志
package binlog_testimport ( "fmt" "github.com/json-iterator/go" "github.com/siddontang/go-mysql/canal" "github.com/siddontang/go-mysql/schema" "reflect" "runtime/debug" "strings" "testing" "time")func TestBinLog(t *testing.T) { go binLogList原创 2021-03-26 09:46:22 · 2915 阅读 · 0 评论 -
Golang:请求合并
请求合并学习golang.org/x/sync/singleflight的代码记录// 请求合并package req_mergeimport ( "errors" "fmt" "runtime" "sync")type Group struct { sync.Mutex m map[string]*call}// 每个相同请求的回调type call struct { wg sync.WaitGroup val interface{} // 函数返回值,只会写入一次,原创 2021-03-24 13:00:51 · 1234 阅读 · 0 评论 -
go语言的MQTT服务器(一)
go语言的MQTT服务器这是一个通过对已经很久没有维护的项目https://github.com/zentures/surgemq进行二次开发的mqtt服务器开发初衷最初为了去了解学习mqtt,特在网上找了几个go语言的mqtt开源服务器,但是,不是运行有问题,就是协议支持不完善,好不容易找到这个,但是很久没有维护了。经过考虑,还是拿这个当做基础开发。基础功能支持支持QOS 0、1和2...原创 2020-03-07 21:44:23 · 7037 阅读 · 1 评论 -
QUIC协议试触-节点通信协议参考
从某歌网站了解到,QUIC协议可能会成为未来的HTTP3协议的方向,这是一个使用UDP协议来达到TCP的效果,甚至某些方面更优,但是这家伙是以UDp为基础的,还是会存在UDP的一些不足,比如:安全问题,也就是反射攻击,即伪造原地址;还有就是这些年性能的优化提升都几乎针对 TCP ,使得 UDP 性能没有啥改进。当然随着 QUIC3 的发布,相信后续应该会有相对的投入。想利用该协议来实现节点间数据通信,顾实验一番,下面有啥错误的地方,一定要指出来哦,感谢大家:我是使用了这个go库来玩的:github.c原创 2021-03-07 22:32:38 · 1145 阅读 · 0 评论 -
Golang:运行时动态生成你想要的Struct
package my_structimport ( "errors" "reflect")// 构造器type Builder struct { // 用于存储属性字段 fileId []reflect.StructField}func NewBuilder() *Builder { return &Builder{}}// 添加字段func (b *Builder)AddField(field string,typ reflect.Type) *Builder {原创 2021-02-26 00:08:17 · 6208 阅读 · 5 评论 -
Golang: 高效截取的字符串
当我们需要从一串很长的字符串中获取一部分时,是不是有点恼火,特别是有中文在里面的时候,就是那些一个字符占几个字节的数据。字节切片截取的方式我们可能会常做的事就是像这样:s := "abcdefghijk"fmt.Println(s[1:4])这样获取字符串部分数据傻没毛病,正常情况下,golang中字符串是不变的,我们直接采取这种方式可以达到我们的目的。我们知道这是按字节截取,在处理 ASCII 单字节字符串截取,没有什么比这更完美的方案了,但是当我们的字符串中出现了中文数据,中文往往占多个字原创 2021-02-25 20:48:26 · 4021 阅读 · 0 评论 -
Golang:atomic包怎么对uint64/uint32进行减法
学习atomic包时,发现一个有趣的东西:unsafe.Pointer类型,该包并未提供进行原子加法操作的函数。uint*类型怎么做减法运算?我们来看第2点:var a int64 = 10atomic.AddInt64(&a,-3)fmt.Println(a)结果很明显是:7但是当我们对uint*进行减法运算时:var b uint64 = 10atomic.AddUint64(&b,-3)fmt.Println(b)直接这样写会使 Go 语言的编译器报错,原创 2021-02-23 21:59:23 · 2866 阅读 · 1 评论 -
GoMQTT服务器 节点路由树设计
GoMQTT服务器 节点路由树设计第一章 节点路由树设计文章目录GoMQTT服务器 节点路由树设计思路一、节点路由树设计二、代码1. 主题节点添加与删除总结思路采用节点路由树来管理mqtt消息需要发送到哪些节点上去,当该节点有消息需要转发到其他节点时,查找该表,得到需要转发的节点信息,再转发。当然,可以为了性能优化:不一定有通配符和没有通配符都采用路由树,可以通过对没有通配符的主题进行hash,来查找相应的节点,这个需要仔细考虑一下,我暂时只是有这个想法。添加节点到主题上去,采用对应的主原创 2020-09-09 18:20:04 · 1174 阅读 · 0 评论 -
GoMQTT服务器 tcp处理粘包问题
GoMQTT服务器 tcp处理粘包问题第一章 tcp处理粘包问题写的不好,请指出,目前还在学习当中文章目录GoMQTT服务器 tcp处理粘包问题前言一、问题显示1.服务器代码2.客户端代码3.问题二、分析1.为什么会出现粘包2.解决办法编解码修改服务端代码修改客户端代码服务端接收数据效果前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例原创 2020-09-04 13:45:07 · 1731 阅读 · 0 评论 -
学习网站强大的收纳方法
你还在为找不到之前访问的学习网址而烦恼吗?接下来,看一个app,将你所有的学习网站统统放到一个app里面,再也不用担心妈妈找不到我的学习网站啦。下面是我自己制作的一个,把我自己的收藏网站放到里面,方便在坐车、排队、等人的时候掏出洛基亚学习学习啦。看官要是不会使用该软件,小弟可免费帮你制作直接私信给我即可啦!需求:各位看官可以免费发一点你们收藏的学习网站给我不,就发在评论区就行啦!小弟主要是需要JAVA、Go、MySQL、Redis、Netty、SpringBoot、SpringCloud、大数据原创 2020-06-03 17:54:44 · 342 阅读 · 1 评论 -
go语言MQTT服务器(五)MQTT服务器集群
go语言MQTT服务器(五)MQTT服务器集群GOMQ服务器,写的不好,别见外一、节点间数据交互端口配置二、配置两个节点,上面的节点间数据交互端口图也要修改里面的三个参数三、MQTT.fx测试工具测试:连接配置,分别连接不同的节点四、mq消息发布,两个都订阅同一个主题,其中一个推送数据到这个主题上去,可见两个都接收到了数据五、Nginx负载均衡可通过我前几篇的Nginx配置,...原创 2020-03-18 22:55:51 · 2726 阅读 · 0 评论 -
go语言MQTT服务器(四)集群设计思考
go语言MQTT服务器(四)集群设计思考以下是我自己的想法,本人学生一枚,思考的较浅,,如有什么错误或者遗落的,望多多指导一下,谢谢。一、集群session处理当一个客户端通过nginx负载后连接到broker1时,会产生一条session,保存会话信息(相应的主题与路由表改变,这里不先谈)。当客户端断线重连时,可能会连接到其它broker,如broker2,如果断线前的那个连接没有选择清理...原创 2020-03-17 12:49:32 · 1488 阅读 · 0 评论