新手问题 Go 开发者进阶周刊(Jan week 2)

dyq · 2020年01月10日 · 77 次阅读

语言学习(Golang 编程知识与技巧)

1.Go 编程语言规范

一份很详细的 Go 编程语言的参考手册。

2.Go 网络文件传输

借助 TCP 完成文件的传输,基本思路如下:

  1. 发送方 (客户端) 向服务端发送文件名,服务端保存该文件名。
  2. 接收方 (服务端) 向客户端返回一个消息 ok,确认文件名保存成功。
  3. 发送方 (客户端) 收到消息后,开始向服务端发送文件数据。
  4. 接收方 (服务端) 读取文件内容,写入到之前保存好的文件中。

由于文件传输需要稳定可靠的连接,所以采用 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 。 

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 调度的开销, 也避免了用户级线程(协程)进行系统调用时阻塞整个系统线程的问题。【1】

但 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 官方提交代码
  •    华为云——KubeEdge:云原生边缘计算平台的 Golang 实践

【北京】【商汤科技招聘】Golang 开发实习生 详情

【杭州】【蚂蚁金服】蚂蚁金服研发效能团队招人啦!详情

【上海】【趣头条旗下米读小说】资深后端研发/架构师 详情

【武汉】【奇虎 360】招聘资深 golang 工程师 详情

 

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册