Go服务中的502问题总结

7 月 17 日
阅读 7 分钟
613
  服务端开发最常见的问题可能就是HTTP状态码异常了,常见的异常状态码包括404 Not Found,502 Bad Gateway,504 Gateway Time-out等。其中502状态码最常见并且最复杂,本文主要介绍了Go服务可能出现502状态码的几种情况。需要说明的是,本文所有的示例访问链路都是客户端→网关→Go服务,也就是说除了Go服务之...

如何基于Prometheus构建Go服务监控系统

7 月 17 日
阅读 6 分钟
954
  在故障处理时,完善的监控系统可以帮助我们快速地发现问题与定位问题。对Go服务而言,如何监控Go服务的核心指标呢?比如协程数、内存使用量、线程数等等。本文将为大家介绍如何基于Prometheus构建Go服务监控系统。

如何排查Go服务假死问题

7 月 17 日
阅读 4 分钟
490
  不知道你有没有遇到过这种情况:Go服务看起来正在运行,但是大量HTTP请求却没有任何响应,甚至查不到任何业务日志。我们通常称这一现象为Go服务假死。

深入理解Go语言中的GMP调度模型

7 月 17 日
阅读 5 分钟
1.1k
   Go语言天然具备高并发特性,而高并发的基础就是GMP调度模型了,理解GMP调度模型对学习Go语言并发编程至关重要。GMP调度模型解释起来很简单,G(goroutine)代表协程,M(machine)代表线程,P(processor)代表逻辑处理器。

《Go底层原理与工程化实践》发布啦!

7 月 16 日
阅读 1 分钟
578
  Go语言是目前的主流语言之一,具有入门快、高性能、开发效率高等特点,目前越来越多的互联网企业都在使用Go语言。另外,原生体系中的Kubernetes、Docker等开源项目就是基于Go语言开发的,想要深入研究云原生技术,就必须精通Go语言。最后,只有对Go语言底层有一定了解,才能开发出高性能、高可用的Go服务,...

Go语言三十讲【目录】

2022-10-24
阅读 1 分钟
8.8k
第一章 Go语言快速入门  第一篇 基本语法  第二讲 数组与切片  第三讲 字符串  第四讲 哈希表MAP  第五讲 结构体与接口  第六讲 反射  第七讲 泛型第二章 并发编程  第八讲 GMP调度模型  第九讲 协程管理  第十讲...

【5-6 Golang】实战—平滑升级

2022-10-24
阅读 7 分钟
2.2k
  Go服务作为常驻进程,想升级怎么办?你是不是想说这还不简单,先杀掉老的服务,再启动新的服务不就完了。可是你有没有想过,在你杀掉老服务的时候,正在处理的请求怎么办?以及老服务退出新服务启动的过程中,客户端请求到达了怎么办?这一简单粗暴的操作,必然会引起瞬时的请求异常。那怎么办,想办法平滑...

【5-5 Golang】实战—Go微服务发现问题分析

2022-10-24
阅读 10 分钟
1.4k
  某个夜黑风高的晚上,突然接收到少量错误日志报警『failed to dial server: dial tcp xxxx:yy: i/o timeout』。原来是微服务客户端请求服务端,连接失败。

【5-4 Golang】实战—Go服务502总结

2022-10-24
阅读 12 分钟
2.5k
问题引入  生产环境Golang服务有时会产生502报警,排查发现大多是以下三种原因造成的:http.Server配置了WriteTimeout,请求处理超时,Golang服务断开连接;http.Server配置了IdleTimeout,且网关和Golang之间使用长连接,Golang服务主动断开连接;Golang服务处理HTTP请求时出现了panic。  本篇文章...

【5-3 Golang】实战—HTTP服务假死问题分析

2022-10-24
阅读 5 分钟
1.3k
  下午15点左右,QA反馈灰度环境大量请求超时。kibana查询灰度网关日志,确实存在部分请求响应时间超过60秒,HTTP状态码504。进一步分析日志,所有504请求的上游地址都是xxxx:80。

【5-2 Golang】实战—dlv调试

