Go语言http.Get()超时设置(更新)

上次写了一遍日志分享http.Get()设置超时的方案,后来自己过了一遍代码发现逻辑上有问题。 在Dail之后设置了Deadline,之后就没再重新设置。这对于不重用连接的http请求是没有问题的,但是Go的http库是支持keep-alive的,可以重用TCP/IP连接。这意味着一个连接过了超时时间后再被使用,就会出现超时错误,因为没有再重置超时时间。 拿上次的实验代码,在发送请求时加一个keep-alive头,然后每次发送请求前加个Sleep,就可以重新以上情况。 怎样做到每次使用一个连接发...阅读全文

阅读:8422 评论:0

使用context实现多个goroutine的依赖管理

解决的问题 在很多实际情况,比如处理网络请求时,我们需要启动多个goroutine来处理不同的逻辑,比如一个主要的goroutine用来响应请求,生成网页,同时它还启动一个子线程用来获取数据库信息,还有一个则写日志等等。正常情况都没有问题,但是一旦出现异常,如何优雅的退出这些子线程,同时释放掉可能占用的资源呢? context 在golang中,人们发明了context接口处理这种情况。早在14年,这个库就出现了,并且提出了基于context的并发编程范式(英文好的同学可以直接撸这篇文章)。今年...阅读全文

2016年11月19日发布 flybywind
阅读:2052 评论:0

Go Reflect

最近在看一些go语言标准库以及第三方库的源码时,发现go的reflect被大量使用,虽然反射的机制大多数语言都支持,但好像都没有go一样这么依赖反射的特性。个人觉得,reflect使用如此频繁的一个重要原因离不开go的另一个特性,空接口interface{},reflect配合空接口,让原本是静态类型的go具备了很多动态类型语言的特征。 另外,虽然反射大大增加了go语言的灵活性,但要完全掌握它的原理和使用也还是有一点难度的。 go的reflect库有两个重要的类型: reflect.Type r...阅读全文

阅读:3078 评论:1

Beego源码分析(转)

摘要 beego 是 @astaxie 开发的重量级Go语言Web框架。它有标准的MVC模式,完善的功能模块,和优异的调试和开发模式等特点。并且beego在国内企业用户较多,社区发达和Q群,文档齐全,特别是 @astaxie 本人对bug和issue等回复和代码修复很快,非常敬业。beego框架本身模块众多,无法简单描述所有的功能。我简单阅读了源码,记录一下beego执行过程。官方文档已经图示了beego执行过程图,而我会比较详细的解释beego的源码实现。 beego 是 @astaxie 开...阅读全文

2016-07-02 14:24 rainbowzc
阅读:1787 评论:0

Go net/http 超时指导

当在编写一个Go语言的HTTP服务端或者是客户端时,超时是最容易同时也是最敏感的错误,有很多选择,一个错误可以导致很长时间没有结果,知道网络出现故障,或者进程宕掉。 HTTP是一个复杂的多阶段的协议,所以超时没有一刀切的解决方案。想想一个流的端点与JSON API端点和comet端点。事实上,默认值往往不是你想要的。 在这篇文章中,我将采取不同的阶段,你可能需要申请一个超时,并在服务器和客户端不同的方式来实现。 设置最后期限(超时) 首先,你需要理解Go提供的最初级的网络超时实现:Deadlin...阅读全文

2016-07-30 22:30 Lina_ACM
阅读:16270 评论:3

使用Go实现TLS 服务器和客户端

