总结
三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。
- 第一个是算法
关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。
而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本
《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题
《算法的乐趣》共有23个章节:
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
Apoll简介
=======
要去了解一个玩意,就要先会去使用它。它的使用基本上很简单。虽然使用简单方便,但是它的设计还是挺复杂的,下面我们看一个它官网提供的架构图,是不是挺复杂的。通过上述架构图我们可以看到ConfigService、AdminService、Client、Portal、 Meta Server、Eureka这几个模块,主要的还是前面四个模块Meta Server、Eureka这两个模块只是Apollo本身内部所需要的辅助模块,我们暂时可以不需要关注它。
ConfigService
-
提供配置获取接口
-
提供配置推送接口
-
服务于Apollo客户端
AdminService
-
提供配置管理接口
-
提供配置修改发布接口
-
服务于管理界面Portal
Client
-
为应用获取配置,支持实时更新
-
通过MetaServer获取ConfigService的服务列表\
-
使用客户端软负载SLB方式调用ConfigService
Portal
-
配置管理界面
-
通过MetaServer获取AdminService的服务列表
-
使用客户端软负载SLB方式调用AdminService
Apoll更新配置
介绍完了上面这些Apollo
组成的模块回到正题,配置中心如何做到实时更新并且到客户端如何感知配置被更新了?看这个问题之前我们先回顾下每到周末我们去人气比较旺的餐厅吃饭的时候流程是什么样的?
-
首先肯定是现场取号,或者手机端取号。
-
然后就是排队刷手机等着被叫号。中途你还会主动问一问还要等多久,服务员会告诉你等着吧,你前面还有几桌。上面这个吃饭的例子怎么知道到号了列?两种方式,一种使我们我每隔一段时间然后主动去问下服务员,是否到号,没到号继续刷手机,如果到号直接进去吃饭,还有一种的话就是干脆一直坐在那里刷手机我反正不赶时间,等着被通知到号。同样的配置中心的更新是如何通知到客户端列?是服务端主(configService)动通知到客户端(
client
)告诉它某某你的应用的配置被修改了,原来的值是啥被修改后的值是啥?还是说客户端(Client)每隔多久去问下服务端我的配置有没有被修改呀?如果是你你会怎么选择列?你也许会说我肯定两种方式都要呀!小朋友才会做选择?
客户端长链接获取配置更新通知
再回到我们使用apollo
的时候我们应用里面引入的Apollo
的Client
在我们应用启动的时候会有一个线程每隔5s
向服务短发起一个http
请求,不过这个http
请求是不会立即返回的。它是一个长链接如果配置没有被更新,这个请求会被阻塞挂起,这个实现挂起的方式是通过Spring
的DeferredResult
来实现的,如果对这个Spring
的DeferredResult
不是很了解的推荐看下这个文章《5种SpringMvc的异步处理方式你都了解吗?》挂起60s后会返回HTTP
状态码为304
给到客户端,如果再阻塞的过程中服务端配置有更新,这个Http请求会立马返回,并且把变化的nameSpace信息返回出去,并且返回的http的状态码是200。客户端得到状态码是200并且会根据nameSpace立即去服务端拉取最新的配置。这里其实有一个问题,为什么不直接在长链接中返回变更后的结果,而是返回一个变更的通知,需要客户端根据这个变更通知立即去拉取新的配置?
★
总结
在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了
(https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**