2022-10-21
阅读 8 分钟
4.7k
  Go程序出异常怎么办?pprof工具分析啊,可是如果是代码方面bug等呢?分析代码bug有时需要结合执行过程,加日志呗,可是某些异常问题服务重启之后,可能会很难复现。这时候我们可以断点调试,这样就能分析每一行代码的执行,每一个变量的结果,C语言通常使用GDB调试,Go语言有专门的调试工具dlv,本篇文章主...

【5-1 Golang】实战—Go程序分析利器pprof

2022-10-20
阅读 11 分钟
2.6k
  不知道你有没有遇到这种情况,Go服务总是是不是的响应非常慢排查发现所有的依赖还都挺快,感觉是Go服务自身慢又不知道怎么慢在哪里;或者说请求甚至完全没响应,Go服务明明在正常运行,请求去哪儿了呢?或者说Go服务内存占用总是居高不下,内存都浪费在哪呢?这些问题都可以通过pprof分析,本篇文章将为你演...

【4-4 Golang】常用标准库—单元测试

2022-10-19
阅读 8 分钟
948
  日常项目开发中,单元测试是必不可少的,Go语言本身就提供了单元测试标准库,很方便我们开展基础测试,性能测试,事例测试,模糊测试以及分析代码覆盖率,本篇文章主要介绍Go单元测试的基本操作。

【4-3 Golang】常用标准库—上下文context

2022-10-18
阅读 8 分钟
1.4k
  Context顾名思义上下文,可用于在整个请求上下文传值以及控制超时,本篇文章主要介绍Context的设计思路,以及基本使用方式。

【4-2 Golang】常用标准库—net/http.client

2022-10-17
阅读 10 分钟
4.6k
  Go语言中,当我们需要访问第三方服务时,通常基于http.Client完成,顾名思义其代表HTTP客户端。http.Client的使用相对比较简单,不过底层有一些细节还是要多注意,包括长连接(连接池问题),可能偶现的reset情况等等。本篇文章主要介绍http.Client的基本使用方式,实现原理,以及一些注意事项。

【4-1 Golang】常用标准库—net/http.server

2022-10-14
阅读 9 分钟
2.2k
  Go语言创建HTTP服务还是非常方便的,基于http.Server几行代码就能实现,本篇文章主要介绍http.Server的基本使用方式以及HTTP请求处理流程。当然,目前很多web服务都基于gin框架实现,所以我们也会简单介绍下gin框架的一些使用套路。

【3-4 Golang】GC—调度与调优

2022-10-13
阅读 10 分钟
2.3k
  关于垃圾回收的基本知识已经介绍的差不多了,只是要知道垃圾回收过程是需要耗费CPU时间的,那就有可能会影响到用户协程的调度,所以在某些场景需要垃圾回收相关调优。本篇文章主要介绍垃圾回收的触发时机,以及垃圾回收器的几种调度模式,只有了解这些才能知道如何调优;最后结合常用的缓存框架bigcache,分...

【3-3 Golang】GC—标记 清理

2022-10-12
阅读 9 分钟
1.7k
  上一篇文章我们主要介绍了三色标记法与写屏障技术,基于这些基础,本篇文章将重点介绍垃圾回收的整个处理流程(开启-标记-标记结束-清理),包括标记协程主流程,经典的startTheworld/stopTheworld问题,辅助标记是什么,清理过程等等。

【3-2 Golang】GC—三色标记与写屏障

2022-10-11
阅读 8 分钟
2.3k
  垃圾回收就是找出不再使用的对象并回收这些内存。如何找出呢?这就不得不说一下三色标记法,这是Go语言垃圾回收的基础。本篇文章主要介绍三色标记法,包括三色标记算法,写屏障技术;以及Go语言是如何实现三色标记和写屏障的。

【3-1 Golang】GC—内存管理

2022-10-10
阅读 8 分钟
2.2k
  Go语言为我们做了很多,创建对象不再需要我们手动申请内存,也不用考虑对象使用完后释放内存,这些对开发者来说都是透明的;但是作为一名Go开发者,内存管理和垃圾回收还是有必要深入研究的。毕竟,内存与CPU是程序高效运行的基础。

【2-9 Golang】Go并发编程—并发编程

