分类: Go

28 篇文章

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
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 实践四:Golang 项目 CI/CD 流水线配置
概要 通过gitlab CI/CD,可实现提交代码时触发golang应用的单元测试、代码检查、构建镜像、推送镜像到镜像私仓、部署应用到k8s,下面说下具体实现。 创建流水线脚本文件 在项目根目录创建.gitlab-ci.yml文件。 引入公共脚本库 include: - project: 'devops/gitlab-cicd-templ…
thumbnail
Go进阶训练营 – 微服务概览与治理二:微服务设计
同系列文章:Go 进阶训练营 API Gateway B站进行了 SOA 服务化的架构演进,按照垂直功能进行了拆分,对外暴露了一批微服务,但是因为缺乏统一的出口面临了不少困难: 1.0 客户端到微服务直接通信,强耦合。 如果涉及移动端,同时存在多版本,api兼容困难,重构困难,用户可能还在使用一年前版本的移动端。 需要多次请求,客户端聚合数据,工作…
thumbnail
Go进阶训练营 – 微服务概览与治理一:微服务概览
同系列文章:Go 进阶训练营 业务场景各有不同,分享内容时不要太具体到哪个业务场景,应该找到变化中不变的部分。万变不离其宗,先把本质学好。 单体应用 单体应用业务复杂后,应用无法扩展,可靠性低。而且无法针对热点模块单独处理。整体资源利用率低。 微服务和SOA的关系 微服务是SOA的一种实践。 小既是美:小服务代码少,易维护、bug少、易测试 单一职…
thumbnail
远程过程调用系统gRPC
简介 gRPC 可以将 Protocol buffers 用作其接口定义语言 ( IDL ) 和底层消息交换格式(也可以使用其他的,例如json) 远程调用,跨语言,更容易创建分布式应用和服务 和其他RPC一样,基于服务定义的思想,结合Protocol buffers+gRPC 插件,定义好服务后,服务端实现相应接口,客户端直接调用生成好的方法即可…