本期导读
1 |
语言学习 x 10 |
2 |
工程实践 x 5 |
3 |
生态拓展 x 5 |
4 |
开源项目 x 2 |
阅读说明
本周刊每周五发布,同步国内外 Go 开发者在一周内的最新鲜成果和最前沿方向,作为订阅者提升和进阶的学习手册。由于微信不支持外链,本文显示资讯摘要,具体每篇文章链接可通过点击文末「阅读原文」全部查看。
语言学习
Golang 编程技巧
1.Go编程语言规范
一份很详细的 Go 编程语言的参考手册。
2.Go网络文件传输
借助TCP完成文件的传输,基本思路如下:
发送方(客户端)向服务端发送文件名,服务端保存该文件名。
接收方(服务端)向客户端返回一个消息ok,确认文件名保存成功。
发送方(客户端)收到消息后,开始向服务端发送文件数据。
接收方(服务端)读取文件内容,写入到之前保存好的文件中。
由于文件传输需要稳定可靠的连接,所以采用TCP方式完成网络文件传输功能。
3.Go 编程: 对不起,你的 CPU 泄露了
前段时间给后端几个服务配证书,试着用了一下 Cert-Manager 项目。Github 几千 Star 的项目使用起来的确很方便,秒配域名免费证书。但是,运行了三天,机器CPU报警:
赶紧去项目 issues 里搜,果真遇到类似不止一个, 第二天这个问题就修复了。修复者的代码如下:
4.小改动,大提升:Go 标准库的一次优化
Carlo Alberto Ferraris提交了一个对math/rand库中的lockedSource优化的pr(CL#191538),核心代码其实只有一行,却带来了相对的巨大的性能提升,让我们一起老看看这次的修改,学习一下代码的优化技巧,提高我们Go语言的底层优化经验。
5.高频 golang 服务接口超时排查&性能调优
业务中超时抖动是大家平时比较容易遇到的一种技术问题,本文详细记录了一次线上容器中高频 go 服务超时的排查过程。本文可以给大家提供查服务业务超时问题的一些思路,理解为什么 go 服务会获取错 cpu 核数,了解获取宿主 cpu 核数会有多大影响并怎样最小成本避开。
6.Go语言学习Sync.Pool
假设我们需要频繁申请内存用于存放你的结构体, 而这个结构体本身是短命的, 可能这个请求过去你就不用了. 申请了这么多内存, 对于GC来说就是一种压力了. 针对这个问题, 如果我们能产生一个池子, 用于存放这些短命内存, 理想情况中下次请求来了, 直接从池子中拿就好了, 那么GC的时候我们直接清理池子就完事了, 算是一种GC的优化套路.
7.Go之for-range排坑指南
golang 常用的遍历方式,有两种:for 和 for-range。而 for-range 使用中有些坑常会遇到,今天我们一起来捋一捋。
8.Go语言使用TCP_NODELAY控制发包流量[译]
编写健壮且高性能的网络服务需要付出大量的努力。提高服务性能的方式有很多种,比如优化应用层的代码,更进一步,还可以看看垃圾回收器,操作系统,网络传输,以及部署我们服务的硬件是否有优化空间。
TCP/IP协议栈中的一些算法会影响到服务性能。本文将简单介绍其中的Nagle算法,与Nagle算法相关的socket选项TCP_NODELAY,以及在Go语言中如何使用它。
9.Golang context机制
Context通常被译作上下文,是一个比较抽象的概念。一般理解为程序单元的一个运行状态、现场、快照,而翻译中上下文又很好地诠释了其本质。
每个Goroutine在执行前,都要先知道程序当前的执行状态,通常将这些执行状态封装在一个Context变量中,传递给要执行的Goroutine中。上下文则几乎已经成为传递与请求同生存周期变量的标准方法。在网络变成下,当接收到一个网络请求Request,处理Request时,我们可能需要开启不同的Goroutine来获取数据和执行程序逻辑,即一个请求Request,会在多个Goroutine中处理。而这些Goroutine可能需要共享Request的一些信息;同时当Request被取消或者超时的时候,所有从这个Request创建的所有Goroutine也应该被结束。
10.《Go语言程序设计》读书笔记(六) 基于共享变量的并发
一个函数在线性程序中可以正确地工作。如果在并发的情况下,这个函数依然可以正确地工作的话,那么我们就说这个函数是并发安全的,并发安全的函数不需要额外的同步工作。我们可以把这个概念概括为一个特定类型的一些方法和操作函数,如果这个类型是并发安全的话,那么所有它的访问方法和操作就都是并发安全的。
工程实践
Go的项目应用实践
?
1.Go 的内存对齐和指针运算详解和实践
uintptr
在 Go 的源码中 uintptr 的定义如下:
/* uintptr is an integer type that is large enough to hold the bit pattern of any pointer.从英文注释可以看出 uintptr是一个整形,它的大小能够容纳任何指针的位模式,它是无符号的,最大值为:18446744073709551615,怎么来的,int64最大值 * 2 +1 */type uintptr uintptr
unasfe
在 Go 中,unsafe 是一个包,内容也比较简短,但注释非常多,这个包主要是用来在一些底层编程中,让你能够操作内存地址计算,也就是说 Go 本身是不支持指针运算,但还是留了一个后门,而且 Go 也不建议研发人员直接使用 unsafe 包的方法,因为它绕过了 Go 的内存安全原则,是不安全的,容易使你的程序出现莫名其妙的问题,不利于程序的扩展与维护。
2.eBay邓明:dubbo-go 中 metrics 的设计
最近因为要在 Apache/dubbo-go(以下简称 dubbo-go )里面实现类似的这个 metrics 功能,于是花了很多时间去了解现在 Dubbo 里面的 metrics 是怎么实现的。该部分,实际上是被放在一个独立的项目里面,即 metrics 。
在 Dubbo 里面,其比较关键的子接口是:
3.Go在MacOS创建一个自定义的命令行工具
使用 MacOS 做开发的朋友都知道,我们一般会使用 Homebrew 做软件包管理,经常会用到 brew install [soft] 来安装各种各样的命令行软件。今天通过一个百科查找的命令行工具(tellme)示例,我们来学习一下如何使用 Go 语言开发自己的命令行软件。
我们需要用到 cobra 这个 Go 模块来做命令行工具开发,这个开源库其实是对 Go 官方库 flag 的一个封装,可以简化获取参数的操作。
4.复杂分布式架构下的计算治理之路
在当前的复杂分布式架构环境下,服务治理已经大行其道。但目光往下一层,从上层 APP、Service,到底层计算引擎这一层面,却还是各个引擎各自为政,Client-Server 模式紧耦合满天飞的情况。如何做好“计算治理”,让复杂环境下各种类型的大量计算任务,都能更简洁、灵活、有序、可控的提交执行,和保障成功返回结果?计算中间件 Linkis 就是上述问题的最佳实践。
5.100 行写一个go的协程池(任务池)
go 的 goroutine 提供了一种较线程而言更廉价的方式处理并发场景, go 使用二级线程的模式, 将 goroutine 以 M:N 的形式复用到系统线程上, 节省了 cpu 调度的开销, 也避免了用户级线程(协程)进行系统调用时阻塞整个系统线程的问题。
但 goroutine 太多仍会导致调度性能下降、GC 频繁、内存暴涨, 引发一系列问题。在面临这样的场景时, 限制 goroutine 的数量、重用 goroutine 显然很有价值。
本文正是针对上述情况而提供一种简单的解决方案, 编写一个协程池(任务池)来实现对 goroutine 的管控。
生态拓展
云原生等 Go 生态体系
1.Kubernetes设计的4个原则
今天我要带给大家的是2018年底,在西雅图举办的Kubecon的一场分享,来自谷歌K8s团队的工程师Saad Ali分享的《Kubernetes设计原则》。这场会议虽然已经过去一年多了,但是我觉得本会议的内容非常值得学习,我们大都知道K8s是如何工作的,但是本文带我们了解k8s背后的设计原则,以及为什么要这样设计。
2.分析并解决遗留应用迁移至Kubernetes后延迟增加的问题
上周我们团队忙着将一个微服务迁移到中央平台上,包括CI/CD,Kubernetes运行时,metric和其他一些程序。这次实验是为了之后一个月里大概150个微服务的迁移作准备,所有这些服务支撑着西班牙在线市场的运营。
当我们将应用程序部署到Kubernetes上,并且将一些生产流量导入其中之后,事情开始有些不妙了。Kubernetes上的请求延迟比EC2上的高10倍左右。除非我们能找到解决方案,不然这会是微服务迁移的最大障碍,甚至可能彻底摧毁整个项目。
3.清晰架构(Clean Architecture)的Go微服务: 日志管理
良好的日志记录可以提供丰富的日志数据,便于在调试时发现问题,从而大大提高编码效率。记录器提供的自动化信息越多越好,日志信息也需要以简洁的方式呈现,便于找到重要的数据。
4.Serverless Kubernetes 入门:对 Kubernetes 做减法
Serverless Kubernetes 是阿里云容器服务团队对未来 Kubernetes 演进方向的一种探索,通过对 Kubernetes 做减法,降低运维管理负担,简化集群管理,让 Kubernetes 从复杂到简单。
5.Kubernetes 容器平台安全实施方案
Kubernetes 容器平台的安全,牵涉到平台的各个层面:服务器,操作系统, Docker 运行环境,容器, Kubernetes 运行环境等。
容器运行在服务器上,服务器和操作系统安全应该是容器平台安全的第一道防线。关于主机和内核安全的资料和文档已经非常的丰富,不是我们这篇文档关注的重点,我们以下就其他几个层面展开。
开源项目
社区新涌现的开源成果
jql:用Go语言实现的JSON查询处理器
rqlite:Go 实现分布式 SQLite
彩蛋
活动
01.04 Gopher Meetup Plus深圳站 PPT下载
Asta——Go在工业领域的应用实践
腾讯——Go性能优化之路
广发证券——Go与极限性能实践
OPPO——云平台存储系统架构设计与容器化实践
平安科技——从面试题目到Golang汇编
腾讯——如何向Go官方提交代码
华为云——云原生边缘计算平台的Golang实践
招聘
【北京】【商汤科技招聘】Golang开发实习生 详情
【杭州】【蚂蚁金服】蚂蚁金服研发效能团队招人啦!详情
【深圳】【腾讯广告】招聘后台开发工程师 详情
【上海】【趣头条旗下米读小说】资深后端研发/架构师 详情
【武汉】【奇虎360】招聘资深golang工程师 详情