依赖注入是一个经典的设计模式,可有效地解决项目中复杂的对象依赖关系。

对于有反射功能的语言来说,实现依赖注入都比较方便一些。在 Golang 中有几个比较知名的依赖注入开源库,例如 google/wireuber-go/dig 以及 facebookgo/inject 等。

本文将基于 facebookgo/inject 介绍依赖注入, 接下来将会着重讨论以下几点内容:

  1. 依赖注入出现的背景以及解决的问题
  2. facebookgo/inject 的使用方法
  3. facebookgo/inject 的缺陷
阅读全文 »

本文将基于 Golang 源码对 Timer 的底层实现进行深度剖析。主要包含以下内容:

  1. Timer 和 Ticker 在 Golang 中的底层实现细节,包括数据结构等选型。
  2. 分析 time.Sleep 的实现细节,Golang 如何实现 Goroutine 的休眠。

注:本文基于 go-1.13 源码进行分析,而在 go 的 1.14 版本中,关于定时器的实现略有一些改变,以后会再专门写一篇文章进行分析。

阅读全文 »

Elasticsearch 是一个分布式搜索引擎,底层基于 Lucene 实现。Elasticsearch 屏蔽了 Lucene 的底层细节,提供了分布式特性,同时对外提供了 Restful API。Elasticsearch 以其易用性迅速赢得了许多用户,被用在网站搜索、日志分析等诸多方面。由于 ES 强大的横向扩展能力,甚至很多人也会直接把 ES 当做 NoSQL 来用。

本文主要记录了 ES 的一些必要的基础知识,也是自己在学习和使用 ES 的一些总结。当然,要系统和深入学习还是要依靠官方文档:Elasticsearch Reference 和不断地实践。

本文会涉及以下内容:

  1. ES 的基本概念讲解
  2. 如何通过 ES 增删数据以及批量修改
  3. ES 基本的查询和搜索功能、高亮关键词搜索以及多索引查询功能
阅读全文 »

本文整理和记录下自己在运营 个人博客 以及公众号时常使用到的一些工具。主要包含以下方面:

  1. 中英文空格的自动排版
  2. 微信公众号如何使用 markdown 发布
  3. 绘图工具
  4. 图片压缩工具
  5. 如何测试网站的打开速度以及针对性优化
阅读全文 »

channel 是 Golang 中一个非常重要的特性,也是 Golang CSP 并发模型的一个重要体现。简单来说就是,goroutine 之间可以通过 channel 进行通信。

channel 在 Golang 如此重要,在代码中使用频率非常高,以至于不得不好奇其内部实现。本文将基于 go 1.13 的源码,分析 channel 的内部实现原理。

阅读全文 »

定时器是网络框架中非常重要的组成部分,往往可以利用定时器做一些超时事件的判断或者定时清理任务等。

定时器有许多经典高效的实现。例如,libevent 采用了最小堆实现定时器,redis 则结合自己场景直接使用了简单粗暴的双向链表。

时间轮也是一种非常经典的定时器实现方法。Linux 2.6 内核之前就采用了多级时间轮作为其低精度定时器的实现。而在微信的协程库 libco 中,则用了单级时间轮来管理其内部的超时事件。

在 libco 的时间轮实现中,对超时事件的添加删除查询操作均可以达到 O(1) 的时间复杂度,是一个非常高效的数据结构。

同时,最新版的 libco 时间轮也支持了无限超时时间,见下文。

阅读全文 »