go面试题收集

数据结构 数据类型总结 Go语言将数据类型分为四类:基础类型、复合类型、引用类型和接口类型。 基础数据类型包括: 基础类型: 布尔型、整型、浮点型、复数型、字符型、字符串型、错误类型。 复合数据类型包括: 指针、数组、切片、字典、通道、结构体、接口。 什么是反射 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。 在go中,编译时不知道类型的情况下,可更新变量、运行时查看值、调用方法以及直接对他们的布局进行操作的机制,称为反射。 场景:无法透视一个未知类型的时候,这时候就需要有反射来帮忙你处理,反射使用TypeOf和ValueOf函数从接口中获取目标对象的信息,轻松完成目的。 rune与byte的区别 byte是uint8、rune为uint32,一个仅限于ascii码的值,一个支持更多的值。rune比byte能表达更多的数。 golang默认使用utf8编码,一个中文占用3字节,一个utf8数字占用1字节,utf8字母占用1字节 切片 切片的扩容:切片扩容,一般方式:上一次容量的2倍,超过1024字节,每次扩容上一次的1/4 切片的截取:在截取时,capacity 不能超过原slice的 capacity new() 与 make() 的区别 new(T) 和 make(T, args) 是Go语言内建函数,用来分配内存,但适用的类型不用。 new函数用于分配指定类型的零值对象,并返回指向其内存地址的指针。例如,new(int)将分配一个类型为int且值为0的对象,并返回一个指向该地址的指针。可以使用*运算符访问指针指向的值。 make函数用于创建和初始化内置类型(如map、slice、channel)的数据结构,并返回其指针。它比new函数更加复杂很多,因为它需要知道类型的大小和结构,以便为其分配内存并初始化其字段或元素。例如,make(map[string]int)将创建一个空的map。它有一个string类型的键和一个int类型的值。 nil切片和空切片指向的地址一样吗? nil切片和空切片指向的地址==不一样==。nil空切片引用数组指针地址为0(无指向任何实际地址) 空切片的引用数组指针地址是有的,且固定为一个值 什么是Receiver Golang的Receiver是绑定function到特定type成为其method的一个参数,即一个function加了receiver就成为一个type的method。 构体方法跟结构体指针方法的区别(Receiver和指针Receiver的区别) T 的方法集仅拥有 T Receiver。 *T 方法集则包含全部方法 (Receiver + *Receiver)。 sync.once 是 Golang package 中使方法只执行一次的对象实现,作用与 init 函数类似。但也有所不同 init 函数是在文件包首次被加载的时候执行,且只执行一次 sync.Onc 是在代码运行中需要的时候执行,且只执行一次 当一个函数不希望程序在一开始的时候就被执行的时候,我们可以使用 sync.Once 实现:sync.Once 的源码实现非常简单,采用的是双重检测锁机制 (Double-checked Locking),是并发场景下懒汉式单例模式的一种实现方式 首先判断 done 是否等于 0,等于 0 则表示回调函数还未被执行 加锁,确保并发安全 在执行函数前,二次确认 done 是否等于 0,等于 0 则执行 将 done 置 1,同时释放锁 疑问一: 为什么不使用乐观锁 CAS 简单的来说就是 f() 的执行结果最终可能是不成功的,所以你会看到现在采用的是双重检测锁机制来实现,同时需要等 f() 执行完成才修改 done 值 疑问二: 为什么读取 done 值的方式没有统一 比较 done 是否等于 0,为什么有的地方用的是 atomic....

 ·  · 

kubernetes面试题收集

