自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

稻草人技术博客

Keep Calm and Carry On

  • 博客(563)
  • 论坛 (4)
  • 收藏
  • 关注

转载 分布式系统一致性问题与Raft算法

什么是分布式一致性问题首先,什么是分布式系统一致性问题?分布式系统这个词应该不用多解释,简单地说就是由多个节点(一个节点即一台物理机器或一个进程),异步得通过网络通讯而组成的系统。而一致性(Consistency),这个词在不同的场景下有不同的含义,比方说大家比较熟的应该是在关系型数据库中事务的一致性。但在分布式系统中,一致性的基本含义是对进行进行一个或多个操作指令之后,系统内的其他成员对这些操作指令的结果能够达成共识,也就是对结果的看法是一致的。举个例子,比方说有多个客户端,这些客户端出于某种原因,

2020-11-20 17:25:12 82

转载 sarama 源码学习

ConsumerGroupKafka 消费的过程似乎大致上可以分为 ConsumerGroup 的 Rebalance 协议和 Partition 消费协议两部分,这里先看 ConsumerGroup 部分。ConsumerGroup 的 Rebalance 是 Kafka 消费侧扩展性的体现,通过将 Partition 分配给 Consumer 实现扩展消费能力,在增加 Consumer 时执行 Rebalance,将 Partition 重新均摊给新加入的 Consumer,是一个 pre-shar

2020-11-10 15:43:59 149 1

转载 Go 函数选项模式

Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更详细的配置.在很多语言中这很容易; 在 C 族语言中, 可以使用不同数量的参数提供相同函数的多个版本; 在像 PHP 这样的语言中, 可以给参数一个默认值,并在调用方法时忽略它们. 但是在 Golang 中, 这两种方式你哪个也用不了. 那么你如何创建一个函数, 用户可以指定一些额外的配置?有很多可能的方法可以做到这一点, 但是大

2020-10-28 17:50:56 42

转载 如何实现一个延迟队列

前言延迟队列是我们日常开发过程中,经常接触并需要使用到的一种技术方案。前些时间在开发业务需求时,我也遇到了一个需要使用到延迟消息队列的需求场景,因此我也在网上调研了一系列不同的延迟队列的实现方案,在此进行了一个总结并且给大家进行分享。延迟队列定义首先,队列这种数据结构相信大家都不陌生,它是一种先进先出的数据结构。普通队列中的元素是有序的,先进入队列中的元素会被优先取出进行消费;延时队列相比于普通队列最大的区别就体现在其延时的属性上,普通队列的元素是先进先出,按入队顺序进行处理,而延时队列中的元素在

2020-10-26 20:36:57 98

转载 Go中json.Unmarshal对数字类型的处理

JSON的规范中,对于数字类型,并不区分是整型还是浮点型。对于如下JSON文本:{ "name": "ethancai", "fansCount": 9223372036854775807}如果反序列化的时候指定明确的结构体和变量类型package mainimport ( "encoding/json" "fmt")type User struct { Name string FansCount int64}func m

2020-10-20 11:34:42 288

转载 Go context 超时控制

常见方法context.WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) // 指定时长超时结束context.WithCancel(parent Context) (ctx Context, cancel CancelFunc) // 手动结束context.WithDeadline(parent Context, d time.Time) (Context, CancelFunc) // 指定时间结束

2020-09-17 15:33:58 138

转载 Go 在orm中使用反射

