很多人为了使用Go web中更好的路由,会使用第三方的库 httprouter、gorilla/mux等。在明年的春节左右发布的Go 1.22中,Go官方终于对标准库中的http.ServeMux下手了,对它的功能进行了优化,终于可以抛弃第三方库了。
一个令人兴奋的提案预计将在Go 1.22中实现—— 增强标准库net/http包中默认HTTP服务多路复用器的模式匹配能力。
Rust 在并发编程方面有一些强大的原语,让你能够写出安全且高效的并发代码。最显著的原语之一是 ownership system,它允许你在没有锁的情况下管理内存访问。此外,Rust 还提供了一些并发编程的工具和标准库,比如线程、线程池、消息通讯(mpsc等)、原子操作等,不过这一章我们不介绍这些工具和库,它们会专门的分章节去讲。这一章我们专门讲一些保证在线程间共享的一些方式和库。
并发原语内容较多,分成两章,这一章介绍Cow、beef::Cow、Box、 Cell、RefCell、OnceCell、LazyCell、LazyLock 和 Rc。 我把它们称之为容器类并发原语,主要基于它们的行为,它们主要是对普通数据进行包装,以便提供其他更丰富的功能。
Classical BPF(cBPF, 伯克利包过滤器)是一种用来过滤网络数据包的技术。它像一个钩子一样挂载在网络栈的关键路径上,可以在数据包进入协议栈之前,根据预设规则来过滤或处理网络数据包。
前几天,我们百度的同学分享了Go标准库中一段好玩的好玩的代码, net/http/response.go中一段检查HTTP的headser中Content-Length未设置的情况下,对http.Body的有趣的处理。
在我上一篇文章mping: 使用新的icmp库实现探测和压测工具文章中,介绍了使用新的第三方库icmpx使用ping的功能,实现了mping这样一个高性能的探测和压测工具,并且还计算了往返时延指标(RTT, Round Trip Time)。
有时候,我们在做应用开发的时候,比如微服务调用的时候,也常常会计算程序的延时(latency)。
PGO (基于profile指导的优化) 在Go 1.20 中还属于预览状态, 在Go 1.21中已经生产可用了, 未来 PGO 还有很宏伟的目标,但是现在已经可以很好的帮助我们提高程序的性能呢,根据程序的不同,可能会带来2% ~ 7%的提升,不要小看这个提升,如果你是在大厂做优化的专家,可以这样计算: “我厂大概有 10万Go实例,每个实例平均占用16个核,通过我们的优化,程序性能平均提升5%, 大约节省9万个核,每年为公司节省数亿元的成本”。
最近看到两篇关于PGO的文章:Profile Guided Optimizations in Go 和 Go官方的博客 Profile-guided optimization in Go 1.21。相比较而言, Go官方这篇文章简单明了,而且把·细节也交代的明明白白,所以我就把这篇文章翻译过来,我感觉我自己写也没有官方这篇写的明白,翻译过来就好了。
以下是译文:
原文: Tracing a packet journey using Linux tracepoints, perf and eBPF
很久以来我一直在寻找一个底层的Linux网络调试工具。
我一直在寻找一个低级的Linux网络调试工具已经有一段时间了。Linux 允许使用虚拟接口(virtual interface)和网络命名空间(network namespace)的组合来构建直接在主机上运行的复杂网络。当出现问题时,故障排除相当乏味。如果这是 L3 路由问题,mtr则很有可能会有所帮助。但是,如果这是一个较低层的问题,我通常会手动检查每个接口/网桥/网络命名空间/iptables并启动几个tcpdump,以尝试了解正在发生的事情。如果您事先不了解网络设置,这可能感觉像走迷宫。
项目地址: mping
最近在网络探测的分析中,需要做一个使用ICMP协议进行压测的工具, ping或者fping多多少少都不满足需求,所以需要自己写一个。
使用golang.org/x/net/icmp很容易的实现基于ICMP的工具, go-ping就算了,既缺乏维护性能也不佳。所以我最初使用Go官方扩展库实现了这个工具,不过这几天我看到Matt Layher刚推出一个新的ICMP库:mdlayher/icmpx, 我决定尝试一下。Matt Layher 是Go网络编程的专家,写了好几个网络相关的库,所以我对他的库还是蛮有信心的。
原文: understanding Go 1.21 generics type inference
Go 1.21 已经发布了,带来了一系列的改进,例如更好的泛型类型推断(本文的内容);新的内置函数min``,max和clear;以及标准库中的几个新软件包(`maps,slices``,cmp,`log/slog`和`testing/slogtest)。在这里阅读完整的发行说明。
至少对我们Encore来说,特别感兴趣的是对泛型类型推断的改进,因为它会影响Encore的静态分析的工作方式。但是,我们认为发行说明很难理解,因此本文通过更多解释和示例介绍这次的变更。
我们也刚刚发布了支持 Go 1.21 的 Encore v1.24,所以这是尝试这些新变化的好方法。