Kubernetes概念 Ingress和LoadBalancer的区别 Ingress通常用于将HTTP(S)流量路由到Kubernetes群集内部的服务,支持复杂路径路由和负载均衡算法 LB则是通过提供商提供一种外部流量引入到集群内的组件,通常为2 3层 Ingress本身是基于service的,引入流量时依赖 kube-proxy LB则是独立的组件,最小接入单元也是service,而通过2 3层的广播等功能可以提供多节点的引入 功能:Ingress是一个规范,LB则是一种实现 实现方式:ingress通过扩展Kubernetes API+controller, 而LB除此外还需要外部设备提供(软硬件,云组件) kubernetes之最小单元 Pod最小可调度单元,最小部署单元 容器:容器是最小的执行单元 Namespace:最小隔离单元 Service:最小接入单元 etcd用的什么算法,简单解释一下 raft算法 强一致性 同一时间只能有一个leader,所有的操作都在leader上。 Pod 的生命周期 Pod 状态始终处于一下几个状态之一: Pending: 部署 Pod 事务已被集群受理,但当前容器镜像还未下载完或现有资源无法满足 Pod 的资源需求 Running: 所有容器已被创建,并被部署到节点上 Successed: Pod 成功退出,并不会被重启 Failed: Pod 中有容器被终止 Unknown: 未知原因,如 kube-apiserver 无法与 Pod 进行通讯 Kubernetes有哪些不同类型的服务? cluster ip Node Port Load Balancer Extrenal Name 什么是ETCD? Etcd是用Go编程语言编写的,是一个分布式键值存储,用于协调分布式工作。因此,Etcd存储Kubernetes集群的配置数据,表示在任何给定时间点的集群状态。 什么是Ingress网络,它是如何工作的? Ingress网络是一组规则,充当Kubernetes集群的入口点。这允许入站连接,可以将其配置为通过可访问的URL,负载平衡流量或通过提供基于名称的虚拟主机从外部提供服务。因此,Ingress是一个API对象,通常通过HTTP管理集群中服务的外部访问,是暴露服务的最有效方式。 什么是Headless Service? Headless Service类似于“普通”服务,但没有群集IP。此服务使您可以直接访问pod,而无需通过代理访问它。 什么是集群联邦? 在联邦集群的帮助下,可以将多个Kubernetes集群作为单个集群进行管理。因此,您可以在数据中心/云中创建多个Kubernetes集群,并使用联邦来在一个位置控制/管理它们。 联合集群可以通过执行以下两项操作来实现此目的。请参考下图。 kube-proxy的作用 kube-proxy运行在所有节点上,它监听apiserver中service和endpoint的变化情况,创建路由规则以提供服务IP和负载均衡功能。简单理解此进程是Service的透明代理兼负载均衡器,其核心功能是将到某个Service的访问请求转发到后端的多个Pod实例上。 kube-proxy iptables的原理 Kubernetes从1....

 ·  · 

操作系统类面试题收集

Linux 基础 守护、僵⼫、孤⼉进程的概念 【答】 守护进程:运⾏在后台的⼀种特殊进程,独⽴于控制终端并周期性地执⾏某些任务。 僵⼫进程:⼀个进程 fork ⼦进程,⼦进程退出,⽽⽗进程没有 wait/waitpid⼦进程,那么⼦进程的进程描述符仍保存在系统中,这样的进程称为僵⼫进程。 孤⼉进程:⼀个⽗进程退出,⽽它的⼀个或多个⼦进程还在运⾏,这些⼦进程称为孤⼉进程。(孤⼉进程将由 init 进程收养并对它们完成状态收集⼯作) 进程间通讯方式有哪些? Pipe:无名管道,最基本的IPC,单向通信,仅在父/子进程之间,也就是将一个程序的输出直接交给另一个程序的输入。常见使用为 ps -ef|grep xxx FIFO [(First in, First out)] 或 有名管道(named pipe):与Pipe不同,FIFO可以让两个不相关的进程可以使用FIFO。单向。 Socket 和 Unix Domain Socket:socket和Unix套接字,双向。适用于网络通信,但也可以在本地使用。适用于不同的协议。 消息队列 Message Queue: SysV 消息队列、POSIX 消息队列。 Signal: 信号,是发送到正在运行的进程通知以触发其事件的特定行为,是IPC的一种有限形式。 Semaphore:信号量,通常用于IPC或同一进程内的线程间通信。他们之间使用队列进行消息传递、控制或内容的传递。(常见SysV 信号量、POSIX 信号量) Shared memory:(常见SysV 共享内存、POSIX 共享内存)。共享内存,是在进程(程序)之间传递数据的有效方式,目的是在其之间提供通信。 BASH和DOS控制台之间的主要区别在于3个方面: 答案: BASH命令区分大小写,而DOS命令则不区分; 在BASH下,/ character是目录分隔符,\ 作为转义字符。在DOS下,/ 用作命令参数分隔符,\ 是目录分隔符 DOS遵循命名文件中的约定,即8个字符的文件名后跟一个点,扩展名为3个字符。BASH没有遵循这样的惯例。 Linux 中进程有哪几种状态?在 ps 显示出来的信息中,分别用什么符号表示的? 答案: R runnable (on run queue) 运行 (正在运行或在运行队列中等待) S 中断 sleeping(休眠中, 受阻, 在等待某个条件的形成或接受到信号)...

 ·  · 

