Go在工程实践的错误处理
Golang在工程实践中的错误处理 彭友顺 石墨文档 产研负责人 目 录 为什么我们处理错误会这么慢 01 如何完善错误信息 02 优雅处理错误信息 03 分布式错误处理 04 错误信息手册的必要性 05 为什么我们处理错误 会这么慢 第一部分 错误信息不够完善 why 原因 出现 错误 定位 慢 恢复 慢 效率低 为什么我们处理错误会这么慢 错误处理不够优雅 分布式错误难以串联 高亮信息 封装组件 充足信息 对端信息 请求方法 请求参数 响应数据 状态信息 耗时时间 执行行号 能够确定对端的唯一来源,例如对端的应用名称、对端的 配置、对端的IP。 对端请求的方法。 请求的参数信息,包括 header 里的 metadata 响应的数据,包括 header 里的 metadata 错误码和错误信息 请求到响应的耗时时间 调用处执行的行号 总结起来,调试阶段需要对接的信息 对接起来会非常麻烦 优雅处理错误信息 第三部分 为什么定位慢?-- 错误处理 不要透传错误 错误码唯一性 记录一次错误 假设用户反馈了无法打开一个文件 我们的程序员非常认真 记录了文件不存在的错误日志 • 同样的错误信息,非常多的杂音 • 每个Error,都去查看一次对应代码,排查效率低 • 占用存储空间 • 最外层入口处只记录一次错误日志 为什么定位慢?-- 错误处理 带来新的问题,无法定位整个代码执行链路0 码力 | 30 页 | 3.11 MB | 1 年前3Go Web编程
web工作方式 3.2 Go搭建一个简单的web服务 3.3 Go如何使得web工作 3.4 Go的http包详解 3.5 小结 4.表单 4.1 处理表单的输入 4.2 验证表单的输入 4.3 预防跨站脚本 4.4 防止多次递交表单 4.5 处理文件上传 4.6 小结 5.访问数据库 5.1 database/sql接口 5.2 使用MySQL数据库 5.3 使用SQLite数据库 5.4 session和cookie 6.2 Go如何使用session 6.3 session存储 6.4 预防session劫持 6.5 小结 7.文本文件处理 7.1 XML处理 7.2 JSON处理 7.3 正则处理 7.4 模板处理 7.5 文件操作 7.6 字符串处理 7.7 小结 8.Web服务 8.1 Socket编程 8.2 WebSocket 8.3 REST 8.4 RPC 8.5 小结 国际化和本地化 10.1 设置默认地区 10.2 本地化资源 10.3 国际化站点 4 10.4 小结 11.错误处理,调试和测试 11.1 错误处理 11.2 使用GDB调试 11.3 Go怎么写测试用例 11.4 小结 12.部署与维护 12.1 应用日志 12.2 网站错误处理 12.3 应用部署 12.4 备份和恢复 12.5 小结 13.如何设计一个Web框架 13.1 项目规划0 码力 | 295 页 | 5.91 MB | 1 年前3微服务容灾治理
那我们想想,如果我们的服务CPU被打满了,是不是后⾯所有的请求也都被卡住了?等服务处理完请 求的时候,⽤⼾那⾥可能已经超时离开了,结果服务器很忙,但都是做的⽆⽤功。如果这⾥不能理 解,停下来好好思考⼀番,如果还不懂的话,可以来go-zero群⾥讨论讨论。。。 2.1模拟CPU密集型服务 有⼈可能会问CPU密集型服务怎么定义?你的服务CPU会打满吗?处理请求会包含复杂的计算逻辑 吗?你经常需 上模拟CPU负载的请求处理代码。 模拟CPU计算的代码:https://gist.github.com/kevwan/ccfaf45aa190ac44003d93c094a12c3f benchmarkCPU-103303600743ns/op 从 benchmark 结果可以看出单个请求的逻辑处理需要3.6msCPU资源(不包括服务端中间件处理 消 消耗)。对于两核的容器来说,qps上限约为550(2000/3.6)。但是我们是⼀个HTTPserver,肯定 还有接受请求、解析请求、返回结果等开销,实际上是达不到550qps的。 这个模拟CPU的代码本⾝不重要,就不做介绍了。 2.2压测场景 2.2.1场景⼀(不开启过载保护) Timeout:1000 Middlewares: Breaker:false0 码力 | 13 页 | 1.68 MB | 1 年前3Go 入门指南(The way to Go)
章)。我们会对 Go 语 言的函数式和面向对象编程进行透彻的讲解,包括如何使用 Go 语言来构造大型项目(第 9 章)。 在本书的第三部分,你将会学习到如何处理不同格式的文件(第 12 章)和如何在 Go 语言中巧妙地使用 错误处理机制(第 13 章)。然后我们会对 Go 语言中最值得称赞的设计 goroutine 和 channel 进行并发 和多核应用的基本技巧的讲解(第 14 章)。最后,我们会讨论如何将 很庆幸 Stroustrup 做了让 C++ 兼容 C 语言以能够让其编译 C 程序这个正确的决定。我们当时需要 C++ 的出 现。” “之后我们学到了更多。我们毫无疑问地接受了垃圾回收,异常处理和虚拟机这些当年人们认为只有疯子 才会想的东西。C++ 的复杂程度(新版的 C++ 甚至更加复杂)极大了影响了软件开发的高效性,这使得 它再也不再适合这个时代。人们不再像过往那样认同在 C++ 中兼容使用 来实现各个 goroutine 之间的通信。他们实现了分段栈增长和 goroutine 在线程基础上多路复用技术的自动化。 这个特性显然是 Go 语言最强有力的部分,不仅支持了日益重要的多核与多处理器计算机,也弥补了现存 编程语言在这方面所存在的不足。 Go 语言中另一个非常重要的特性就是它的构建速度(编译和链接到机器代码的速度),一般情况下构建 一个程序的时间只需要数百毫秒到几秒。作为大量使用0 码力 | 380 页 | 2.97 MB | 1 年前3Go 入门指南(The way to Go)
XML 数据格式 12.11 用 Gob 传输数据 12.12 Go 中的密码学 第13章:错误处理与测试 13.1 错误处理 13.2 运行时异常和 panic 13.3 从 panic 中恢复(Recover) 13.4 自定义包中的错误处理和 panicking 13.5 一种用闭包处理错误的模式 13.6 启动外部命令和程序 13.7 Go 中的单元测试和基准测试 13.8 16.5 不需要将一个指向切片的指针传递给函数 16.6 使用指针指向接口类型 16.7 使用值类型时误用指针 16.8 误用协程和通道 16.9 闭包和协程的使用 16.10 糟糕的错误处理 第 17章 模式 17.1 关于逗号ok模式 第 18章 出于性能考虑的实用代码片段 18.1 字符串 18.2 数组和切片 18.3 映射 18.4 结构体 18.5 接口 18 11 章)。我们会对 Go 语言的函数式和面 向对象编程进行透彻的讲解,包括如何使用 Go 语言来构造大型项目(第 9 章)。 在本书的第三部分,你将会学习到如何处理不同格式的文件(第 12 章)和如何在 Go 语言中巧妙地使用错误处理机 制(第 13 章)。然后我们会对 Go 语言中最值得称赞的设计 goroutine 和 channel 进行并发和多核应用的基 本技巧的讲解(第 14 章)。最后,我们会讨论如何将0 码力 | 466 页 | 4.44 MB | 1 年前3Go可观测性实践
Receiver • Processor • Exporter 微服务业务架构图 项目工程layout 遥测数据处理架构 链路追踪 第二部分 无所不在的部署 持续监控 低消耗 应用级透明 延展性 链路追踪设计目标 链路追踪 Dapper 每个请求都生成一个全局唯一的 traceid,端到端透传到上下游所有节点,每一层生成一个 spanid, 通过traceid parentid 表达节点 的父子关系 链路追踪 在分布式系统中请求的路径经常很凌乱且无法预测,为了构建我们想要的任何路 径的视图,无论多么复杂,每个组件都需要五段数据: • TraceID:请求唯一标识符,由根span产生,贯穿请求的各个阶段。 • SpanID:span包含单一链路中一个工作单元收到的信息。 • ParentID:区别请求链路中的嵌套包含关系,根Span没有ParentID。 • 执行时长:每个Span都必须记录工作开始到结束时花费的时长。 Go工程插桩(Instrument) 需要对业务开发者几乎零成本的接入链路追踪,几乎完全依赖于少量通用组件库的改造。 当一个请求在处理跟踪控制路径的过程中,需要把跟踪的上下文存储在ThreadLocal中,在Go中 就是存储在Context中,一般约定每个方法第一个参数为Context(上下文)。 覆盖组件不限于:数据库、缓存、消息队列、RPC、HTTP等。0 码力 | 35 页 | 2.88 MB | 1 年前3go web 框架 严清
框架要解决三个核⼼心问题 • 定义灵活、⼀一致的开发模式 简单易易上⼿手,⽀支撑⼤大规模复杂应⽤用,⽀支撑团队开发 • 集成简洁、完善的异常处理理能⼒力力 不不被 if err != nil { } 羁绊,不不放过任何异常,优雅漂亮地处理理错误和异常 • 提供强⼤大、实⽤用的 HTTP 操作⽅方法语法糖 写 web 服务就是操作 HTTP,实⽤用语法糖极⼤大提升开发⼈人员的幸福指数 框架核⼼心能⼒力力三要素 Router, Logging, CORS, Favicon, Secure, Static, JWT-Auth, Ratelimiter, Tracing… Gin中间件,error 处理理? type HandlerFunc func(*Context) Echo 中间件,MiddlewareFunc? type HandlerFunc func(Context) error 函数有没有写⼊入数据?会不不会出错?出错怎么处理理?再次写⼊入? 2. 通过 context 设置请求超时控制,超时或 cancel 后在运⾏行行的中间件处理理流会终⽌止吗? Middleware 模式及其控制 集中、智能、灵活的异常处理理 func(ctx *gear.Context) error 框架捕获了了某个中间件的 error 怎么处理理? type HTTPError interface0 码力 | 23 页 | 333.12 KB | 1 年前32-6-Golang 在 Baidu-FrontEnd 的应用-陶春华
shooting 后台程序开发的需求(3) • 上线和运维 –对运行环境的依赖 –对库(动态库)的依赖 后台程序编程的难点 • 内存的管理 –C程序中很大比例的Bug和内容有关 • 分布式/高并发的处理 –10年前还是一个很hot的话题;目前也还没有普 遍掌握 –CPU资源的调度:Process/Thread/Event –数据的封装和互斥访问; –并行运算逻辑的同步 C vs Python – Python: 解释执行,动态类型 • 并发性能 – C:直接用系统的机制 – Python: 自己实现的thread, 只能使用一个CPU • 开发效率 – 相差5-10倍 – 内存的处理是一个难点 – dict/map, list C vs Python (2) • 大型程序的组织 – C: 无namespace • 可测试能力 – C、python都有*Unit测试框架 • 百度统一前端 –七层流量接入平台 BFE(Baidu Front End) • 主要服务 • 接入转发 • 防攻击、流量调度、数据分析 • 业务现状 • 覆盖大部分重要产品 • 日请求量千亿级别 接入与转发 防攻击 流量调度 数据分析 BFE 为什么重写BFE • 现存问题 –修改成本高 • 事件驱动的编程模型:编码和调试难度大 • C语言本身的难度和开发效率0 码力 | 35 页 | 730.17 KB | 1 年前31.5 Go 语言构建高并发分布式系统实践
go语⾔言程序开发需要找到⼀一种平衡,既利⽤用协程带来的便利性⼜又做适当 集中化处理 套路:任务池集中数据合并请求、连接池+pipeline 利⽤用全双⼯工特性 经验⼀一 性能优化 性能优化:io集中处理 通信库 性能优化:io集中处理 通信库 性能优化:数据集中处理 性能优化:数据集中处理 go语⾔言开发追求开销 适⽤用 = 开发体验好 + 服务稳定 + 性能满⾜足需要 go语⾔言程序开发需要找到⼀一种平衡,既利⽤用协程带来的便利性⼜又做适当集中化处理 套路 = 按请求和业务逻辑并⾏行+任务池集中数据合并请求 + 连接池集中收发 go语⾔言开发追求开销优化的极限,谨慎引⼊入其他语⾔言领域⾼高性能服务的通⽤用⽅方案 内存池+对象池使⽤用 与 代码可读性与整体效率的权衡0 码力 | 39 页 | 5.23 MB | 1 年前3Golang 101(Go语言101 中文版) v1.21.a
型的时候,舍入(或者精 度丢失)也是允许的。 具体规则如下: 当从一个比特位数多的整数类型的非常量整数值向一个比特位数少的整数 类型转换的时候,高位的比特将被舍弃,低位的比特将被保留。我们称这 种处理方式为截断(truncated)。 当从一个非常量的浮点数向一个整数类型转换的时候,浮点数的小数部分 将被舍弃(向零靠拢)。 当从一个非常量整数或者浮点数向一个浮点数类型转换的时候,精度丢失 是可以发生的。 当一个程序的主协程退出后,此程序也就退出了,即使还有一些其它协程在运 行。 和前面的几篇文章不同,上面的例子程序使用了log标准库而不是fmt标准库 中的Println函数。 原因是log标准库中的打印函数是经过了同步处理的(下 一节将解释什么是并发同步),而fmt标准库中的打印函数却没有被同步。 如 果我们在上例中使用fmt标准库中的Println函数,则不同协程的打印可能会 交织在一起。(虽然对此例来说,交织的概率很低。) 必须被另外一个协程通过 某种并发同步方法来被动地结束阻塞状态。 如果一个运行中的程序当前所有 的协程都出于阻塞状态,则这些协程将永远阻塞下去,程序将被视为死锁了。 当一个程序死锁后,官方标准编译器的处理是让这个程序崩溃。 比如下面这个程序将在运行两秒钟后崩溃。 1| package main 2| 3| import ( 4| "sync" 5| "time" 6| ) 7|0 码力 | 821 页 | 956.82 KB | 1 年前3
共 63 条
- 1
- 2
- 3
- 4
- 5
- 6
- 7