03 2022 档案
摘要:1. 路由组 在实际的项目开发中,均是模块化开发 同一模块内的功能接口,往往会有相同的接口前缀,这种可以用路由组来进行分类处理。 比如下面这几组接口: 注册:http: //localhost:8080/user/register 登陆:http: //localhost:8080/user/log
阅读全文
摘要:1. 实体绑定 以一个用户注册功能来进行表单实体绑定操作 用户注册需要提交表单数据,假设注册时表单数据包含三项: username phone password 我们创建一个UserRegister结构体用于接收表单数据,通过tag标签的方式设置每个字段对应的form表单中的属性名,通过bindin
阅读全文
摘要:1. hello world 首先拉取gin开发框架 go get -u github.com /gin-gonic/gin 我们从入门的hello world入手看起gin是如何构建一个http服务器的 package main import "github.com/gin-gonic/gin"
阅读全文
摘要:go在线程的基础上实现了用户态更加轻量级的写成,线程栈为了防止stack overflow,默认大小一般是2MB,而在go中,协程栈在初始化时是2KB go中的栈是可以扩容的,在64位操作系统上最大为1GB 1. newstack()函数 在函数序言阶段如果判断出需要扩容,则会跳转调用运行时more
阅读全文
摘要:1. Docker底层技术支撑 Linux 命令空间、控制组和UnionFS三大技术支撑了目前Docker的实现: namespace命名空间:容器隔离的基础,保证A容器看不到B容器 cgroups控制组:容器资源统计和隔离 UnionFS联合文件系统:分层镜像实现的基础 实际上Docker使用了很
阅读全文
摘要:1. 切片的结构 一个切片在运行时由指针、长度和容量三部分构成 指针指向切片元素对应的底层数组元素的地址;长度对应切片中元素的数目,长度不能超过容量;容量一般是从切片的开始位置到底层数组的结尾位置的长度 2. 切片的底层原理 在编译时构建抽象语法树阶段会将切片构建为如下类型: type Slice
阅读全文
摘要:1. 什么是httprouter 较为流行的go web框架大多使用httprouter,或者是基于httprouter的变种对路由进行支持。 httprouter使用的是显式匹配,所以在路由设计的时候会存在一些路由冲突的问题: GET /user/info/:name GET /user/:id
阅读全文
摘要:转载:https://zhuanlan.zhihu.com/p/27917262 以一个简单的channel应用开始,使用goroutine和channel实现一个任务队列,并行处理多个任务。 func main(){ //带缓冲的channel ch := make( chan Task, 3)
阅读全文
摘要:面试时间:2022.3.23 1. 自我介绍 2. 本科和硕士期间的成绩、奖学金、比赛获奖 3. 知道面试的这个部门大概工作是什么样的吗 4. 简单说说一些实习经历和项目经历 5. 你觉得你从中最大的收获是什么 6. 对未来找工作有什么期望吗?平台、城市之类的 7. 能忍受出差和高强度工作吗 8.
阅读全文
摘要:redis提供了两种不同的持久化策略:RDB and AOF 1. RDB 1.1 什么是RDB RDB全称Redis DataBase,是在指定时间间隔内将内存的数据集快照写到磁盘,也就是snapshot快照,它恢复时是将快照文件直接读到内存里 1.2 备份是如何进行的 redis 会单独创建(f
阅读全文
摘要:面试时间:2022.03.22 1. 自我介绍 2. TCP四次挥手 3. time_wait状态 4. TCP如何保证可靠连接 5. 拥塞控制详解 6. 堆栈等内存管理 7. 虚拟内存 8. MMU 9. 数据库ACID 10. 详细解释一致性 11. redis和mysql有什么区别 12. s
阅读全文
摘要:1. CAP需求 在分布式环境下,设计和部署系统时主要考虑下面三个核心系统需求: 一致性(Consistency):所有节点在同一时间具有相同的数据 可用性(Availability):保证对于每个请求的成功或失败都有响应 分区容错性(Partition Tolerance):系统中信息的丢失或者失
阅读全文
摘要:面试时间:2022.3.22 1. 介绍项目 2. redis做什么的 3. ceph架构了解多少 4. 数据备份的时候,为什么要是奇数个 5. cap理论 6. 怎么解决数据库和缓存一致性 7. 从哪里开始对分布式算法有认识的 8. 实习时间 9. 算法:顺时针螺旋遍历矩阵,秒 10. 反问:ja
阅读全文
摘要:1. 查看当前系统的最大句柄数 ulimit -n 2. lsof lsof命令查看有关文件句柄的详细信息,如当前系统打开的文件数量,哪些进程在使用这些文件句柄等等 查看进程PID打开的文件句柄详细信息: lsof -p <pid> 查看当前进程打开了多少句柄数: lsof -n|awk '{pri
阅读全文
摘要:1. GMP模型 G:goroutine M:thread线程 P:processor处理器 在go中,线程是运行goroutine的实体,调度器的功能是把可运行的goroutine分配到工作线程上。 全局队列:存放等待运行的G P的本地队列:和全局队列类似,存放的也是等待运行的G,但是数量有限,不
阅读全文
摘要:1. 什么是sqlc? google sqlc doc可以看到sqlc官网对于自己的定位,其主要作用就是从SQL生成可直接调用的go接口 我们使用sqlc可以简单分为以下三个步骤: 写SQL run sqlc生成我们所需要的go查询接口 使用这些接口与数据库交互 sqlc doc:https://d
阅读全文
摘要:1. 复制状态机 复制状态机,就是说每一台服务器上维持着一份持久化Log,然后 通过一致性协议算法,保证每一个实例中的Log保持一致,并且顺序存放,这样客户端就可以在每一个实例中读取到相同的数据。 如上图所示,有一个Consensus Module就是一致性协议模块,它可以是Paxos算法的实现或者
阅读全文
摘要:1. redis分布式锁原理 redis实现分布式锁其实就是对key进行操作 加锁:给对应的lockkey赋值,就进行了加锁操作,其他进程发现该lockkey已经值了有值了,就说明锁已经被别人获取 解锁:获取到锁的进程删除这个lockkey 锁超时:避免客户端宕机导致无法正常释放锁 1.1 加锁 加
阅读全文
摘要:1. hostname hostname 没有选项,显示主机名字 hostname –d 显示机器所属域名 iwhostname –f 显示完整的主机名和域名 hostname –i 显示当前机器的ip地址 2. ping ping 将数据包发向用户指定地址。当包被接收,目标机器发送返回数据包。pi
阅读全文
摘要:1. linux有哪些进程 linux下的主要进程状态有: R(TASK_RUNNING) -- 可执行状态 S(TASK_INTERRUPTIBLE) -- 可中断的睡眠状态 D(TASK_UNINTERRUPTIBLE) -- 不可中断的睡眠状态 T(TASK_STOPPED or TASK_T
阅读全文
摘要:1. 上下文context 上下文context.Context在golang中用于设置截止日期、同步信号、传递请求相关值的结构体。 上下文概念和goroutine有着较为密切的关系,是go中独有的设计。 在goroutine构成的树形结构中对信号进行同步以减少计算资源的浪费是context最大的作
阅读全文
摘要:面试时间:2022.03.21 1. 自我介绍 2. 云端存储项目介绍 3. 项目里redis做什么的?仅仅是缓存吗? -- 分布式锁 4. redis分布式锁怎么实现的 5. 除了redis还知道什么分布式锁? -- mysql和etcd 6. etcd的实现了解吗?简单说说 -- 底层不太清楚,
阅读全文
摘要:1. golang垃圾回收 golang的垃圾回收算法是三色标记法,其中三个颜色分别为:灰色、黑色、白色,其对应了垃圾回收过程中变量的三种状态: 灰色:对象还在标记队列中等待 黑色:对象已经被标记,该对象不会在本次GC中被回收 白色:对象为被标记,该对象会在本地GC中被回收 1.1 垃圾回收流程 假
阅读全文
摘要:尝试基于grpc和docker pubsub包,提供一个跨网络的发布和订阅系统 安装依赖: go get github.com/moby/moby/pkg/pubsub 首先通过proto定义一个发布和订阅服务接口: syntax="proto3"; package pb; option go_pa
阅读全文
摘要:1. 什么是gRPC gRPC是谷歌公司基于protobuf开发的跨语言的开源RPC框架,基于http/2协议设计,对移动设备更加友好。 go语言gRPC技术栈最底层为TCP或者Unix套接字协议,在此之上是http/2协议的实现,然后在http/2协议之上有构建了针对go语言的gRPC核心库。应用
阅读全文
摘要:1. RPC简介 RPC是远程系统调用的缩写,通俗地讲就是调用远处的一个函数,可能是一个文件内的不同函数,也可能是一个机器上另一个进程的函数,也可能是远处机器上的函数。 RPC是分布式系统中不同节点之间的通信方式,Go的标准库也实现了一个简单的RPC。 2. RPC简单使用 首先构造一个HelloS
阅读全文
摘要:1. golang map golang原生map在并发场景下,同时读写是线程不安全的,如论key是否一样,我们可以编写一个测试用例来看看同时读写不同的key会发生什么情况: func testForMap() { m := make(map[int]int) go func() { for { m
阅读全文
摘要:1. 哈希表的结构设计 redis的哈希表结构如下: typedef struct dictht{ // 哈希表数组 dictEntry **table; // 哈希表大小 unsigned long size; // 哈希表大小掩码,用于计算索引 unsigned long sizemask; /
阅读全文
摘要:面试时间:2022.02.23 1. 部门介绍(一开始网络不好没听清) 2. 自我介绍 3. 项目 4. c++用的多吗?平时什么场景会用c++? 5. 解释一下TCP断开连接时的TIME_WAIT的作用 6. 用过http吗?解释一下http options(这个真没用过...) 7. 知道智能指
阅读全文
摘要:面试时间:2022.03.02 1. 自我介绍 2. 项目(主要是算法方面) 3. 边缘计算了解多少 4. 用的什么linux发行版 5. linux怎么查看磁盘和cpu使用情况 6. 写程序的时候怎么查看cpu使用情况 7. 搭建过k8s集群吗?哪个版本? 8. k8s架构 9. pod内容器是怎
阅读全文
摘要:面试时间:2022.02.24 1. 自我介绍 2. 项目(论文和专利) 3. STL map底层 4. c++ oop特性 5. 详细说说继承和多态是怎么实现的? 6. c++ struct和class的区别 7. c++ 内存管理 8. c++ 多线程编程 9. c++ 怎么实现线程同步 10.
阅读全文
摘要:面试时间: 2022.02.21 1. 自我介绍 2. 如何理解docker和k8s 3. 我写一个程序,读取文件内容做修改,其中的流程是怎么样的(内存管理、调度、IO) 4. 说说对http https tcp udp的认识,应用场景 5. 我要存一个key-value数据类型,查询的时候使用模糊
阅读全文
摘要:面试时间:2022.03.10 1. 自我介绍 2. 项目的整体架构 3. 为什么考虑ceph做存储 4. 如果文件上传ceph不完整,有什么解决办法 5. 项目里的redis是做什么用的?怎么设计的redis的key 6. redis分布式锁怎么实现的 7. redis面对大量key过期,在red
阅读全文
摘要:面试时间:2022.03.18 1. 自我介绍 2. 简单说了说云端存储那个项目架构 3. 学习golang多长时间了? 4. 为什么考虑从c++转golang? 5. golang中的变量类型 6. new和make 7. 怎么实现线程同步?如何让所有协程一起退出? 8. defer了解多少?应用
阅读全文
摘要:1. 制作镜像 首先在项目目录下编写Dockerfile # Build stage FROM golang:1.17-alpine3.13 AS builder WORKDIR /app COPY . . RUN go build -o main main.go # Run stage FROM
阅读全文
摘要:前段时间在部署一个项目时,需要将本机mac上的golang应用部署到服务器上,但是又不想直接传到公有仓库上,需要一个私人仓库地址便于管理这些项目镜像 下面记录一次私有仓库创建到镜像push和pull的过程。 1. docker官方提供了一个工具docker-registry,我们可以借助这个工具构建
阅读全文
摘要:1. 切片的定义 切片的结构定义在 reflect.SliceHeader type SliceHeader struct{ Data uintptr Len int Cap int } 看看切片的几种定义方式: var ( a []int // nil切片,和nil相等,一般用来表示一个不存在的切
阅读全文
摘要:1. cron表达式的基本格式 cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,cron有如下两种语法格式: second minute hour dayofmonth month dayofweek year second minute hour day
阅读全文
摘要:1. 架构分析 1.1 传统crontab痛点 机器故障,任务停止电镀,甚至cron配置都找不回来 任务数量多,单机硬件资源有限,需要人工迁移到其他机器 需要人工去机器上配置cron,任务执行状态不方便查看 1.2 分布式架构的核心要素 调度器:需要高可用,确保不会因为单点故障停止调度 执行器:需要
阅读全文
摘要:go客户端实现mongoDB的增删改查 所有api的使用和说明都在官方文档: https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo#pkg-index 下面只记录一下项目中用到的简单的增删改查操作 可能用过mysql和redis客户端的不太习惯mo
阅读全文
摘要:1. 介绍 泛型可能是1.18版本最大的更新了,毕竟官方文档都写在了第一条 泛型的基本介绍就不写了,c#中有最优雅的泛型实现,可以去简单看看 全面的泛型概述可见泛型提案 https://go.googlesource.com/proposal/+/refs/heads/master/design/4
阅读全文
摘要:1. mongoDB功能介绍 1.1 核心特性 文档数据库,基于二进制json存储文档 高性能、高可用、直接加机器就可以解决扩展性问题 支持丰富的CRUD操作,例如聚合统计、全文检索、坐标检索 1.2 文档数据库 存放的是json格式的数据,任何字段都不需要提前定义 { name:"pp", age
阅读全文
摘要:1. 分布式锁的特点 锁是在执行多线程时用于强行限制资源访问的同步机制,在单机系统上,单机锁就可以很好地实现临界资源的共享。而在分布式系统场景下,实例会运行在多台机器上,为了使多进程对共享资源的读写同步,保证数据的最终一致性,引入了分布式锁。 分布式锁应该具备以下特点: 在分布式环境下,一个资源在同
阅读全文
摘要:golang-etcd客户端操作 关于golang-etcd的所有api介绍和使用demo,可以参见 https://pkg.go.dev/go.etcd.io/etcd/client/v3#pkg-overview 1. 获取客户端连接 func main() { config := client
阅读全文
摘要:一致性哈希是什么,使用场景,解决了什么问题? 转载:https://mp.weixin.qq.com/s/hJHMlbQpANwMjx9BetwkUg 1. 如何分配请求 大多数网站背后肯定不是只有一台服务器提供服务,因为单机的并发量和数据量都是有限的,所以都会用多台服务器构成集群来对外提供服务。
阅读全文
摘要:1. 首先应该下载etcd的linux版本,并将压缩包传输到阿里云服务器上 https://github.com/etcd-io/etcd/releases 2. 简单说一下sftp的从本机传输到远程服务器的指令 lcd /Users/xxx/Downloads put etcd-v3.5.2-li
阅读全文