监控类面试题

Prometheus的四种数据类型 Counter(计数器类型) Counter类型的指标的工作方式和计数器一样,只增不减 Gauge(仪表盘类型) Gauge是可增可减的指标类,通常用于反应当前应用的状态。 Histogram 主要用于表示一段时间范围内对数据进行采样 Summary(摘要类型) Summary类型和Histogram类型相似,主要用于表示一段时间内数据采样结果 Prometheus 的局限 Prometheus 是基于 Metric 的监控,不适用于日志(Logs)、事件(Event)、调用链(Tracing)。 Prometheus 默认是 Pull 模型,合理规划你的网络,尽量不要转发。对于集群化和水平扩展,官方和社区都没有银弹,需要合理选择 Federate、Cortex、Thanos等方案。 监控系统一般情况下可用性大于一致性,容忍部分副本数据丢失,保证查询请求成功。这个后面说Thanos 去重的时候会提到。 Prometheus 不一定保证数据准确,这里的不准确一是指 rate、histogram_quantile 等函数会做统计和推断,产生一些反直觉的结果,这个后面会详细展开。二来查询范围过长要做降采样,势必会造成数据精度丢失,不过这是时序数据的特点,也是不同于日志系统的地方 采集组件 All IN One Prometheus 体系中 Exporter 都是独立的,每个组件各司其职,如机器资源用 Node-Exporter,Gpu 有Nvidia Exporter等等。但是 Exporter 越多,运维压力越大,尤其是对 Agent做资源控制、版本升级。我们尝试对一些Exporter进行组合,方案有二: 通过主进程拉起N个 Exporter 进程,仍然可以跟着社区版本做更新、bug fix。 用Telegraf来支持各种类型的 Input,N 合 1。另外,Node-Exporter 不支持进程监控,可以加一个Process-Exporter,也可以用上边提到的Telegraf,使用 procstat 的 input来采集进程指标。 合理选择黄金指标 采集的指标有很多,我们应该关注哪些?Google 在 “Sre Handbook” 中提出了“四个黄金信号”:延迟、流量、错误数、饱和度。实际操作中可以使用 Use 或 Red 方法作为指导,Use 用于资源,Red 用于服务。 Use 方法:Utilization、Saturation、Errors。如 Cadvisor 数据 Red 方法:Rate、Errors、Duration。如 Apiserver 性能指标 Prometheus 采集中常见的服务分三种:...

 ·  · 

网络基础面试题收集

