分类: Go

29 篇文章

thumbnail
Golang面试题
Go基础 切片 通过 make 方法去声明一个 int 32 类型的一个slice,指定它的长度为10,容量为20。那么对于这样生成的一个变量,它在内存当中占据多大的空间? 切片对象占用内存大小:int 类型的 cap、len 字段,一个底层数组的指针。8+8+8=24 字节 底层数组占用内存大小:int32 类型,长度为 20 的数组。4*20=…
利用golang-migrate,实现 Golang 项目启动时自动维护数据库变更
前言 数据库变更管理是软件发布必不可少的环节,理想状态是只需发布一个镜像,就能更新应用和数据库。我们项目使用gorm来操作数据库,gorm是具有数据库迁移功能的,但是没有SQL脚本直观。另外我们的应用是同库多服务的微服务,还有些服务存在多个实例的情况,这就需要考虑数据竞争问题了。经过调研,最终选择了Github 10k star 的golang-m…
thumbnail
Go 进阶训练营 – 并行编程一:Goroutine
Processes and Threads 进程 操作系统会为该应用程序创建一个进程。作为一个应用程序,它像一个为所有资源而运行的容器。这些资源包括内存地址空间、文件句柄(文件描述符)、设备和线程。 不同的应用程序使用的内存空间不同,在操作系统里,就是用进程来做的资源管理、隔离。 线程 线程是操作系统调度的一种执行路径,用于在处理器执行我们在函数中…
thumbnail
Go 进阶训练营 – 评论系统架构设计四:可用性设计
Singleflight 对于热门的主题,如果存在缓存穿透的情况,会导致大量的同进程、跨进程的数据回源到存储层,可能会引起存储过载的情况,如何只交给同进程内,一个人去做加载存储? 使用归并回源的思路:https://pkg.go.dev/golang.org/x/sync/singleflight,同一时间只有一个协程去拿数据,拿到数据前,相同任务…
thumbnail
Go 进阶训练营 – 评论系统架构设计三:存储设计
存储设计 comment_subject 抽象的主题表,把评论的主体抽象出来,包含专有属性,例如state。 id:mysql必须有主键,不建立主键mysql也会提供一个rowId 使用自增,为了顺序存储,提高读写性能。 索引搜索快还是主键搜索快? 索引搜索是根据索引字段找到主键,再通过主键去找到记录,也就是二级索引。 用递增int不会带来安全性问…
thumbnail
Go 进阶训练营 – 评论系统架构设计二:详细设计
详细设计 comment-service 专注在评论数据处理(认真想下 Separation of Concerns 关注点分离,职责更清晰)。我们一开始是 comment-service 和 comment 是一层,业务耦合和功能耦合在一起,非常不利于迭代,当然在设计层面可以考虑目录结构进行拆分,但是架构层次来说,迭代隔离也是好的。 读的核心逻辑…
thumbnail
Go 进阶训练营 – 评论系统架构设计一:概要设计
评论系统架构设计 这节课程是结合实际业务场景,来做系统架构设计。 架构设计 做架构设计前,需要深度理解产品的业务背景,才能做出更好的设计与抽象,而不是简单的翻译需求。 例如视频评论系统,就可以抽象出通用的评论功能,从而实现评论平台,接入到各种业务形态:文章评论、漫画评论等。 核心功能 发布评论: 支持回复楼层、楼中楼。 读取评论: 按照时间、热度排…
Go 进阶训练营 – Go 工程化实践三:配置管理
配置分类 环境变量(配置) 在部署、运行时能获取到的信息,没必要放到配置文件里。可通过K8S注入到容器或者物理机,供kit 库读取使用。 Region:区域 Zone:可用区 Cluster:集群 Environment:环境,由集群本身决定,而不是取决于应用 Color:染色信息,可用于分发流量,实现多租户 Discovery:注册中心?课程没说…
thumbnail
Go 进阶训练营 – Go 工程化实践二:API 设计
API 定义文件放在哪? 放在当前项目 使用时,需要import此项目,造成API和源码绑定,不好单独管理权限。 放在当前项目,并通过CI自动同步到API大仓——B站的方案 为了统一检索和规范 API,B站内部建立了一个统一的 bapis 仓库,整合所有对内对外 API。 参考 https://github.com/googleapis/googl…
thumbnail
Go 进阶训练营 – Go 工程化实践一:工程项目结构
工程项目结构 序言 go工程的项目结构多种多样,不同的框架对应不同的结构,即使是同一个框架,也有可能出现不同的结构。我个人感觉目前go很年轻,处于百花齐放的时代。而不像java,早已形成业界标准,主流框架spring全家桶,你想要的它都有。基本不用纠结项目结构,只需照着来就行。这对刚从java转到go的同学造成很大的困扰,不知道怎么写符合业界标注,…