Golang 优雅实现责任链
前言 在微服务框架kratos中,通过中间件对请求进行扩展处理。有点像java里的servlet,也是用的责任链实现的,但实现方式很巧妙,这里详细说一下。 具体实现 处理顺序 ┌───────────────────┐ │MIDDLEWARE 1 │ │ ┌────────────────┐│ │ │MIDDLEWARE 2 ││ │ │ ┌───…
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语言精进之路》10-12章笔记
第10条 使用iota实现枚举常量 Go的const语法提供了“隐式重复前一个非空表达式”的机制,来看下面的代码: 常量定义的后两行没有显式给予初始赋值,Go编译器将为其隐式使用第一行的表达式,这样上述定义等价于: iota是Go语言的一个预定义标识符,它表示的是const声明块(包括单行声明)中每个常量所处位置在块中的偏移值(从零开始)。 iot…
thumbnail
《Go语言精进之路》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
分布式系统的 CAP 定理
分布式系统的三大指标,Eric Brewer 说,这三个指标不可能同时做到。这个结论就叫做 CAP 定理。 Partition tolerance 分区容错性,多数分布式系统都分布在多个子网络,每个子网络就是一个区。分区容错的意思是,允许区间通信失败,也就是节点之间通信失败。强调节点的独立性。 分布式系统中,网络异常是很难避免的,因此可以认为 CA…
HTTP 协议演进
Http 1.0 存在的问题 无法复用链接:每个请求都需要建立TCP链接。 对头阻塞:第二个请求必须等第一个请求响应后才能发起。 Http 1.1 特性 默认使用长连接,可配置Keep-alive来控制连接时间 支持请求管道化,客户端可以发送多个请求,而不用等待前一个请求响应。 存在的问题 为了让客户端识别请求对应的响应,服务端响应时,必须按照请求…