域名相关 什么是DNS劫持 DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的。 通俗来讲:DNS劫持就是指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为。范例,网通、电信、铁通的某些用户有时候会发现自己打算访问一个地址,却被转向了各种推送广告等网站,这就是DNS劫持。 DNS劫持症状:在某些地区的用户在成功连接宽带后,首次打开任何页面都指向ISP提供的“电信互联星空”、“网通黄页广告”等内容页面。还有就是曾经出现过用户访问Google域名的时候出现了百度的网站。这些都属于DNS劫持。 解决:对于DNS劫持,可以采用使用国外免费公用的DNS服务器解决。例如OpenDNS(208.67.222.222)或GoogleDNS(8.8.8.8)。 什么是DNS污染 DNS污染是指在DNS服务器中修改DNS解析结果的过程,以便将用户重定向到恶意网站或欺骗性网站,而不是所期望的目标网站。 攻击者可以通过多种方式进行DNS污染攻击。最常见的手段是在用户的网络中添加一个恶意DNS服务器,或者在受感染的计算机上运行一个恶意DNS服务器。当用户试图连接到互联网上的某个网站时,计算机将查询DNS服务器以查找目标网站的IP地址。如果攻击者控制的恶意DNS服务器已将相应的IP地址修改为攻击者的网站,则用户将被重定向到恶意网站或欺骗性网站。 DNS污染发生在用户请求的第一步上,直接从协议上对用户的DNS请求进行干扰。 DNS污染症状:目前一些被禁止访问的网站很多就是通过DNS污染来实现的,例如YouTube、Facebook等网站。 解决: 可靠的DNS服务器,但这种方式效果不佳 手动修改Hosts文件 使用VPN或域名远程解析 加密通信:VPN可以加密整个通信过程,这意味着攻击者无法窃取UDP数据包中的任何信息,包括DNS查询请求和响应。这样可以避免DNS查询被篡改的风险。 虚拟IP地址:VPN会给每个用户分配其所连接的虚拟IP地址,使用户的真实IP地址不会暴露在公共互联网中。这样,DNS服务器只能看到VPN服务器的IP地址,而无法识别用户的IP地址。这意味着攻击者无法跟踪用户的访问历史,从而减少遭受DNS污染攻击的风险。 总结: DNS污染,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。范例,访问Youtube、Facebook之类网站等出现的状况。 什么是域名被墙 这种情况一般出现在解析为国外地址的域名上,假如域名下的网站非法信息多,敏感,又不整改,会直接被G.F.W墙掉,就是通常所说的被封锁、被屏蔽、被和谐,结果就是访问域名是打不开的,但是解析是正常的。此时域名在国内是无法使用的,国外可以访问和使用。 主要有以下几种情况: ip 被墙 解决:换 ip 。 域名被 url 重置(访问时出现ERR_CONNECTION_RESET 或 “连接重置” 换域名 做301跳转,(有专门服务商),域名通过解析到国内301服务商,重定向到真是国外IP,以减少流量和权重的丢失。 上 https或域名备案,智能解析分国内,国外 。 可以使用HTTPS;一般来讲解析到国外的IP的域名,有敏感词会被重置,GFW可以进行敏感词检测(http为明文),使用https加密GFW无法检测数据包内容 ,(客户端与服务端默认会有公钥私钥,而GFW没有)。 域名被国家出口 dns 污染,解决:用国内 dns ,备案回国。 域名被省级 dns 污染,解决:能做到这个这里可能为内部或对应运营商被黑(只能进行dns清洗,一般大流量域名了) 什么是DNS清洗? DNS清洗是一项旨在阻止访问特定网站和域名的措施,在该措施中,Internet服务提供商(ISP)通过其服务器筛选特定网站的DNS查询,并将查询重定向到一个错误的IP地址(通常是一个不存在的地址),从而防止用户访问该网站。这种措施通常是由政府、公司或组织实施,旨在防止用户接触到不适当、危险或非法的内容。 网络攻击相关 什么是TCP的SYN攻击?如何预防? TCP SYN攻击是一种利用TCP协议三次握手机制的攻击。攻击者发送大量伪造的TCP SYN请求(数据包),然后在TCP三次握手建立连接的第二步时停止(使服务器不断地向攻击者发送SYN-ACK确认,但攻击者不回复ACK确认),从而导致服务器等待客户端的确认信号很长时间,最终占用服务器的资源而无法处理新的请求。 为了预防TCP SYN攻击,可以采取以下措施: 服务器操作系统的设置:可以设置TCP的连接数和时间等参数,限制每个IP地址的连接数,设置连接超时时间。 防火墙设置:可以设置防火墙规则,根据IP地址、端口等信息对连接进行过滤,控制IP地址的访问等。 加强网络监测:使用入侵检测系统(IDS)对流量进行实时监控,并对异常流量进行报警处理。 使用SYN Cookies:SYN cookies是一种可以防止SYN攻击的技术,它通过特殊的算法对TCP连接进行加密,并保存在服务器端,当客户端发送响应时,服务器端可以对连接进行识别和验证,从而防止SYN攻击。 增加硬件设备:可以增加具有流量分析和过滤功能的硬件设备来协助防御SYN攻击,这种设备可以通过分析流量实现精细化的流量分析和识别。 ddos攻击的类型 DDoS攻击(Distributed Denial of Service)是一种利用许多计算机和网络设备构成的“僵尸网络”对一个或多个目标服务器发起攻击,从而占用大量的网络资源,耗尽系统资源,导致服务拒绝的攻击方式。DDoS攻击的类型可以分为以下几种: 带宽攻击(Bandwidth-based Attack):利用大量的数据流或报文,通过消耗目标系统的网络带宽使其服务不能正常传输。 应用层攻击(Application-Layer Attack):利用正常流量模拟合法用户的请求,通过消耗服务器CPU和内存资源使其无法处理合法请求。 反射式攻击(Reflection Attack):使用伪造的IP地址向网络中的一个或多个服务器发起请求,这些服务器会响应请求,但响应信息将被发回目标服务器,从而形成了一次反射式攻击。 慢速攻击(Slowloris Attack):利用HTTP协议的设计漏洞,向目标服务器发送大量不完整请求,从而占用目标服务器处理请求的线程资源。 IoT攻击(IoT Attack):通过侵入大量的物联网设备,如路由器、摄像头、智能家居等,利用这些设备来发起攻击,构建大规模的“僵尸网络”。 DNS Amplification攻击:攻击者向域名服务器发送请求,利用伪造的IP地址和请求报文,让服务器向目标主机发送大量的DNS解析响应数据包,从而使目标系统在短时间内遭受网络拥塞。 NTP Amplification攻击:攻击者伪造IP地址,向其余互联网上安装有网络时间服务器(Network Time Protocol,NTP)软件的服务器发送请求,从而获取大量NTP响应包,最终将其转发到目标IP地址,从而占用目标系统的网络带宽。 SYN Flood攻击:攻击者向目标服务器发送大量的TCP SYN请求,但却不发送客户端的应答确认,造成服务器长时间处于等待状态,无法接受正常的TCP连接请求。 HTTP Flood攻击:攻击者利用HTTP叠加攻击、HTTP POST攻击等手段,向目标系统发送大量HTTP请求和数据包,造成目标系统资源的耗尽,从而导致服务不可用。 ICMP Flood攻击:攻击者向目标系统发送大量的ICMP数据包,造成目标系统CPU和内存资源的消耗,从而导致系统缓慢或崩溃。 什么是反射式攻击 反射式攻击(Reflection Attack)是一种利用网络协议的设计缺陷进行攻击的方式。攻击者通常会利用一些可以进行源地址欺骗或反射的协议,例如Domain Name System(DNS),Simple Network Management Protocol(SNMP),和Network Time Protocol(NTP)等。攻击者利用这些协议在网络中进行广播,构造一些请求消息,伪造源IP地址为目标IP地址,将请求消息发送给网络上的服务器,要求其向目标IP地址回送响应。这样攻击者就可以通过伪造的IP地址对目标系统进行攻击,占用它的网络带宽和资源,极大地降低了目标系统的可用性。...

 ·  ·