看透SpringMVC源代码分析与实践读书笔记

写在前面:
这本书陆陆续续读了两周的 还只读了三分之一
也就300多页的书 就是很久没有学习过了
失去学习的能力了
所以现在试试新的方法
每本书写个读书笔记
然后限个时 效果好就推广 效果不好就想办法优化
如果今天的derrick和昨天的derrcik一样
那么今天还有什么意义
Life is too short, do not live the same day twice.

本书阅读时间 20180527-?

网站基础知识

网站的架构及其演变过程
  • 其实TCP/IP参考的模型也可以看作一种协议。BA结构中TCP/IP模型中的网络接入层没有相应协议,网际互联层时IP协议,传输层是TCP协议,应用层是HTTP协议
  • 缓存和页面静态化
    数据量大这个问题最直接的解决方案就是使用缓存,缓存就是将数据从数据库中获取的结果暂时保存起来,在下次使用的时候无需重新到数据库中获取,这样可以大大降低数据库的压力
    缓存的使用方式可以分为通过程序直接保存到内存中使用和使用缓存框架两种方式。程序直接操作主要是使用Map,尤其是ConcurrentHashMap,而常用的缓存框架有Ehcashe、Memcache和Redis等。缓存使用过程中最重要的问题什么时候创建缓存和缓存的失效机制。缓存可以在第一次获取的时候创建也可以在程序启动和缓存失效之后立即创建,缓存的失效可以定期失效,也可以在数据发生变化的时候失效,如果按数据发生变化让缓存失效,还可以分粗粒度失效和细粒度失效。

缓存中空数据的管理方法
如果缓存是在第一次获取的时候创建的,那么在使用缓存的时候最好将没有数据的缓存使用特定的类型值来保存,因为这种方式下如果从缓存中获取不到数据就会从数据库中获取,如果数据库中本来就没有相应的数据就不会创建缓存,这样将每次都会查询数据库。比如有个专门保存文章评论的缓存,不同的评论按照不同文章的ID来保存,如果有一篇文章本来就没有评论,那么就没有相应的缓存或者缓存的值为null,这样程序在每次调用这篇文章的评论时都会查询数据库。这就没起到缓存的作用,我们可以创建一个专门的类(如NoComment)来保存没有评论的缓存,这样程序从缓存中查询后就可以知道是还没有创建缓存还是本来就没有评论内容。

  • 跟缓存相似的另外一种技术叫页面静态化,它在原理上跟缓存非常相似,缓存是将从数据库获取到的数据(当然也可以是别的任何可以序列化的东西)保存起来,而页面静态化是将程序最后生成的页面保存起来,使用页面静态化就不需要每次调用都重新生成页面了,这样不但不要查询数据库,而且连应用程序处理都省了,所以页面静态化同时对数据量大和并发量高两大问题都有好处。(后续看看页面静态化怎么实现 相关的模板技术 Freemarker Velocity 相关名词了解一哈)
  • 分离活跃数据
    之前看到是缓存热点数据 我们进一步想 就可以延伸出在数据库层面分离活跃数据和非活跃数据(这种思路了解一哈)
  • 数据库集群(读写分离)的作用是将多个请求分配到不同服务器处理,从而减轻单台服务器的压力,而分布式数据库是解决单个请求本身就非常复杂的问题,它可以将单个请求分配到多个服务器处理,使用分布式后的每个节点还可以同时使用读写分离,从而组成多个节点群。(我“天真”地感觉又要集群又要分布式对架构是一种考验,后续了解一哈)
  • 集群和分布式处理都是使用多台服务器处理的,集群是每台服务器都具有相同的功能(就是gx的廊坊+马驹桥机房嘛哈哈哈哈),处理请求时调用哪台服务器都可以,主要起分流的作用,分布式时将不同的业务放到不同的服务器中,处理一个请求可能需要用到多台服务器,这样就可以提高一个请求的处理速度,而且集群和分布式也可以同时使用。
  • 集群又分静态资源集群和应用程序集群。应用程序集群因为需要用到一些缓存的数据,所以就存在同步的问题,其中最重要的就是Session,Session同步也是应用程序集群中非常核心的一个问题。Session同步有两种处理方式:一种是在Session发生变化后自动同步到其他服务器(tomcat就是默认这种方式),另外一种方式是用一个程序统一管理Session(可以使用专门的服务器安装Memecached等高效的缓存程序来统一管理Session,然后再应用程序中通过重写Request并覆盖getSession方法来获取指定服务器中Session)。