传输层安全协议(Transport Layer Security,缩写:TLS),及其前身安全套接层(Secure Sockets Layer,缩写:SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。 SSL包含记录层(Record Layer)和传输层,记录层协议确定了传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥(Session key)。这个会谈密钥是用来将通信两方交换的数据做加密,保证两个...阅读全文

2016年06月07日 smallnest
阅读:3610 评论:0

Golang gRPC实践 连载一 gRPC介绍与安装

gRPC介绍与安装 A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. ——gRPC Website gRPC 是一个高性能、开源、通用的RPC框架,由Google推出,基于HTTP/2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。 主要...阅读全文

2016年12月21日发布 Coldstar
阅读:2839 评论:0

Golang gRPC实践 连载二 Hello gRPC

Hello gRPC 按照惯例,这里从一个Hello项目开始,本项目定义了一个Hello Service,客户端发送包含字符串名字的请求,服务端返回Hello消息。 流程: 编写.proto描述文件 编译生成.pb.go文件 服务端实现约定的接口并提供服务 客户端按照约定调用方法请求服务 项目目录: $GOPATH/src/grpc-go-practice/ example/ |—— hello/ |—— client/ |—— main.go // 客户端 |—— server/ |—— ma...阅读全文

2016年12月25日发布 Coldstar
阅读:1910 评论:0

Go unsafe包

Go unsafe包 unsafe包概述 直到现在(Go1.7),unsafe包含以下资源: 三个函数: // unsafe.Sizeof函数返回操作数在内存中的字节大小,参数可以是任意类型的表达式,但是它并不会对表达式进行求值. // 一个Sizeof函数调用是一个对应uintptr类型的常量表达式, // 因此返回的结果可以用作数组类型的长度大小,或者用作计算其他的常量. func Sizeof(x ArbitraryType) uintptr //函数的参数必须是一个字段 x.f, 然后返...阅读全文

阅读:3840 评论:0

Go context源码解析

在上一篇文章 golang context初探 中,已经初步了解了context的用法以及应用的场景。那么接下来深入到源码中来学习一下context是怎么实现的。 emptyCtx context包的代码很少,一个context.go文件,总共才480行代码,其中还包括大量的注释。context包首先定义了一个Context接口: type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan str...阅读全文

阅读:1224 评论:0

基于consul构建golang系统分布式服务发现机制

在分布式架构中,服务治理是一个重要的问题。在没有服务治理的分布式集群中,各个服务之间通过手工或者配置的方式进行服务关系管理,遇到服务关系变化或者增加服务的时候,人肉配置极其麻烦且容易出错。 之前在一个C/C++项目中,采用ZooKeeper进行服务治理,可以很好的维护服务之间的关系,但是使用起来较为麻烦。现在越来越多新的项目采用consul进行服务治理,各方面的评价都优于ZooKeeper,经过几天的研究,这里做一个总结。 zookeeper和consul比较 开发语言方面,zookeeper采...阅读全文

阅读:1674 评论:0

如何用Go实现一款类似滴滴优步的网络约车软件(含源码)

导读:我们经常使用打车软件出行,也经常思考其架构设计。本文作者在所在国家也负责开发一款打车软件,并且开源了其中大部分代码,可以帮助我们更好了解网络约车软件的架构体系。本文由高可用架构翻译。各位读者好,本文将给大家分享我们如何通过内存存储实现地图动画车效果。 我们公司也运营了一个类似 Uber 的软件 Namba Taxi,我们需要在客户端主屏幕上显示动画车。 这篇文章是关于功能如何完整实现的文章,主要目的不是介绍 Go 语言。开始这个故事始于2015年,我们的移动开发人员开发一款软件,工作主题是...阅读全文

阅读:7394 评论:0

golang中context包解读

前瞻 context 包困扰我好久,之前在 watch etcd 的时候首次上手使用这个包,当时并不理解这个包的作用,只知道可以用来关闭 watch , 后来被大牛吐槽了,决定深入探究一番。 简介 golang 中的创建一个新的 goroutine , 并不会返回像c语言类似的pid,所有我们不能从外部杀死某个goroutine,所有我就得让它自己结束,之前我们用 channel + select 的方式,来解决这个问题,但是有些场景实现起来比较麻烦,例如由一个请求衍生出的各个 goroutin...阅读全文

2017-03-03 10:00:40 徐学良
阅读:19869 评论:2

golang并发编程——goroutine使用指南

并发是golang最有核心竞争力的功能,golang的并发依赖的并不是线程,而是协程。协程和线程有什么区别呢?最大的区别就是协程比线程更为轻量。默认情况中一个进程最大可以启动254个线程,这个数值也可以改为无限制,但主机资源消耗就会非常严重。而使用协程就不同了,一个进程可以轻轻松松启动上万个协程而毫无压力。 因此本篇文章就来说说在golang中如何创建使用协程。 golang设计协程的目的,一方面是为了提高并发效率,另外一方面就是尽可能发挥多核CPU的能力。golang内置的调度器,可以让多核C...阅读全文

2017-03-04 16:33 skh2015java
阅读:1619 评论:0

golang实现二叉搜索树

关于什么是二叉搜索树,不清楚的同学可以去看我写的这个数据结构与算法的网站 数据结构 首先我们定义需要的数据结构。注意,TreeNode的左右节点都是*TreeNode type的,而树只有一个Root数据域,为*TreeNode type type TreeNode struct { Value int Left *TreeNode Right *TreeNode } type BinarySearchTree struct { Root *TreeNode } Insert 向二叉搜索树中插入...阅读全文

2017.02.04 21:21 bigtom
阅读:3033 评论:3

Golang1.7 Goroutine源码分析

一、 Golang简介 1.1概述 Golang语言是Google公司开发的新一代编程语言,简称Go语言,Go 是有表达力、简洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新奇的类型系统允许构建有弹性的模块化程序。 Go 编译到机器码非常快速,同时具有便利的垃圾回收和强大的运行时反射。而他最广为人知的特性便是语言层面上对多核编程的支持,他有简单的关键字go来实现并行,就像下面这样: Go的并行单元并不是传统意义上的线程,线程切换需要很大的上下文,这种切换消耗了大量CPU时间,而...阅读全文

2017-03-07 23:00:53 tantexian
阅读:819 评论:0

和我一步步部署 kubernetes 集群

​本系列文档介绍使用二进制部署 kubernetes 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群;在部署的过程中,将详细列出各组件的启动参数,它们的含义和可能遇到的问题。部署完成后,你将理解系统各组件的交互原理,进而能快速解决实际问题。所以本文档主要适合于那些有一定 kubernetes 基础,想通过一步步部署的方式来学习和了解系统配置、运行原理的人。集群详情Kubernetes 1.6.1Docker 17.04.0-ceEtcd 3.1.5Flanneld 0.7 v...阅读全文

2017-04-13 18:30:25 osnull
阅读:1619 评论:0

Golang中goroutine的调度器详解

Go调度器原理浅析来源:https://www.douban.com/note/300631999/ goroutine是golang的一大特色,或者可以说是最大的特色吧(据我了解),这篇文章主要翻译自Morsing的[这篇博客](http://morsmachine.dk/go-scheduler),我读这篇文章的时候不只是赞叹调度器设计的精巧,而且被Unix内核设计思想的影响和辐射所震撼,感觉好多好东西都带着它的影子。绪论(Introduction)---------------------...阅读全文

2016-04-18 11:36 heiyeshuwu
阅读:8849 评论:0

也谈goroutine调度器

Go语言在2016年再次拿下TIBOE年度编程语言称号,这充分证明了Go语言这几年在全世界范围内的受欢迎程度。如果要对世界范围内的gopher发起一次“你究竟喜欢Go的哪一点”的调查,我相信很多Gopher会提到:goroutine。 Goroutine是Go语言原生支持并发的具体实现,你的Go代码都无一例外地跑在goroutine中。你可以启动许多甚至成千上万的goroutine,Go的runtime负责对goroutine进行管理。所谓的管理就是“调度”,粗糙地说调度就是决定何时哪个goro...阅读全文

阅读:2368 评论:0