2022-10-09
阅读 8 分钟
2k
  Go语言为我们提供了基于消息传递CSP并发模型,基于管道 + 协程可以很方便的编写高并发服务,但是在某些场景下,或多或少还是需要使用到锁,本篇文章主要介绍除了管道chan之外的常见并发编程模式。

【2-8 Golang】Go并发编程—panic defer recover

2022-10-08
阅读 7 分钟
1.5k
  在Go程序中defer特别常见,通常用来执行一些清理工作,需要注意defer先入后出特性(先声明的后执行);panic意味着一些出乎意料的错误发生,Go程序在panic异常退出的时候,会打印运行时栈方便排查问题;panic的错误可以被recover捕获,从而避免Go程序的退出,但是要注意recover只能在defer中,其他任何地方...

【2-7 Golang】Go并发编程—系统调用

2022-09-30
阅读 5 分钟
2.1k
  还记得GMP协程调度模型吗?M是线程,G是协程,P是逻辑处理器,线程M只有绑定P之后才能调度并执行协程G。那如果用户协程中执行了系统调用呢?我们都知道执行系统调用会发生用户态到内核态切换,而且系统调用也有可能会阻塞线程M。M阻塞了还怎么调度协程呢?万一所有的线程M都因系统调用阻塞了呢?阻塞期间谁...

【2-6 Golang】Go并发编程—定时器timer

2022-09-29
阅读 6 分钟
2.7k
  定时器使得我们可以延迟若干时间执行某项任务,或者以某一时间周期性执行某项任务,Linux系统本身也具备定时器能力,Go语言是定时器是基于系统调用实现的吗?另外,Go语言不是多协程吗,定时器触发时,是在哪个协程执行任务的呢?创建任务的协程吗?

【2-5 Golang】Go并发编程—管道chan

2022-09-28
阅读 10 分钟
3.3k
  Go语言实现了两种多线程同步方案,一种是传统多线程语言类似,基于共享内存方案;另一种称之为基于协程-管道的CSP(communicating sequential processes)并发编程模型,这也是Go语言推荐的方式。本篇文章主要讲解管道在并发编程中的典型应用,以及管道的底层实现原理。

【2-4 Golang】Go并发编程—网络IO

2022-09-27
阅读 9 分钟
2.6k
  我们都知道用户程序读写socket的时候,可能阻塞当前协程,那么是不是说明Go语言采用阻塞方式调用socket相关系统调用呢?你有没有想过,Go语言又是如何实现高性能网络IO呢?有没有使用传说中的IO多路复用,如epoll呢?

【2-3 Golang】Go并发编程—调度器schedule

2022-09-26
阅读 8 分钟
1.9k
  我们一直提到,每一个线程都有一个线程栈,也称为系统栈;协程g0就运行在这个栈上,而且协程g0执行的就是调度逻辑schedule。Go语言调度器是如何管理以及调度这些成千上万个协程呢?和操作系统一样,维护着可运行队列和阻塞队列吗,有没有所谓的按照时间片或者是优先级或者是抢占式调度呢?

【2-2 Golang】Go并发编程—协程管理

2022-09-23
阅读 11 分钟
2.2k
  上一篇文章我们介绍了GMP并发模型的基本概念,知道了M是线程,P是逻辑处理器,G是协程。也了解到每一个M线程都有一个调度协程g0,调度主逻辑由函数schedule实现;协程都有自己的协程栈,协程的切换其实就是协程栈的切换,其实就是若干寄存器的保存与恢复。本篇文章重点介绍协程的管理,包括协程创建,协程切...

【2-1 Golang】Go并发编程—GMP调度模型概述

2022-09-22
阅读 7 分钟
2k
  Go语言天然具备并发特性,基于go关键字就能很方便的创建协程去执行一些并发任务,而且基于协程-管道的CSP并发编程模型,相比于传统的多线程同步方案,可以说简单太多了。从本篇文章开始,将为大家介绍Go语言的核心:并发编程;不仅包括协程/管道/锁等的基本使用,还会深入到协程实现原理,GMP协程调度模型等。

【1-7 Golang】Go语言快速入门—泛型

2022-09-21
阅读 5 分钟
1.6k
  Golang在1.18版本支持了泛型,写过java/c++等语言的可能对泛型有一定的了解。那么泛型到底是什么呢?他有什么作用呢?