202201-15 golang分布式链路追踪系统-jaeger安装与简单使用 NEW 简介jaeger是一个比较有名的分布式链路追踪系统,底层用golang实现,兼容opentracing标准。 文档地址:docs github地址:github 官网:website blog:blog部署我们用docker部署,集成整套环境all-in-one,docker地址:https:/... Read More >
202201-14 golang内存对齐 NEW unsafe.Sizeof(x)在Go语言中,我们可以通过 unsafe.Sizeof(x) 来确定一个变量占用的内存字节数(不包含 x 所指向的内容的大小)例如对于字符串数组,在64位机器上,unsafe.Sizeof() 返回的任意字符串数组大小为 24 字节,和其底层数据无关:func main() { s := []string{"1", "2", &qu... Read More >
202201-13 redis延迟队列golang高效实践 NEW 一、背景业务中经常会有这样的场景:到期后自动执行指定操作;查询某个任务是否完成,未完成等待一定时间再次查询;回调通知,当回调失败时,等待后重试;等等还有其他很多类似的场景。很多时候我们会直接通过一个本地定时器来帮我们完成这个任务。如果我们的系统是多实例分布式的,本地定时器就会面临很多问题,如:怎么保证重复处理的问题;统一管控的问题等等。面对本地定时器遇到的问题,我们可以使用分布式延迟队列来实现。这里介绍一种使用golang基于redis实现延迟队列的具体实践。二、实现原理1、... Read More >
202201-12 golang-websockets客户端实现和压测方法 简介使用到的包:github.com/gorilla/websocket案例package main import ( "fmt" "github.com/gorilla/websocket" "log" ... Read More >
202201-11 golang中redis对redigo的发布订阅机制的使用 redigo 对redis的订阅机制放在pubsub.go里面,PubSubConn封装Conn以实现订阅者提供简便方法。Subscribe,PSubscribe,Unsubscribe和PUnsubscribe方法发送和刷新订阅。receive方法将推送的消息转换对应的类型// Receive returns a pushed message as a Subscription, Me... Read More >
202201-10 gorilla/websocket包方法汇总 获取 Conn 实例的方法func (u *Upgrader) Upgrade(w http.ResponseWriter,r *http.Request,responseHeader http.Header)(*Conn , error) 方法 必须通过 Upgrader结构体的实例调用 方法必须传递 w http.ResponseWriter 和 r *http.Req... Read More >
202201-09 高效的IM长连接自适应心跳保活机制 认识长连接长连接的主要作是通过长时间保持双方连接,从而:提高通信速度;确保实时性;避免短时间内重复连接所造成的信道资源和网络资源的浪费。长连接与短连接的区别导致长连接断开的原因1. 长连接所在进程被杀死(这主要说的是移动端);2. NAT超时;3. 网络状态发生变化;4. 其他不可抗因素(网络状态差、DHCP的租期等等 )。下面,我将对每种原因进行分析。具体分析1)原因1:进程被杀死当进程被杀死后,长连接也会随之断开。进程被杀在Andriod端是最常见的问题,限于篇幅就不在此... Read More >
202201-08 长连接为什么需要心跳检测 背景首先,无论是自己设计的长连接还是websocket长连,都需要自己设计心跳机制来维持长连。从应用层协议来看,维持一个建立连接的必要条件似乎就是客户端和服务端均维持双方的连接信息,均用一个结构体来描述连接五元组(协议+源ip+源端口+目的ip+目的端口)。那么,是不是只要双方在应用层保证双方的连接信息不被清掉,就可以一直维护长连接呢。答案自然是否定的,长连接都是建立在TCP协议上的,所以我们先要了解操作系统是如何维护TCP协议连接状态的。TCP 连接状态所谓的TCP连接不是... Read More >
202201-07 开源OpenIM:高性能、可伸缩、易扩展的即时通讯架构 产品体验地址web端体验地址:http://121.37.25.71:23232/pc端下载: https://pan.baidu.com/s/16MW36rKVFtDCBewMOdD0pA 密码: jd15安卓下载:https://www.pgyer.com/OpenIM官方文档:https://doc.rentsoft.cn/github地址:https://github.com/OpenIMSDK/Open-IM-Server网上有很多关于IM的教程... Read More >
202201-06 关于股票除权复权,前复权、后复权、不复权 除权:简单讲就是 让市场上可以流通的股票变多了,每股的权益变少叫除权。假设某公司的总股本100股,每股10元,总权益就是1000元。当公司进行送股,每10股转送10股,总股本就变成了200股,而公司的总权益并没有变,于是每股价格就要变成1000/200=5元。这就是除权。复权:两股合成一股,叫复权,回复股票权利。当股价因送股、配股等原因而发生下跌时,原来10元/股的股票瞬间变成了5元/股,但该股票实际价值并没有发生变化,也就是说现在的5元实际上还是相当于10元。这就是复权。&... Read More >
202201-05 随机指标(KDJ)的计算方法和golang实现 KDJ指标的定义KDJ的另外一个名字叫随机指标,最早是以KD指标的形式出现,而KD指标是在威廉指标的基础上发展起来的,目前是金融市场上最常用的技术分析工具之一。KDJ 指标的原理利用当前股价(包括大盘指数,下同)在近期分布中的相对位置来预测可能发生的趋向拐点。它是利用市场价格真实的波动来反映价格走势的强弱以及超买超卖现象,从而在价格尚未出现明显的上升或下降之前提前发出交易信号,它是捕捉市场价格即将要发生拐点的一种技术工具。KDJ指标的计算方法KDJ指标是一种常用的价格走势判断... Read More >
202201-05 股票中MACD如何计算golang版本 概念 MACD称为指数平滑移动平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA)得到MACD柱。MACD的意义和双移动平均线基本相同,即由快、慢均线的离散、聚合表征当前的多空状态和股价可能的发展变化趋势,但阅读起来更方便。当MACD从负数转向正数,是买的信号。当MACD从正数转向负数,是卖的信号。当MA... Read More >
202201-04 go自定义包引入,报错包找不到的问题 背景从github下载了一个项目想运行下,发现找不到自己写的包,一直报错build command-line-arguments: cannot find module for path xxx目录结构stockIndicator indicator price.go &nb... Read More >
202201-03 livego介绍、安装、使用详解 前言写这篇文章主要是因为希望找到一个简单的方式实现直播功能,在度娘上找到livego(我平时写php和前端的,不懂golang),感觉安装部署都很方便,即使不懂golang的同学,只要有一定Linux和web后端开发知识都能搭建自己的直播服务。但是livego的文档的确比较少,然后对于我这个面向搜索引擎开发的菜鸟来说,连度娘也只找到为数不多的几篇相关博客文章,所以最后只能自己看GitHub的issue和反复测试趟坑,最后打算记录一下自己的趟坑过程也分享一下给各位小伙伴,希望对... Read More >
202201-02 什么是OBS(OBS直播推流操作步骤,看完就懂) 什么是 OBS? Open Broadcaster Software 是一款好用的互联网流媒体直播内容输入作软件。 OBS 使用是否收费? 不收费,这个程序和它的源代码都是免费的。 OBS 都支持哪些操作系统? 支持 OS X、Windows、Linux 操作系统。适用于多种直播场景。满足大部分直播行为的操作需求。 一、前期准备 直播间布置 参考:直播间布置手册:https://www.yuque.com/docs/share/555b3... Read More >
202201-01 一篇文章搞清楚直播协议RTMP 说起RTMP协议,相信很多人都比较陌生,这个协议相对HTTP、HTTPS、TCP等我们常见的协议而言,我们在工作中确实较少接触它,但是对现在如火如荼的直播行业,RTMP是一个重要的协议,它在实时音视频场景中使用非常广泛,而且目前市占率很高。本文的主要内容是分析RTMP的协议,当然不是纯理论分析,这样没多大意思,还是结合实践抓包文件来具体分析,这样才能较好地理解RTMP的内涵。具体如何抓包见本文末尾的“Android抓包”模块。希... Read More >
202102-01 golang定时任务库cron 简介在Linux中,Cron是计划任务管理系统,通过crontab命令使任务在约定的时间执行已经计划好的工作,例如定时备份系统数据、周期性清理缓存、定时重启服务等。本文介绍的cron库是一个用于管理定时任务的库,就是用Go实现Linux中crontab命令的相似效果。快速使用文本代码使用 Go Modules。创建目录并初始化:$ mkdir cron && cd cron $ go mo... Read More >
202101-29 gorm中查询范围scope详解 介绍Scopes 使你可以复用通用的逻辑,共享的逻辑需要定义为 func(*gorm.DB) *gorm.DB 类型实战func AmountGreaterThan1000(db *gorm.DB) *gorm.DB { return db.Where("amount > ?", 1000) } func P... Read More >
202101-28 gin获取http中的body参数 post发送数据有几种形式,form和流是最常用的。特别是在程序里使用httpclients,一般都算通过流发送。在php里,是通过php://input来获取的。在gin中,可以通过c.Request.Body.Read(buf)。具体代码如下:package main import ( "fmt" "net... Read More >
202101-27 gorm没有deleted_at的查询如何去掉这个条件判断之unscoped 背景当tableStruct内部有gorm.Model时,默认的查询语句都会包含 deleted_at IS NULL 的判断,如何不限制这个条件呢?原理分析gorm.Model 是一个包含一些基本字段的结构体, 包含的字段有 ID,CreatedAt, UpdatedAt, DeletedAt解决方法1. Unscoped方法model.Db.Debug().Unscoped().Where(map[string]interface{}{"id":&nb... Read More >