Go实战系列
文章平均质量分 84
墨子哲
感兴趣方向WEB架构,大数据,人工智能
展开
-
我们如何使用Go打造了Uber QPS最高的服务
原文:How We Built Uber Engineering’s Highest Query per Second Service Using Go译者:孙薇2015年初,我们建立了一个微服务来负责这项任务:地理围栏查找(geofence lookups),结果完成很出色。如今已过一年,这项技术在Uber数以百计的生产应用中脱颖而出,成为了每秒查询量最高(QPS)的服务。本文讲述了我们建立这个服务的原因,还有近来Go语言对构建和扩展该服务速度的贡献。背景在Uber,地理围栏指的是地面转载 2022-03-19 22:26:24 · 337 阅读 · 0 评论 -
go net/http Client使用——长连接客户端的使用
go net/http Client使用总结Client数据结构// A Client is an HTTP client. Its zero value (DefaultClient) is a// usable client that uses DefaultTransport.//// The Client's Transport typically has internal ...原创 2018-08-06 21:53:03 · 2137 阅读 · 0 评论 -
golang for select 循环跳出
执行以下代码,发现无法跳出for循环:func SelectTest() { i := 0 for { select { case <-time.After(time.Second * time.Duration(2)): i++ if i == 5 { fmt.Println("跳出for循环") } } fmt.Println("for...原创 2018-08-14 21:10:30 · 16952 阅读 · 0 评论 -
Go语言 log日志包
Golang's log模块主要提供了3类接口。分别是 “Print 、Panic 、Fatal ”,对每一类接口其提供了3中调用方式,分别是 "Xxxx 、 Xxxxln 、Xxxxf",基本和fmt中的相关函数类似,下面是一个Print的示例:package mainimport ( "log")func main(){ arr := []int {2,3} ...原创 2018-08-16 18:48:37 · 1399 阅读 · 0 评论 -
go语言 调优工具 pprof
CPU ProfilingGolang 提供了 pprof 包(runtime/pprof)用于输出运行时的 profiling 数据,这些数据可以被 pprof 工具(或者 go tool pprof,其为 pprof 的变种)使用。通常我们这样来使用 pprof 包:// 定义 flag cpuprofilevar cpuprofile = flag.String("cpuprof...原创 2018-08-16 19:16:46 · 982 阅读 · 0 评论 -
搭建以太坊私有网络,安装geth报错
安装geth报错build/env.sh go run build/ci.go install ./cmd/geth>>> /usr/lib/go-1.10/bin/go install -ldflags -X main.gitCommit=4e7dc34ff1a7469b95eb16f5b4084c26a0ab3662 -v ./cmd/gethgithub.com/e...原创 2018-08-19 15:35:30 · 3957 阅读 · 7 评论 -
golang的facebookgo grace优雅重启原理分析
从原理上来说是这样一个过程: 1)发布新的bin文件去覆盖老的bin文件 2)发送一个信号量,告诉正在运行的进程,进行重启 3)正在运行的进程收到信号后,会以子进程的方式启动新的bin文件 4)新进程接受新请求,并处理 5)老进程不再接受请求,但是要等正在处理的请求处理完成,所有在处理的请求处理完之后,便自动退出 6)新进程在老进程退出之后,由i...原创 2018-09-11 17:56:17 · 3835 阅读 · 0 评论 -
Golang捕获panic堆栈信息
func PanicTrace(kb int) []byte { s := []byte("/src/runtime/panic.go") e := []byte("\ngoroutine ") line := []byte("\n") stack := make([]byte, kb<<10) //4KB length := runtime....原创 2018-09-03 19:23:53 · 2832 阅读 · 0 评论 -
golang RWMutex读写锁分析
RWMutex:是基于Mutex实现的读写互斥锁,一个goroutine可以持有多个读锁或者一个写锁,同一时刻只能持有读锁或者写锁数据结构设计: type RWMutex struct { w Mutex // 互斥锁 writerSem uint32 // 写锁信号量 readerSem uint32 // 读锁信号量 ...转载 2018-09-17 21:02:39 · 745 阅读 · 0 评论 -
How we redesigned the NSQ - NSQ重塑之详细设计
之前的 文章 讲述了我们重塑NSQ的目的和目标, 接下来我们将详细描述下每个功能的具体技术细节.重构后架构图首先, 看一下重构后的整体架构图:原来的几个NSQ组件大部分功能是复用的, 图中新增的就是元数据存储服务-etcd, 以及数据同步和HA处理逻辑.改造topic queue为了增加副本和其他特性, 首先需要改造的就是nsq的topic数据写入方式, 要保证数据最终...转载 2018-09-20 19:08:44 · 374 阅读 · 0 评论 -
服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型
概述前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺点以及使用场景,最终结合本身项目的实际情况选择了使用dubbox作为rpc基础服务框架。下面就简单介绍一下RPC框架技术选型的过程。RPC简述该系列文章将讲述以下RPC框架的helloword实例以及其实现原理简述,由于每一种RPC框架的原理实现不同且都比较复杂,如果想深入研究还请自行到官网或者其他技术博客学习。R...转载 2018-12-20 18:28:24 · 356 阅读 · 0 评论 -
redigo 源码分析连接池部分
结构体分析type Pool struct { // 用来创建redis连接的方法 Dial func() (Conn, error) // 如果设置了给func,那么每次p.Get()的时候都会调用改方法来验证连接的可用性 TestOnBorrow func(c Conn, t time.Time) error // 定义连接池中最大连接数(超过这...原创 2018-08-06 18:42:09 · 897 阅读 · 0 评论 -
分享使用redigo连到redis proxy踩到的坑
最近在开发项目的时候,踩了一个redis相关的坑,现分享给大家。使用的第三方库是 redigo,连的redis地址是一个proxy,首先要说的是,redigo 和 redis proxy 都是好东西,redigo的源码看着很清晰,redis proxy也很棒。刀是好刀,但是用的姿势不对就会伤到自己。这个坑就是关于redigo连接池的:RedisPool = &redi...转载 2018-08-03 16:51:28 · 4233 阅读 · 0 评论 -
GC内存回收深入研究
GO “非分代的、非紧缩、写屏障、并发标记清理”并发清理: 垃圾回收(清理过程)与用户逻辑并发执行 三色并发标记 : 标记与用户逻辑并发执行一般常用垃圾回收方法引用计数这是最简单的一种垃圾回收算法,和之前提到的智能指针异曲同工。对每个对象维护一个 引用计数 ,当引用该对象的对象被销毁或更新时被引用对象的引用计数自动减一,当被引用对象被创建或被赋值给其他对象时引用计数自动加一。当引用计数为0时则立即...转载 2018-05-15 17:45:32 · 3160 阅读 · 0 评论 -
Go语言的传参和传引用
传参和传引用的问题很多非官方的文档和教材(包括一些已经出版的图书), 对Go语言的传参和引用的讲解 都有很多问题. 导致众多Go语言新手对Go的函数参数传参有很多误解.而传参和传引用是编程语言的根本问题, 如果这个问题理解错误可能会导致很多问题.传slice不是传引用!首先, Go语言的函数调用参数全部是传值的, 包括 slice/map/chan 在内所有类型, 没有传引用的说法.具体请看Go语...原创 2018-07-02 13:48:55 · 997 阅读 · 0 评论 -
使用 Go vendor
一、Go vendor 介绍Go 语言在发布 1.5 版本时,就说可以使用自身提供的 vendor 特性,但是需要设置如下环境变量:GO15VENDOREXPERIMENT=1在发布 1.6 版本时,该环境变量的值已经默认设置为 1 了,该值可以使用 go env 命令查看。根据官方的说法,在发布 1.7 版本时,将去掉该环境变量,默认开启 vendor 特性。现在也有很多包管理工具,比如 God...原创 2018-07-11 16:11:17 · 5216 阅读 · 0 评论 -
go 依赖管理利器 -- govendor
长期以来,golang 对外部依赖都没有很好的管理方式,只能从 $GOPATH 下查找依赖。这就造成不同用户在安装同一个项目适合可能从外部获取到不同的依赖库版本,同时当无法联网时,无法编译依赖缺失的项目。自 1.5 版本开始引入 govendor 工具,该工具将项目依赖的外部包放到项目下的 vendor 目录下(对比 nodejs 的 node_modules 目录),并通过 vendor.jso...转载 2018-07-13 13:19:02 · 712 阅读 · 0 评论 -
使用govendor管理Golang项目依赖
1、安装govendorgo get -u -v github.com/kardianos/govendor12、init在项目根目录,比如我这里是tap项目,那就是进入tap目录,执行init命令govendor initlscd vendor/ls1234 这个 vendor.json 会类似 godep 工具中的描述文件版本的功能。 3、执行命令将当前应用必须的文件包含进来govend...转载 2018-07-13 13:53:49 · 2021 阅读 · 0 评论 -
Go语言mgo使用情况
本文重点介绍mgo使用,仅简单介绍mongodb。mongodb特性mongdb简单介绍注意: 上图已经告知我们mongo不支持事务,在开发项目应用时,想要保证数据的完整性请考虑关系型数据库(经典例子银行转账)。 mongo提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操作。所谓原子操作就是要么这个文档保存到mongodb,要么没有保存到mongodb,不会出现查询到的文档不完整的情况...原创 2018-07-14 20:41:58 · 3379 阅读 · 0 评论 -
mgo 的 session 与连接池
简介 mgo是由Golang编写的开源mongodb驱动。由于mongodb官方并没有开发Golang驱动,因此这款驱动被广泛使用。mongodb官网也推荐了这款开源驱动,并且作者在github也表示受到了mongodb官方的赞助。但由于作者的个人安排原因,该驱动的更新、bug修复、issue维护略微受到诟病。 mgo在功能方面还是比较完善的,api使用也方便。由于mong...原创 2018-07-14 21:15:13 · 984 阅读 · 0 评论 -
golang mgo的mongo连接池设置:必须手动加上maxPoolSize
熊猫TV的礼物系统使用了golang的 mongo库 mgo,中间踩了一些坑,总结下避免大家再踩坑golang的mgo库说明里是说明了开启连接复用的,但观察实验发现,这并没有根本实现连接的控制,连接复用其实仅在当前操作 (session.Close 之前 )生效,最终还是需要程序员自行去限制连接才行。废话不多说,开始上代码GlobalMgoSession, err := mgo.Dial(host...转载 2018-07-14 22:14:18 · 1768 阅读 · 0 评论 -
在golang中使用mgo多条件查询
简单查询collection := session.GetMdb().C("user")//获取操作对象//根据用户手机号 倒序查询前100个 存入slice中if err := collection.Find(&bson.M{"uphone": phonenum}).Sort("-initimesamp").Limit(100).All(&historys); err == ni...原创 2018-07-14 23:13:17 · 2630 阅读 · 0 评论 -
带你入门Go:Log日志模块
Go Log模块原创 2017-06-07 00:18:43 · 3115 阅读 · 0 评论