thumbnail
Go 进阶训练营 – 错误处理二:错误定义与处理
error type: 错误定义与判断 Sentinel Error 哨兵错误,就是定义一些包级别的错误变量,然后在调用的时候外部包可以直接对比变量进行判定,在标准库当中大量的使用了这种方式。例如下方 io 库中定义的错误。 // EOF is the error returned by Read when no more input is ava…
thumbnail
fmt.Println()和println()的区别
背景 在测试error.is时,发现一个奇怪的现象,同时使用fmt.Printf和println,输出顺序无法保证,也就是可能存在异步输出。 err := errors.New("standard error") myError := MyError{1, "my error"} if errors.Is(e…
Go 进阶训练营 – 错误处理一:最佳实践
同系列文章:Go 进阶训练营 Go error/panic VS java exception 和java相比,go的异常处理两极化,panic比exception更严重,java exception是线程级别的,而go的panic是进程级别,任意goroutine出现panic都会导致整个进程挂掉,更能提醒异常情况。error比exception…
thumbnail
《Go语言精进之路:从新手到高手的编程思想、方法和技巧1》10-12章笔记
第10条 使用iota实现枚举常量 Go的const语法提供了“隐式重复前一个非空表达式”的机制,来看下面的代码: 常量定义的后两行没有显式给予初始赋值,Go编译器将为其隐式使用第一行的表达式,这样上述定义等价于: iota是Go语言的一个预定义标识符,它表示的是const声明块(包括单行声明)中每个常量所处位置在块中的偏移值(从零开始)。 iot…
thumbnail
《Go语言精进之路:从新手到高手的编程思想、方法和技巧1》7-9章笔记
第7条 使用Go命名惯例对标识符进行命名 计算机科学中只有两件难事:缓存失效和命名。 ——Phil Karlton,Netscape架构师 Go语言的贡献者和布道师Dave Cheney给出了一个说法:“一个好笑话,如果你必须解释它,那就不好笑了。好的命名也类似。” 简单且一致;利用上下文辅助命名。 7.1 简单且一致 Go命名惯例选择了简洁命名+…
thumbnail
Gitlab CI/CD 实践六:统一管理 protocol buffer,API 大仓设计与实现
背景 目前公司采用 protocol buffer 作为 IDL,虽然可以根据 API 定义,轻松生成客户端和服务端的代码。但是对于跨项目的接口,会增加项目之间的耦合性。例如A服务对外提供了一个接口,B服务去调用。那么就需要根据A服务的proto文件,生成客户端代码,并拷贝给B。如果联调期间,A服务改动了该接口,还需重复前面的步骤,非常繁琐。 由此…
thumbnail
Go进阶训练营 – 微服务概览与治理四:多集群 & 多租户
同系列文章:Go 进阶训练营 为什么需要多集群? L0 服务,一旦故障影响巨大,所以需要保障高可用。 单一集群中,多个节点保证可用性,一般采用 N+2 来冗余节点。 N 通过压测得出 出现集群级别的问题,例如redis集群出问题了,整个集群的服务都受影响,所以需要多集群来保障可用性。每个集群独占缓存,带来更好的性能和冗余。 部署到多个机房,避免单机…
thumbnail
Go进阶训练营 – 微服务概览与治理三:gRPC & 服务发现
同系列文章:Go 进阶训练营 服务调用:gRPC 什么是gRPC? A high-performance, open-source universal RPC framework。 语言中立,公司里可能存在不同语言的服务需要交互。 统一采用gRPC作为服务之间的通信协议,可能存在其他性能更好的解决方案,但不要过早关注性能问题,先标准化更重要。 轻量…
thumbnail
Gitlab CI/CD 实践五:基础镜像 Dockerfile 仓库 CI 流水线配置
基础镜像Dockerfile集中管理 完整代码:https://github.com/EchoGroot/dockerfile 优点 结合Gitlab CI,可以快速便捷地新建和更新镜像。 可以快速找到镜像对应的 Dockerfile,明确镜像的具体组成,避免重复造轮子。 基于Dockerfile,方便对镜像进行扩展。 如何使用 创建、修改Dock…
thumbnail
Gitlab CI/CD 实践四:Golang 项目 CI/CD 流水线配置
概要 通过gitlab CI/CD,可实现提交代码时触发golang应用的单元测试、代码检查、构建镜像、推送镜像到镜像私仓、部署应用到k8s,下面说下具体实现。 创建流水线脚本文件 在项目根目录创建.gitlab-ci.yml文件。 引入公共脚本库 include: - project: 'devops/gitlab-cicd-templ…