Go 1.8中增加了 plugin package,但是仅支持Linux操作系统,并且还有一些已知的bug。可以说,这个插件系统的实现还未达到"产品级"的水平。
The plugin support is currently incomplete, only supports Linux, and has known bugs.
一些已知的bug已经推到 Go1.10甚至以后的版本中修复了。
今天在测试Go 1.9中的功能的时候就遇到了plugin的一个bug。
原文: Designing a Microservices Architecture for Failure
翻译: 设计一个容错的微服务架构 by Jason Geng
微服务架构使得可以通过明确定义的服务边界来隔离故障。但是像在每个分布式系统中一样,发生网络、硬件、应用级别的错误都是很常见的。由于服务依赖关系,任何组件可能暂时无法提供服务。为了尽量减少部分中断的影响,我们需要构建容错服务,来优雅地处理这些中断的响应结果。
本文介绍了基于RisingStack 的 Node.js 咨询和开发经验构建和操作高可用性微服务系统的最常见技术和架构模式。
如果你不熟悉本文中的模式,那并不一定意味着你做错了。建立可靠的系统总是会带来额外的成本。
去年年初的时候曾经写过一篇关于如何获取goroutine id的方法: 如何得到goroutine 的 id?, 当时调研了一些一些获取goid的方法。基本的方法有三种:
runtime·getg
方法的调用结果每个方式都有些问题, #1比较慢, #2因为是hack的方式(Go team并不想暴露go id的信息), 针对不同的Go版本中需要特殊的hack手段, #3需要定制Go运行时,不通用。当时的petermattis/goid提供了 #2 的方法, 但是只能在 go 1.3中才起作用,所以只能选择#1的方式获取go id。
最近一年来, petermattis更新了他的代码,逐步增加了对 Go 1.4、1.5、1.6、1.7、1.8、1.9的支持,同时也提供了#1的方法,在#2方法不起作用的时候作为备选,所以我们可以在当前的所有的版本中可以使用stable的获取go id的方法了。
在Go 1.6之前, 内置的map类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后, 并发地读写map会报错,这在一些知名的开源库中都存在这个问题,所以go 1.9之前的解决方案是额外绑定一个锁,封装成一个新的struct或者单独使用锁都可以。
本文带你深入到sync.Map
的具体实现中,看看为了增加一个功能,代码是如何变的复杂的,以及作者在实现sync.Map
的一些思想。
Mac OSX中虽然带了 netstat
工具,可是用起来不像Linux下那么爽, 一个是慢 (netstat -p tcp | grep $PORT
),二是不能pid,所以stackoverflow上建议使用lsof
工具。
所以你可以使用下面的命令:
|
|
为了不显示端口的俗称,你可以加P
参数:
|
|
如果不想grep Listen
,可以加-sTCP:LISTEN
。
没有更多要说的了,谨记一下备用。
select
和 switch
是 Go语言中进行分支操作的两个方式,各有各的应用场景。
原文地址: Golang Concurrency Tricks
Golang concurrency model based on goroutines and channels is not free from sharp edges.
This page intends both (1) to collect helpful guidelines for writing concurrent code in Go and (2) to bring up well known potential issues to attention.
原文: Idiomatic Go
什么样的代码才算最地道的Go代码? 这个问题经常被人问起,但是确不太好回答。部分原因在于我们还在摸索之中,抑或Go还是一个年轻的语言。随着语言和社区的逐渐成熟,老司机们才会对地道的Go代码达成共识。
请注意,地道的代码不是限制你的规则,而是代码指导。工作正常的代码比地道的代码更重要。因为所谓的地道,只是大家达成的一种共识,所以"不地道"的的代码不一定代表着错误。
既然没有确定的答案,我在本文中收集了相关的参考资料, 以飨读者。
利用Nginx很容易的配置反向代理和负载均衡的服务, 比如下面的配置:
|
|
它将客户端的请求转发给后台的三个服务器。 负载均衡的算法又多种, 比如轮询、least_conn、ip_hash、weight等算法,本文重点不介绍这方面的内容,而是下面的需求。
后端服务器可能返回 3XX的redirect的response, Nginx会把这个请求直接返回给客户端。现在我们的需求是让Nginx自己处理这个跳转,而客户端无感知。
原文: Lint your #golang code like a mad man!, 作者: Arsham Shirvani
我使用下面的工具来改进我的代码,除了vendor
文件夹。我的操作系统是GNU/Linux
,但是稍微修改一下脚本应该也能运行在你的操作系统上。我使用glide来处理依赖(vendor),但你也可以使用你的包依赖管理工具来替换glide nv
, 这个命令列出了所有的文件夹,除了vender (译者按: Go 1.9中可以直接使用./...
,它会排除vendor文件夹)。有些情况下glide nv
不适合,所以我使用了它的老式风格。
注意我使用$
作为shell的提示符。