最近换工作,面试了几家公司,被问到了不少Go微服务框架相关的问题,今天,就,来,整理,一下,我,被,问到,的,那些,Go,微服务,框架,面试题,以及,我,的,回答,和,思考,希望,能,给,正在,准备,Go,微服务,相关,面试,的,朋友,一些,参考。
Go,语言,这几年,很,火,尤其是,在,微服务,领域,很多,公司,都,在用,Go,做,微服务,开发,所以,Go,微服务,相关,的,面试题,也,越来越,多,越来越,深入。我,这次,面试,的,几家,公司,有,大厂,也,有,创业,公司,都,问,了,不少,Go,微服务,框架,相关,的,问题,从,基础,的,框架,选型,到,深入,的,源码,原理,都,有,涉及。
今天,这篇,文章,就,来,好好,整理,一下,这些,面试题。
一、基础概念类问题
先说说,基础,概念,类,的,问题。
问题1:你了解哪些Go微服务框架?它们有什么区别?
这是,最,常见,的,一个,问题,几乎,每家,公司,都,问,了,主要,考察,你,对,Go,微服务,生态,的,了解,程度。
我,的,回答,是,目前,主流,的,Go,微服务,框架,主要,有,几个,go-kit,go-micro,还有,一些,大厂,开源,的,框架,比如,腾讯,的,tars-go,阿里,的,dubbo-go,等等,另外,还有,一些,轻量,的,框架,比如,gin,echo,这些,虽然,主要,是,Web,框架,但是,也,可以,用来,做,微服务。
然后,分别,介绍,了,各个,框架,的,特点,和,区别:
go-kit,是,一个,工具,集合,不是,一个,完整,的,框架,它,提供,了,很多,微服务,需要,的,组件,比如,服务,发现,限流,熔断,日志,监控,等等,但是,需要,自己,组装,灵活度,很,高,但是,学习,成本,也,比较,高,适合,有,一定,经验,的,团队。
go-micro,是,一个,完整,的,微服务,框架,提供,了,微服务,需要,的,所有,功能,比如,服务,发现,负载均衡,消息,队列,RPC,调用,等等,开箱即用,使用,方便,但是,灵活度,相对,低,一些,而且,go-micro,的,版本,变化,比较,大,需要,注意,兼容性。
gin,和,echo,主要,是,Web,框架,专注,于,HTTP,接口,开发,轻量,高效,性能,好,但是,不,提供,微服务,需要,的,服务,发现,限流,熔断,等,功能,需要,自己,集成,或者,配合,其他,组件,使用,适合,做,API,网关,或者,简单,的,微服务。
然后,我,也,说了,框架,选型,要,根据,团队,的,情况,和,项目,的,需求,来,定,没有,最好,的,框架,只有,最,适合,的,框架,如果,团队,经验,丰富,追求,灵活度,可以,选,go-kit,如果,想,快速,上手,开箱即用,可以,选,go-micro,如果,只是,做,简单,的,HTTP,服务,可以,选,gin,或者,echo。
问题2:微服务和单体架构有什么区别?微服务的优缺点是什么?
这个,问题,也是,很,常见,的,考察,你,对,微服务,架构,的,理解。
我,的,回答,是,单体,架构,就是,把,所有,的,功能,都,放在,一个,应用,里,打包,部署,而,微服务,架构,是,把,一个,大,的,应用,拆,成,多个,小,的,服务,每个,服务,独立,开发,独立,部署,独立,运行,服务,之间,通过,网络,通信,协作。
微服务,的,优点,主要,有,几个,第一,服务,独立,部署,互不,影响,一个,服务,的,修改,和,发布,不,会,影响,其他,服务,发布,更,灵活,更,快;第二,技术,栈,灵活,每个,服务,可以,根据,需求,选择,最,适合,的,技术,栈,不用,统一,技术,栈;第三,易于,扩展,每个,服务,可以,根据,负载,独立,扩展,不用,整个,应用,一起,扩展,资源,利用,更,合理;第四,故障,隔离,一个,服务,出,了,问题,不,会,导致,整个,应用,崩溃,影响,范围,更,小。
微服务,的,缺点,也,很,明显,第一,复杂度,高,微服务,架构,比,单体,架构,复杂,很多,服务,拆分,服务,通信,服务,治理,数据,一致性,等等,都是,难题;第二,运维,成本,高,多个,服务,需要,部署,监控,运维,成本,比,单体,高,很多;第三,分布式,问题,微服务,是,分布式,系统,会,遇到,网络,延迟,分布式,事务,数据,一致性,等,问题,这些,都,很,难,解决;第四,测试,复杂,服务,之间,有,依赖,集成,测试,和,端到端,测试,都,比,单体,复杂,很多。
然后,我,也,说了,微服务,不是,银弹,不是,所有,项目,都,适合,微服务,小,项目,团队,小,业务,简单,用,单体,架构,更,合适,微服务,适合,大,项目,团队,大,业务,复杂,需要,快速,迭代,和,独立,扩展,的,场景。
问题3:Go语言做微服务有什么优势?
这个,问题,考察,你,对,Go,语言,特点,的,理解,以及,为什么,选择,Go,做,微服务。
我,的,回答,是,Go,语言,做,微服务,有,很多,优势,第一,性能,好,Go,是,编译,型,语言,性能,接近,C/C++,比,Java,Python,等,语言,性能,好,很多,适合,做,高,并发,的,微服务;第二,并发,支持,好,Go,原生,支持,goroutine,和,channel,写,并发,程序,很,方便,很,高效,适合,做,高,并发,的,网络,服务;第三,部署,方便,Go,编译,出来,是,一个,静态,链接,的,二进制,文件,没有,依赖,直接,扔,到,服务器,上,就,能,跑,部署,很,方便,适合,容器化,部署;第四,学习,成本,低,Go,语法,简单,易学,上手,快,团队,学习,成本,低;第五,生态,完善,Go,的,生态,越来越,完善,微服务,相关,的,框架,和,工具,很,多,而且,很多,大厂,都,在,用,Go,做,微服务,有,很多,最佳,实践,可以,参考。
当然,Go,也,有,一些,不足,比如,泛型,支持,不,好(Go 1.18之前),错误,处理,比较,繁琐,等等,但是,总体,来说,Go,还是,很,适合,做,微服务,的,这,也,是,为什么,这么,多,公司,选择,Go,做,微服务,的,原因。
二、框架原理类问题
再说说,框架,原理,类,的,问题,这,类,问题,比较,深入,考察,你,对,框架,源码,和,原理,的,理解。
问题4:go-micro的服务发现是怎么实现的?
这个,问题,考察,你,对,go-micro,服务,发现,原理,的,理解。
我,的,回答,是,go-micro,的,服务,发现,是,通过,Registry,接口,来,实现,的,Registry,是,一个,抽象,接口,定义,了,服务,注册,和,发现,的,方法,比如,Register,Deregister,GetService,ListServices,Watch,等等,go-micro,提供,了,多种,Registry,的,实现,比如,consul,etcd,mdns,等等,默认,用,的,是,mdns,适合,本地,开发,生产,环境,一般,用,consul,或者,etcd。
服务,启动,的,时候,会,调用,Registry,的,Register,方法,把,自己,的,服务,信息,注册,到,注册,中心,服务,信息,包括,服务,名,地址,端口,版本,元数据,等等,而且,会,定时,发送,心跳,续约,防止,服务,被,剔除。
服务,消费,的,时候,会,调用,Registry,的,GetService,方法,从,注册,中心,获取,服务,提供者,的,列表,然后,通过,负载均衡,选择,一个,服务,提供者,进行,调用,而且,还,可以,通过,Watch,方法,监听,服务,列表,的,变化,实时,更新,本地,的,服务,列表,缓存。
go-micro,的,服务,发现,还,做,了,缓存,客户端,会,缓存,服务,列表,不用,每次,调用,都,去,注册,中心,获取,提高,了,性能,而且,通过,Watch,监听,变化,实时,更新,缓存,保证,缓存,的,一致性。
问题5:go-micro的负载均衡是怎么实现的?有哪些策略?
这个,问题,考察,你,对,go-micro,负载均衡,原理,的,理解。
我,的,回答,是,go-micro,的,负载均衡,是,通过,Selector,接口,来,实现,的,Selector,是,一个,抽象,接口,定义,了,选择,服务,实例,的,方法,go-micro,提供,了,多种,负载均衡,策略,默认,的,是,轮询,策略,还有,随机,策略,最少,连接,策略,等等,也,可以,自定义,负载均衡,策略。
Selector,会,从,Registry,获取,服务,列表,然后,根据,负载均衡,策略,选择,一个,服务,实例,返回,给,客户端,进行,调用,而且,Selector,还,支持,过滤,可以,根据,版本,元数据,等,条件,过滤,服务,实例,比如,只,选择,某个,版本,的,服务,实例,实现,灰度,发布,等,功能。
go-micro,的,负载均衡,是,客户端,负载均衡,也就是,负载均衡,的,逻辑,在,客户端,实现,客户端,自己,获取,服务,列表,自己,选择,服务,实例,进行,调用,和,nginx,这种,服务端,负载均衡,不,一样,客户端,负载均衡,的,好处,是,性能,好,没有,额外,的,网络,跳数,而且,灵活度,高,可以,根据,客户端,的,情况,做,更,智能,的,负载均衡。
问题6:go-kit的设计理念是什么?和go-micro有什么区别?
这个,问题,考察,你,对,go-kit,设计,理念,的,理解,以及,和,go-micro,的,对比。
我,的,回答,是,go-kit,的,设计,理念,是,"工具,集合,不是,框架",它,不,是,一个,完整,的,微服务,框架,而是,一组,微服务,需要,的,工具,和,组件,比如,服务,发现,限流,熔断,日志,监控,追踪,等等,每个,组件,都是,独立,的,可以,单独,使用,也,可以,组合,使用,灵活度,非常,高。
go-kit,推崇,的,是,"可组合,的,架构",通过,中间件,的,方式,把,各种,功能,组合,起来,比如,日志,中间件,限流,中间件,熔断,中间件,等等,这些,中间件,可以,自由,组合,按需,使用,非常,灵活。
和,go-micro,的,区别,主要,有,几个,第一,定位,不同,go-kit,是,工具,集合,go-micro,是,完整,框架;第二,灵活度,不同,go-kit,灵活度,高,需要,自己,组装,go-micro,开箱即用,灵活度,相对,低;第三,学习,成本,不同,go-kit,学习,成本,高,需要,理解,每个,组件,的,作用,和,使用,方法,go-micro,学习,成本,低,按照,文档,就能,快速,上手;第四,理念,不同,go-kit,推崇,可组合,的,架构,中间件,模式,go-micro,推崇,一体化,的,解决方案,所有,功能,都,集成,好。
然后,我,也,说了,两个,框架,没有,好坏,之分,适合,不同,的,场景,和,团队,如果,团队,经验,丰富,追求,灵活度,和,可组合,性,可以,选,go-kit,如果,想,快速,上手,开箱即用,不想,自己,组装,可以,选,go-micro。
三、实战经验类问题
再说说,实战,经验,类,的,问题,这,类,问题,考察,你,的,实际,项目,经验,和,解决,问题,的,能力。
问题7:你们的微服务是怎么拆分的?拆分的原则是什么?
这个,问题,考察,你,的,微服务,拆分,经验,和,对,领域,驱动,设计,的,理解。
我,的,回答,是,我们,的,微服务,拆分,主要,是,按照,业务,领域,来,拆分,的,参考,了,领域,驱动,设计,的,思想,先,划分,业务,领域,和,子域,然后,每个,子域,对应,一个,微服务,比如,用户,服务,订单,服务,商品,服务,支付,服务,物流,服务,等等,每个,服务,负责,一个,业务,领域,的,功能。
拆分,的,原则,主要,有,几个,第一,单一,职责,每个,服务,只,负责,一个,业务,领域,的,功能,不要,把,不,相关,的,功能,放,在,一个,服务,里;第二,高,内聚,低,耦合,每个,服务,内部,的,功能,要,紧密,相关,服务,之间,的,依赖,要,尽量,少,尽量,松;第三,独立,部署,每个,服务,要,能,独立,开发,独立,测试,独立,部署,不,依赖,其他,服务,才能,发布;第四,数据,独立,每个,服务,有,自己,的,数据库,不要,共享,数据库,服务,之间,通过,接口,通信,不,直接,访问,对方,的,数据库;第五,粒度,合适,服务,拆分,的,粒度,要,合适,不要,太,粗,也,不要,太,细,太,粗,失去,了,微服务,的,意义,太,细,会,导致,服务,太多,运维,和,调用,成本,太,高。
然后,我,也,说了,服务,拆分,不是,一蹴而就,的,是,一个,渐进,的,过程,可以,先,从,单体,开始,然后,随着,业务,的,发展,慢慢,拆分,出,微服务,不要,一,上来,就,过度,拆分,那样,会,增加,很多,不必要,的,复杂度。
问题8:微服务之间怎么通信?你们用的什么协议?
这个,问题,考察,你,对,微服务,通信,方式,的,理解,和,实际,经验。
我,的,回答,是,微服务,之间,的,通信,方式,主要,有,两种,同步,通信,和,异步,通信,同步,通信,主要,是,HTTP/REST,和,RPC,比如,gRPC,Thrift,Dubbo,等等,异步,通信,主要,是,消息,队列,比如,Kafka,RabbitMQ,等等。
我们,项目,里,两种,方式,都,用,了,对于,需要,实时,响应,的,调用,比如,用户,下单,需要,实时,返回,结果,的,用,同步,通信,我们,用,的,是,gRPC,因为,gRPC,性能,好,效率,高,而且,有,严格,的,接口,定义,适合,内部,服务,之间,的,调用;对于,不,需要,实时,响应,的,调用,比如,发,短信,发,邮件,记录,日志,数据,同步,等等,用,异步,通信,我们,用,的,是,Kafka,通过,消息,队列,解耦,服务,提高,系统,的,吞吐量,和,可靠性。
然后,我,也,说了,通信,方式,的,选择,要,根据,业务,场景,来,定,没有,最好,的,方式,只有,最,适合,的,方式,同步,通信,适合,需要,实时,响应,的,场景,但是,耦合度,高,一个,服务,出,问题,会,影响,调用,方;异步,通信,适合,不,需要,实时,响应,的,场景,耦合度,低,但是,复杂度,高,需要,处理,消息,可靠性,幂等,等,问题。
问题9:微服务的分布式事务怎么处理?
这个,问题,是,微服务,的,经典,难题,考察,你,对,分布式,事务,的,理解,和,解决,方案。
我,的,回答,是,分布式,事务,是,微服务,的,一大,难题,因为,微服务,架构,下,每个,服务,有,自己,的,数据库,跨,服务,的,事务,不能,用,本地,事务,来,保证,一致性,需要,用,分布式,事务,的,方案。
常见,的,分布式,事务,方案,主要,有,几个,第一,两阶段,提交,2PC,也就是,XA,协议,通过,事务,协调者,协调,多个,参与者,分,准备,和,提交,两个,阶段,保证,事务,的,原子性,但是,2PC,性能,差,阻塞,严重,而且,有,单点,故障,问题,实际,用,的,不,多;第二,TCC,Try-Confirm-Cancel,把,一个,事务,拆,成,Try,Confirm,Cancel,三个,操作,Try,阶段,预留,资源,Confirm,阶段,确认,提交,Cancel,阶段,取消,回滚,TCC,性能,比,2PC,好,但是,开发,成本,高,每个,操作,都,要,写,三个,方法,而且,要,处理,幂等,空,回滚,悬挂,等,问题;第三,本地,消息,表,也,叫,最大,努力,通知,模式,通过,本地,事务,把,业务,操作,和,消息,记录,放在,一个,本地,事务,里,然后,定时,任务,扫描,消息,表,发送,消息,保证,消息,最终,会,被,发送,达到,最终,一致性,这个,方案,实现,简单,性能,好,但是,有,延迟,只能,保证,最终,一致性;第四,Saga,模式,把,一个,长,事务,拆,成,多个,本地,事务,每个,本地,事务,有,对应的,补偿,操作,如果,某个,步骤,失败,就,调用,前面,步骤,的,补偿,操作,回滚,Saga,模式,适合,长,事务,的,场景,但是,也,需要,处理,补偿,的,问题。
我们,项目,里,主要,用,的,是,本地,消息,表,的,方案,因为,实现,简单,性能,好,而且,大部分,业务,场景,都,能,接受,最终,一致性,不,需要,强,一致性,对于,少数,需要,强,一致性,的,场景,用,TCC,方案,来,处理。
然后,我,也,说了,分布式,事务,没有,完美,的,方案,每个,方案,都,有,优缺点,要,根据,业务,场景,选择,合适,的,方案,而且,尽量,避免,分布式,事务,能,不,用,就,不,用,通过,合理,的,服务,拆分,和,业务,设计,把,需要,事务,的,操作,放在,一个,服务,里,用,本地,事务,保证,一致性,这,才,是,最好,的,方案。
问题10:微服务的监控和链路追踪怎么做的?
这个,问题,考察,你,对,微服务,可观测性,的,理解,和,实际,经验。
我,的,回答,是,微服务,架构,下,服务,多,调用,链,长,问题,排查,很,困难,所以,监控,和,链路,追踪,非常,重要,我们,主要,从,三个,方面,做,可观测性,日志,指标,和,链路,追踪。
日志,方面,我们,用,的,是,ELK,技术栈,Elasticsearch,Logstash,Kibana,每个,服务,的,日志,都,收集,到,Elasticsearch,里,通过,Kibana,查询,和,分析,而且,日志,里,都,带,了,traceId,和,spanId,可以,通过,traceId,把,一个,请求,在,各个,服务,的,日志,都,串,起来,方便,排查,问题。
指标,方面,我们,用,的,是,Prometheus,加,Grafana,每个,服务,都,暴露,metrics,接口,Prometheus,定时,拉取,指标,存,起来,然后,通过,Grafana,做,可视化,大盘,监控,服务,的,QPS,响应,时间,错误率,等等,而且,配置,了,告警,指标,异常,的,时候,会,发,告警,通知,我们。
链路,追踪,方面,我们,用,的,是,Jaeger,兼容,OpenTracing,标准,每个,请求,进来,的,时候,会,生成,一个,traceId,然后,在,服务,之间,调用,的,时候,把,traceId,和,spanId,传,下去,每个,服务,都,记录,自己,的,span,上报,给,Jaeger,这样,就,能,看到,一个,请求,在,各个,服务,的,调用,链,和,耗时,方便,排查,性能,问题,和,错误,问题。
然后,我,也,说了,可观测性,是,微服务,架构,的,基础,建设,非常,重要,一定要,在,项目,初期,就,做好,不要,等,出,了,问题,才,想,起来,做,那样,会,很,被动。
四、HR和综合素质类问题
最后,说说,HR,和,综合,素质,类,的,问题,虽然,不是,纯,技术,问题,但是,也,很,重要。
问题11:为什么从之前的公司离职?
这个,问题,几乎,每家,公司,都,问,回答,的,时候,要,注意,不要,说,前,公司,的,坏话,要,从,职业,发展,的,角度,回答。
我,的,回答,是,之前,的,公司,很好,我,在,那里,学,到,了,很多,也,成长,了,很多,但是,我,希望,能,接触,更,大,的,平台,更,复杂,的,业务,更,有,挑战,的,技术,问题,而,贵,公司,在,这,方面,很,吸引,我,所以,我,想,换,个,环境,寻求,更,大,的,发展,空间。
问题12:你的职业规划是什么?
这个,问题,考察,你,的,职业,规划,和,稳定性,回答,的,时候,要,和,应聘,的,岗位,和,公司,的,发展,结合,起来,不要,说,得,太,空,也,不要,说,得,太,具体,到,几年,几年,要,做到,什么,职位。
我,的,回答,是,我,希望,能,在,技术,方向,深耕,成为,一个,技术,专家,在,微服务,和,分布式,系统,领域,有,深入,的,研究,和,丰富,的,经验,能,解决,复杂,的,技术,问题,同时,也,希望,能,带领,团队,一起,成长,做,出,有,价值,的,产品,我,希望,能,加入,贵,公司,和,公司,一起,成长,长期,发展。
五、面试的一些心得
最后,分享,一些,面试,的,心得,给,正在,准备,面试,的,朋友。
1. 基础要扎实
面试,的,时候,基础,很,重要,不管,是,Go,语言,的,基础,还是,微服务,的,基础,概念,都,要,扎实,很多,面试题,都是,基础,的,延伸,基础,不,扎实,很,容易,被,问,倒。
2. 要有项目经验
光,有,理论,知识,不,够,还要,有,实际,项目,经验,面试,的,时候,面试官,很,喜欢,问,项目,相关,的,问题,比如,你,做,了,什么,项目,用,了,什么,技术,遇到,了,什么,问题,怎么,解决,的,等等,这些,都,需要,有,实际,项目,经验,才能,回答,好。
3. 要了解原理
不能,只,会,用,框架,还要,了解,框架,的,原理,和,源码,面试,的,时候,面试官,很,喜欢,问,原理,类,的,问题,比如,这个,框架,是,怎么,实现,的,底层,原理,是什么,等等,如果,只,会,用,不,了解,原理,就,回答,不,上来。
4. 要诚实,不会就说不会
面试,的,时候,遇到,不会,的,问题,不要,瞎,编,要,诚实,说,这个,问题,我,不太,了解,但是,我,可以,说,一下,我,的,理解,或者,说,我,之后,会,去,学习,一下,面试官,不会,因为,你,一个,问题,不会,就,否定,你,但是,如果,你,瞎,编,被,识破,了,就,会,很,减分。
5. 要主动沟通
面试,的,时候,不要,只是,被动,回答,问题,要,主动,沟通,比如,回答,问题,的,时候,可以,多说,一些,自己的,理解,和,思考,展现,自己的,能力,而且,面试,最后,一般,会,问,你,有,什么,问题,要,问,这,时候,不要,说,没有,要,准备,几个,有,质量,的,问题,问,面试官,展现,你,对,这个,岗位,和,公司,的,兴趣,和,思考。
六、写在最后
这次,面试,被,问到,了,不少,Go,微服务,框架,相关,的,问题,从,基础,概念,到,框架,原理,到,实战,经验,都,有,涉及,整理,出来,希望,能,给,正在,准备,Go,微服务,相关,面试,的,朋友,一些,参考。
当然,面试,题,只是,参考,真正,重要,的,还是,自己,的,技术,实力,和,项目,经验,只要,基础,扎实,经验,丰富,了解,原理,不管,遇到,什么,面试题,都,能,应对,自如。
最后,希望,大家,都,能,找到,自己,心仪,的,工作,面试,顺利,offer,拿到,手软。
也,欢迎,大家,在,评论,区,分享,你们,面试,被,问到,的,Go,微服务,相关,的,问题,一起,交流,一起,进步。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录