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…
《Go语言精进之路:从新手到高手的编程思想、方法和技巧1》10-12章笔记
第10条 使用iota实现枚举常量 Go的const语法提供了“隐式重复前一个非空表达式”的机制,来看下面的代码: 常量定义的后两行没有显式给予初始赋值,Go编译器将为其隐式使用第一行的表达式,这样上述定义等价于: iota是Go语言的一个预定义标识符,它表示的是const声明块(包括单行声明)中每个常量所处位置在块中的偏移值(从零开始)。 iot…
《Go语言精进之路:从新手到高手的编程思想、方法和技巧1》7-9章笔记
第7条 使用Go命名惯例对标识符进行命名 计算机科学中只有两件难事:缓存失效和命名。 ——Phil Karlton,Netscape架构师 Go语言的贡献者和布道师Dave Cheney给出了一个说法:“一个好笑话,如果你必须解释它,那就不好笑了。好的命名也类似。” 简单且一致;利用上下文辅助命名。 7.1 简单且一致 Go命名惯例选择了简洁命名+…
Gitlab CI/CD 实践六:统一管理 protocol buffer,API 大仓设计与实现
背景 目前公司采用 protocol buffer 作为 IDL,虽然可以根据 API 定义,轻松生成客户端和服务端的代码。但是对于跨项目的接口,会增加项目之间的耦合性。例如A服务对外提供了一个接口,B服务去调用。那么就需要根据A服务的proto文件,生成客户端代码,并拷贝给B。如果联调期间,A服务改动了该接口,还需重复前面的步骤,非常繁琐。 由此…
Go进阶训练营 – 微服务概览与治理四:多集群 & 多租户
同系列文章:Go 进阶训练营 为什么需要多集群? L0 服务,一旦故障影响巨大,所以需要保障高可用。 单一集群中,多个节点保证可用性,一般采用 N+2 来冗余节点。 N 通过压测得出 出现集群级别的问题,例如redis集群出问题了,整个集群的服务都受影响,所以需要多集群来保障可用性。每个集群独占缓存,带来更好的性能和冗余。 部署到多个机房,避免单机…
Go进阶训练营 – 微服务概览与治理三:gRPC & 服务发现
同系列文章:Go 进阶训练营 服务调用:gRPC 什么是gRPC? A high-performance, open-source universal RPC framework。 语言中立,公司里可能存在不同语言的服务需要交互。 统一采用gRPC作为服务之间的通信协议,可能存在其他性能更好的解决方案,但不要过早关注性能问题,先标准化更重要。 轻量…
Gitlab CI/CD 实践五:基础镜像 Dcokerfile 仓库 CI 流水线配置
基础镜像Dcokerfile集中管理 优点 结合Gitlab CI,可以快速便捷地新建和更新镜像。 可以快速找到镜像对应的 Dockerfile,明确镜像的具体组成,避免重复造轮子。 基于Dockerfile,方便对镜像进行扩展。 如何使用 创建、修改Dockerfile文件,提交到仓库,就会触发 Gitlab 流水线,自动构建镜像并上传到Harb…
Gitlab CI/CD 实践四:Golang 项目 CI/CD 流水线配置
.gitlab-ci.yml 流水线入口:阶段 stages: - lint - test - build - deploy 流水线以job为单位运行,每个job就是自己想通过流水线做的事情,例如单元测试的job,核心是运行脚本: go test -short go list ./... 每个阶段下可以定义多个job。 同一阶段的job会并行执行。…
Go进阶训练营 – 微服务概览与治理二:微服务设计
同系列文章:Go 进阶训练营 API Gateway B站进行了 SOA 服务化的架构演进,按照垂直功能进行了拆分,对外暴露了一批微服务,但是因为缺乏统一的出口面临了不少困难: 1.0 客户端到微服务直接通信,强耦合。 如果涉及移动端,同时存在多版本,api兼容困难,重构困难,用户可能还在使用一年前版本的移动端。 需要多次请求,客户端聚合数据,工作…