另外我也想到一种思路可以简单地解决Session同步的问题,Session需要同步的本质原因就是要使用不同的服务器给同一个用户提供服务,如果均衡负载在分配请求时可以将同一个用户(如按IP)分配到同一台服务器进行处理就不需要Session同步了,二期这种方法一般也不会对负载均衡带来太大的问题,如果考虑到稳定性,为了防止有服务器宕机后丢失数据还可以将集群的服务器分成多个组,然后在小范围的组内同步Session。
//一些后续的问题,如果用户切换了IP登录该怎么处理,对频繁切换ip的用户有没有什么策略,以及传统方式和这种思路的优劣,他们各自适合什么类型的应用及用户群

  • 反向代理
    反向代理指的是客户端直接访问的服务器并不真正提供服务,它从别的服务器获取资源然后将结果返回该用户的
    反向代理服务器主要有三个作用:1.作为前端服务器跟实际处理请求的服务器(如tomcat集成)2.可以用作负载均衡 3.转发请求
  • CDN
    就是一种特殊的集群页面缓存服务器,和普通的多台页面缓存服务器比主要是它存放的位置是分步在全国各地的,当接受到用户的请求后会将请求分配到最合适的CDN服务器节点获取数据
  • 底层的优化
    我们前面讲到的所有的架构都是建立在最前面介绍的基础架构之上的,而且很多地方都需要通过网络传输数据,如果可以加快网络传输的速度,那将会让整个系统从根本上得到改善。网络传输数据都是按照各种协议进行的,不过协议并不是不可以改变,Google就迈出了这一步,它制定了Quic、Spdy等协议来传输数据,Quic比TCP效率高而且不UDP安全,Spdy协议比现有HTTP协议的基础上增加了很多新特性,提高了传输的效率,不过有些特性已经包含到了HTTP/2协议中,而且Google也已经放弃了Spdy而使用HTTP/2了。
  • 小结
    网站架构的整个演变过程主要是围绕大数据和高并发两个问题展开的,解决的方案主要分为使用缓存和使用多资源两种类型。多资源主要指多存储(包括多内存)、多CPU和多网络,对于多资源来说又可以分为单个资源处理一个完整请求和多个资源合作处理一个请求两种类型,如多存储和多CPU中的集群和分布式,多网络中的CDN和静态资源分离。理解了整个思路之后就抓住了架构演变的本质,二期自己可能还可以设计出更好的架构。
常见的协议和标准
  • 三次握手和四次挥手
    理解这两个过程需要理解TCP中的两个序号和三个标志位的含义
    seq ack ACK SYN FIN(这个可以后续详细分析)
  • DDOS攻击中的SYN flood攻击
    两次握手成功后故意不握第三次,这时服务端就会认为是第二次握手的数据在传输过程中丢失了,会重新发送第二次握手,默认情况会一直发五次。
    对于这种攻击的一种应对方法是设置第二次请求的重发次数(tcp_synack_retries),不过重发的次数太小也可能导致正常的请求中因为网络没有收到第二次握手而连接失败的情况,具体设置为多少合适,还需要根据实际情况判断,当然如果资金充足也可以使用硬防。(什么是硬防)
  • TCP与UDP
    用于传输层的协议除了TCP还有UDP,它们的区别主要是TCP是有连接的,UPD是没有连接的,也就是说TCP协议是在沟通好后才会传数据,而UDP协议是拿到地址后直接传了,这样产生的结果就是TCP协议的传输速度更快。TCP就像打电话,需要先拨通对方号码才能通信,而UDP就像是使用对讲机,拿起来就可以直接讲话。
  • HTTP协议
    HTTP协议是应用层的协议,在TCP/IP协议接收到数据之后需要通过HTTP协议来解析才可以使用。就像过去发电报一样,电报机就相当于Socket,负责选好发是送的目标并将内容发过去,但是直接发过去的数据“滴滴滴”并不能直接使用,还需要解码(在发送前需要编码)后才能用,电报机中的编码和解码就相当于网络传输协议中的HTTP协议
    HTTP协议中的报文结构非常重要。HTTP报文中分为请求报文(request message)和响应报文(response message)两种类型,这两种类型都包括三部分:首行、头部和主体。请求报文的首行是请求行,包括方法(请求类型)、URL和HTTP版本三项内容,响应请求的首行是状态行,包括HTTP版本、状态码和简短原因三项内容,其中原因可有可无。(就想起了controller里面那些操作 还有什么“HTTP接口”)
    请求报文中的方法指GET、HEAD、POST、PUT、DELETE等类型,响应报文中的状态码就是Response中的status,一共可以分为5类:

1XX:信息性状态码
2XX:成功状态码,如200表示成功
3XX:重定向状态码,如301表示重定向
4XX:客户端错误状态码,如404表示没找到请求的资源(有兴趣的453了解一哈)
5XX:服务端错误状态码,如500表示内部错误

  • Servlet
    Servlet是J2EE的标准之一(标准比协议多了强制性的意义)通过前面的TCP/IP协议、HTTP协议已经可以得到数据了,Servlet的作用是对接收到的数据进行处理并生成要返回给客户端的的结果,这就像电报中接收到电报并翻译成明文后还需要有人来决策并作出回复内容一样。
    Servlet制定了Java中处理web请求的标准,我们只需要按照标准规定的去做就可以了。当然,规范和标准都不能干活,需要相应的Servlet容器,比如tomcat。
DNS的设置
  • qq能上网 浏览器不行
    这个问题经常遇到 其实就是因为有些程序(如qq)是直接使用IP连接的,而浏览器需要DNS服务,这种就是DNS服务出了问题。
java中socket的用法
  • Java中的Socket
    分为普通Socket和NioSocket
  • 普通Socket的用法
    Socket分为ServerSocket和Socket两大类,ServerSocket用于服务端,可以通过accept方法监听请求,监听到请求后返回Socket,Socket用于完整的数据传输,客户端直接使用Socket发起请求并传输数据。(后续可以单独开个坑 写一下这个的实现)
  • NioSocket的用法
    主要是了解三个概念 Buffer Channel Selector
    Buffer中的四个重要属性 capacity limit position mark(两两对应)
自己动手实现HTTP协议

这章后面单独开个坑

详解Servlet

https://www.jianshu.com/p/90e460893e53

tomcat分析

俯视Spring MVC

Spring MVC初体验
创建Spring MVC之器
Spring MVC之用

Spring MVC组件分析

总结与补充

r

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容