作为静态语言,golang 稍显笨拙,还好 go 的标准包reflect(反射)包弥补了这点不足,它提供了一系列强大的 API,能够根据执行过程中对象的类型来改变程序控制流。本文将通过设计并实现一个简易的 mysql orm 来学习它,要求读者了解mysql基本知识,并且跟我一样至少已经接触 golang 两到三个月。orm 这个概念相信同学们都非常熟悉,尤其是写过rails的同学,对active_record的强大肯定深有体会(得益于的method_missing和define_method方法,少写了

2020-09-14 21:49:15 74

转载 Go 语言中Select与for结合使用break

func test(){ i := 0 for { select { case <-time.After(time.Second * time.Duration(2)): i++ if i == 5{ fmt.Println("break now") break } fmt.Println("i

2020-09-14 17:14:38 141

转载 Go并发模型:合理退出并发协程

目录说明master:使用stop通道,主动告知goroutine退出stop_channel:和master相同detect_close_channel: 示例可以使用for-range替代for-select,range能检测通道关闭,自动退出detect_close_channel_v2:在前一个基础上,增加了监控功能,必须使用for-select,使用ok方法检测通道关闭,退出协程goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这

2020-09-14 14:40:01 171

转载 Go并发模型:流水线模型

Go作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,Go并发模型有多种模式,通过流水线模型系列文章,你会更好的使用Go的并发特性,提高的程序性能。这篇文章主要介绍流水线模型的流水线概念,后面文章介绍流水线模型的FAN-IN和FAN-OUT,最后介绍下如何合理的关闭流水线的协程。Golang的并发核心思路Golang并发核心思路是关注数据流动。数据流动的过程交给channel,数据处理的每个环节都交给goroutine,把这些流程画起来,有始有终形成一条线,那就能构成流水线模型。但

2020-09-14 14:31:55 90

转载 全面认识高并发

高并发,几乎是每个程序员都想拥有的经验。原因很简单:随着流量变大,会遇到各种各样的技术问题,比如接口响应超时、CPU load升高、GC频繁、死锁、大数据量存储等等,这些问题能推动我们在技术深度上不断精进。在过往的面试中,如果候选人做过高并发的项目,我通常会让对方谈谈对于高并发的理解,但是能系统性地回答好此问题的人并不多,大概分成这样几类:1、对数据化的指标没有概念:不清楚选择什么样的指标来衡量高并发系统?分不清并发量和QPS,甚至不知道自己系统的总用户量、活跃用户量,平峰和高峰时的QPS和TPS等关键

2020-09-14 12:04:26 118

转载 Go 依赖注入库dig

简介今天我们来介绍 Go 语言的一个依赖注入(DI)库——dig。dig 是 uber 开源的库。Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring。相比庞大的 Spring,dig 很小巧,实现和使用都比较简洁。快速使用第三方库需要先安装,由于我们的示例中使用了前面介绍的go-ini和go-flags,这两个库也需要安装:$ go get go.uber.org/dig$ go get gopkg.in/ini.v1$ go get github.

2020-09-13 17:15:37 111

转载 Golang视角下的设计模式

这篇文章想聊聊Golang语言下的设计模式问题,我觉得这个话题还是比较有意思的。Golang没有像java那样对设计模式疯狂的迷恋,而是摆出了一份“看庭前花开花落,望天空云卷云舒”的姿态。单例模式:Gloang的单例模式该怎么写?随手写一个,不错,立马写出来了。但这个代码有什么问题呢?多个协程同时执行这段代码就会出现问题:instance可能会被赋值多次,这段代码是线程不安全的代码。那么如何保证在多线程下只执行一次呢?条件反射:加锁。。。加锁是可以解决问题。但不是最优的方案,因为如果有1W并发,每一个线

2020-09-09 21:19:49 55

转载 Elasticsearch理解

生活中的数据搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种:结构化数据非结构化数据结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。非结构化数据:又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、Word 文档,邮件,各类报表、图片和咅频、视频信息等。说明:如果要更细致

2020-09-07 22:58:54 79

转载 Go context详解

什么是 contextGo 1.7 标准库引入 context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。随着 context 包的引入,标准库中很多接口因此加上了 context 参数,例如 database/sql 包。context 几乎成为了并发控制和超时控制的标准做法。context.Context

2020-09-04 19:45:29 449

原创 Golang test编译使用

创建文件my_test.gopackage testsimport "testing"func TestMy(t *testing.T) { t.Log("TestMy")}通常用法:$ go test -v -run TestMy my_test.go=== RUN TestMy TestMy: my_test.go:6: TestMy--- PASS: TestMy (0.00s)PASSok command-line-arguments 0.619s

2020-07-23 12:27:13 265

转载 一个秒杀系统的设计思考

前言秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大流量的秒杀系统需要进行哪些关注,就是本文讨论的话题。整体思考1 秒杀存在的问题对于一个日常平稳的业务系统,如果直接开通秒杀功能...

2020-04-27 23:22:15 596

转载 TCP 为什么三次握手

参考文章Why do we need a 3-way handshake? Why not just 2-way大部分网络博客的错误解读首先需要声明的是, 百度搜索到的大部分网络博客关于这个问题的解答都是不清晰或者不准确的。 讨论这个问题的大部分博客都会引用《计算机网络》的内容:防止已失效的连接请求又传送到服务器端,因而产生错误不幸的是, 这种解释是不准确的, TCP 采用三次握手的...

2020-04-23 11:31:30 152

转载 UDP如何实现可靠性传输

1 UDP与TCP的区别TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP是User Datagram Protocol,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。可靠性由上层应用实现,所以要实现udp可靠性传输,必须通过应用层来实现和控制。2 TCP如何实现可靠性传输?确认机制、...

2020-04-17 16:51:17 513

转载 TCP和UDP的区别

TCP与UDPTCP与UDP基本区别基于连接与无连接TCP要求系统资源较多,UDP较少;UDP程序结构较简单流模式(TCP)与数据报模式(UDP);TCP保证数据正确性,UDP可能丢包TCP保证数据顺序,UDP不保证UDP应用场景:面向数据报方式网络数据大多为短消息拥有大量Client对数据安全性无特殊要求网络负担非常重,但对响应速度要求高编程时的区别soc...

2020-04-17 16:27:05 121

转载 tcpdump常用命令

tcpdump 参数-c <number>: 指定抓包个数tcpdump -c 2tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on atcp_veth0, link-type EN10MB (Ethernet), capture size 65535 by...

2020-04-17 16:19:16 192

转载 Nginx 架构原理

简介Nginx(发音为“engine X”)是由俄罗斯人 Igor Sysoev 编写的一个免费的、开源的、高性能的 HTTP 服务器和反向代理,也是一个电子邮件(IMAP/POP3/SMTP)代理服务器,其特点是占有内存少,并发能力强。Nginx 因为它的稳定性、丰富的模块库、灵活的配置和较低的资源消耗而闻名 。目前 Nginx 已经被 F5 收购。Nginx由内核和一系列模块组成,内核提...

2020-04-17 13:45:20 189

转载 微服务下实现数据一致性

本人最近学习了一下微服务下数据一致性的特点,总结了下目前的保障微服务下数据一致性的几种实现方式如下,以备后查。此篇文章旨在给大家一个基于微服务的数据一致性实现的大概介绍,并未深入展开,具体的实现方式本人也在继续学习中,如有错误,欢迎大家拍砖。1. 传统应用的事务管理1.1 本地事务再介绍微服务下的数据一致性之前,先简单地介绍一下事务的背景。传统单机应用使用一个RDBMS作为数据源。应用开启事...

2020-04-15 22:21:41 121

转载 使用 Gomock 进行单元测试

在实际项目中,需要进行单元测试的时候。却往往发现有一大堆依赖项。这时候就是 Gomock 大显身手的时候了Gomock 是 Go 语言的一个 mock 框架,官方的那种。安装$ go get -u github.com/golang/mock/gomock$ go install github.com/golang/mock/mockgen第一步:我们将安装 gomock 第三方库和...

2020-04-12 22:26:29 1476

转载 什么是真正的架构设计

一. 什么是架构和架构本质在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这个世界的基础,并用来沟通的手段,如果对架构概念理解不一样,那沟通起来自然不顺畅。Linux有架构,MySQL有架构,JVM也有架构,使用Java开发、MySQL存储、跑在Linux上的业务系统也有架...

2020-04-12 22:08:04 215

转载 分布式事务解决方案

前言最近很久没有写博客了,一方面是因为公司事情最近比较忙,另外一方面是因为在进行 CAP 的下一阶段的开发工作,不过目前已经告一段落了。接下来还是开始我们今天的话题,说说分布式事务,或者说是我眼中的分布式事务,因为每个人可能对其的理解都不一样。分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免,本文就分布式事务来简...

2020-04-12 16:18:45 99

转载 亿级规模的 Feed 流系统设计

简介Feed流是Feed + 流,Feed的本意是饲料,Feed流的本意就是有人一直在往一个地方投递新鲜的饲料,如果需要饲料,只需要盯着投递点就可以了,这样就能源源不断获取到新鲜的饲料。 在信息学里面,Feed其实是一个信息单元,比如一条朋友圈状态、一条微博、一条咨询或一条短视频等,所以Feed流就是不停更新的信息单元,只要关注某些发布者就能获取到源源不断的新鲜信息,我们的用户也就可以在移动设备...

2020-04-12 15:45:21 175

转载 Go调试工具Delve

安装首先你必须有等于或高于1.8版本的Go,我的版本是:userdeMBP:go-learning user$ go versiongo version go1.11.4 darwin/amd64我是用的是Mac,所以使用的是OSX安装方法:然后使用go get 进行安装:go get -u github.com/go-delve/delve/cmd/dlv使用这种方法,你将无法...

2020-04-10 17:43:48 405

转载 HTTP/2笔记之流和多路复用

前言本部分将讲解HTTP/2协议中对流的定义和使用,其实就是在说HTTP/2是若何做到多路复用的。流和多路复用的关系1. 流的概念流(Stream),服务器和客户端在HTTP/2连接内用于交换帧数据的独立双向序列,逻辑上可看做一个较为完整的交互处理单元,即表达一次完整的资源请求-响应数据交换流程;一个业务处理单元,在一个流内进行处理完毕,这个流生命周期完结。特点如下:一个HTTP/2...

2020-04-10 15:06:51 96

转载 如何设计一个安全的对外接口

最近有个项目需要对外提供一个接口,提供公网域名进行访问,而且接口和交易订单有关,所以安全性很重要;这里整理了一下常用的一些安全措施以及具体如何去实现。安全措施个人觉得安全措施大体来看主要在两个方面,一方面就是如何保证数据在传输过程中的安全性,另一个方面是数据已经到达服务器端,服务器端如何识别数据,如何不被攻击;下面具体看看都有哪些安全措施。1. 数据加密我们知道数据在传输过程中是很容易被抓...

2020-04-09 22:47:26 128

转载 Go堆排序

package mainimport "fmt"// Heap 定义堆排序过程中使用的堆结构type Heap struct { arr []int // 用来存储堆的数据 size int // 用来标识堆的大小}// adjustHeap 用于调整堆,保持堆的固有性质func adjustHeap(h Heap, parentNode int) ...

2020-04-09 22:24:44 90

转载 从源码透析gRPC调用原理

gRPC是如何work的,清楚的理解其调用逻辑,对于我们更好、更深入的使用gRPC很有必要。因此我们必须深度解析下gRPC的实现逻辑,在本文中,将分别从客户端和服务端来说明gRPC的实现原理。准备条件本文将以gRPC Github上helloword代码作为一个完整的项目示例作为介绍的基础,在展开分析之前,简单介绍下作为gRPC的文件结构:greeter_clientgreeter_ser...

2020-04-08 22:54:39 231

原创 Go遍历二叉树

package main import "fmt"type Node struct { Val int Left *Node Right *Node}// 1// / \// 2 3// / \ / \// 4 5 6 7func main() { head := &No...

2020-04-08 17:21:59 86

原创 Go单链表反转

package mainimport ( "fmt")type Node struct { Val int Next *Node}func reverse(listNode *Node) *Node { var node *Node head := listNode for head != nil { head.Nex...

2020-04-03 23:38:37 213

转载 RabbitMQ与Kafka

导言作为一个有丰富经验的微服务系统架构师,经常有人问我,“应该选择RabbitMQ还是Kafka?”。基于某些原因, 许多开发者会把这两种技术当做等价的来看待。的确,在一些案例场景下选择RabbitMQ还是Kafka没什么差别,但是这两种技术在底层实现方面是有许多差异的。不同的场景需要不同的解决方案,选错一个方案能够严重的影响你对软件的设计,开发和维护的能力。这篇文章会先介绍一下基本的异步消...

2020-04-03 17:45:11 164

转载 Golang调用so文件示例

测试动态库test_so.hint test_so_func(int a,int b);test_so.c#include "test_so.h"int test_so_func(int a,int b){ return a*b;}生成sogcc -shared ./test_so.c -o test_so.so复制so文件到Go项目目录Go项目目录load...

2020-04-01 15:39:27 1482 2

转载 Golang跟踪剖析trace的使用

单单使用 PProf 有时候不一定足够完整,因为在真实的程序中还包含许多的隐藏动作,例如 Goroutine 在执行时会做哪些操作?执行/阻塞了多长时间?在什么时候阻止?在哪里被阻止的?谁又锁/解锁了它们?GC 是怎么影响到 Goroutine 的执行的?这些东西用 PProf 是很难分析出来的,但如果你又想知道上述的答案的话,你可以用本文的主角 go tool trace 来打开新世界的大门。...

2020-03-31 21:58:46 1546

转载 Go优雅的重启服务

知识点信号量的了解。应用热更新。本文目标在前面编写案例代码时,我相信你会想到,每次更新完代码,更新完配置文件后,就直接这么 ctrl+c 真的没问题吗,ctrl+c到底做了些什么事情呢?在这一节中我们简单讲述 ctrl+c 背后的信号以及如何在Gin中优雅的重启服务,也就是对 HTTP 服务进行热更新。ctrl + c内核在某些情况下发送信号,比如在进程往一个已经关闭的管道写数...

2020-03-29 22:31:06 781

转载 Go Modules 入门

Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(ready for production)了,Go官方也鼓励所有用户从其他依赖项管理工具迁移到 Go modules。而 Go1.14,在近期也终于正式发布,Go 官方亲自 “喊” 你来用:因此在今天这篇文章中,我...

2020-03-29 14:56:19 295

转载 gRPC及相关介绍

项目地址:https://github.com/EDDYCJY/go-grpc-example作为开篇章,将会介绍 gRPC 相关的一些知识。简单来讲 gRPC 是一个 基于 HTTP/2 协议设计的 RPC 框架,它采用了 Protobuf 作为 IDL你是否有过疑惑,它们都是些什么?本文将会介绍一些常用的知识和概念,更详细的会给出手册地址去深入一、RPC什么是 RPCRPC 代指远程...

2020-03-28 23:07:28 123

空空如也

Shower稻草人的留言板

发表于 2020-01-02 最后回复 2020-01-02

我也吐个关于修改用户名的槽。。

发表于 2016-11-25 最后回复 2016-11-25

突然发现原来用富文本编辑器写的博文里的代码示例都没发看了。。。

发表于 2016-11-24 最后回复 2016-11-25

网站访问速度慢

发表于 2016-10-12 最后回复 2016-10-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除