說實話嗡午,之前做完第一次技術(shù)周小結(jié)之后荔睹,由于時間,個人拖延等問題严沥,一直沒有堅持下去寫中姜。上周又想到了這個事情跟伏,回想了一下自己當(dāng)時為什么要做這個周小結(jié)受扳,感覺自己當(dāng)初的出發(fā)點就是每周都能接觸兔跌,了解坟桅,學(xué)到很多新的,或者之前知道但不太了解的東西赖舟,平時稍微做點記錄夸楣,然后每周周末的時候再花一點時間整理一下豫喧,就感覺這周比較有成就感。但是讲衫,沒堅持下去孵班。
最近在工作中重父,發(fā)現(xiàn)每天都會接觸很多不太了解的東西忽匈,之前都是記在筆記本上丹允,但是感覺很龐雜,而且也都只是當(dāng)時自己的隨筆折柠,不是很系統(tǒng)批狐,而且感覺一直放在筆記本里也不太好。所以承冰,我又想起了自己之前的這個周小結(jié)困乒,回顧之前的做法,現(xiàn)在愈發(fā)感覺要堅持下去了迁霎!
好了百宇,廢話不多說恳谎,直接上內(nèi)容。
目錄:
1.高并發(fā)設(shè)計的幾點思路(High Concurrence Architecture Design)
2.高性能的優(yōu)化(High Performance Optimizing)
3.郵件系統(tǒng)的架構(gòu)和相關(guān)協(xié)議
4.分布式系統(tǒng)初探
5.Spring 異常處理辦法
6.認(rèn)識的一些 "新的伙伴"
1.高并發(fā)設(shè)計的幾點思路
對于高并發(fā)設(shè)計的切入點婚苹,看了很多文章膊升,總結(jié)了一些目前主流的一些做法谭企,其中主要包括對服務(wù)器端
债查,數(shù)據(jù)庫
,緩存
征绸,靜態(tài)資源
的設(shè)計管怠。
- 服務(wù)器端
- 引入負(fù)載均衡缸榄,比如利用nginx充當(dāng)負(fù)載均衡器甚带,使用阿里云SLB服務(wù)
- 對資源進(jìn)行監(jiān)控
- 采用分布式的架構(gòu)佳头,緩解單機訪問壓力畜晰,提高并發(fā)量
- 數(shù)據(jù)庫
- 主從分離
- 建立數(shù)據(jù)庫集群
- 建立分布式的數(shù)據(jù)庫架構(gòu)
- 表優(yōu)化瑞筐、索引優(yōu)化
- 緩存
- 利用redis,memcached,mongodb等NOSQL數(shù)據(jù)庫聚假,同時要做到主從分離,集群部署
參考文章:
大話程序猿眼里的高并發(fā)
大話程序猿眼里的高并發(fā)架構(gòu)
2.高性能的優(yōu)化
我自己對于高性能的簡單理解就是峭范,服務(wù)器的響應(yīng)速度很快纱控。(這里可能理解的過于簡單菜秦,如果有什么問題球昨,希望大家能給我指出來,我也要再學(xué)習(xí)下)嚣州。
那么該怎么做呢共螺?
- 代碼優(yōu)化
- JVM調(diào)優(yōu)
- 數(shù)據(jù)庫優(yōu)化藐不,包括sql語句佳吞,連接池棉安,采用NOSQL數(shù)據(jù)庫,讀寫分離衷模,水平和垂直分庫分表
- 利用緩存阱冶,比如本地緩存HashMap,Ehcache,緩存服務(wù)Redis/Tair/Memcache
- 架構(gòu)上的調(diào)優(yōu),比如負(fù)載均衡至耻,分布式系統(tǒng)
- 采用異步請求機制
- 度量尘颓、監(jiān)控系統(tǒng) 提供間接幫助來優(yōu)化系統(tǒng)晦譬。
仔細(xì)對比一下1和2的總結(jié)敛腌,可以看到有很多重合的解決辦法,所以說尤莺,其實高并發(fā)也屬于高性能的一個指標(biāo)缝裁。
參考文章:
美團點評-常見性能優(yōu)化策略的總結(jié)
3.郵件系統(tǒng)的架構(gòu)和相關(guān)協(xié)議
郵件系統(tǒng)涉及的參與者:
- 用戶代理
- 郵件服務(wù)器
涉及的協(xié)議
- POP3
Post Office Protocol 3 它是規(guī)定個人計算機如何連接到互聯(lián)網(wǎng)上的郵件服務(wù)器進(jìn)行收發(fā)郵件的協(xié)議捷绑。它是因特網(wǎng)電子郵件的第一個離線協(xié)議標(biāo)準(zhǔn)氢妈,POP3協(xié)議允許用戶從服務(wù)器上把郵件存儲到本地主機(即自己的計算機)上首量,同時根據(jù)客戶端的操作刪除或保存在郵件服務(wù)器上的郵件,而POP3服務(wù)器則是遵循POP3協(xié)議的接收郵件服務(wù)器鸭叙,用來接收電子郵件的沈贝。 - SMTP
Simple Mail Transfer Protocol 是一種提供可靠且有效電子郵件傳輸?shù)膮f(xié)議勋乾。SMTP是建立在FTP文件傳輸服務(wù)上的一種郵件服務(wù),主要用于傳輸系統(tǒng)之間的郵件信息并提供與來信有關(guān)的通知罩引。 - IMAP
Internet Mail Access Protocol(交互式郵件存取協(xié)議)IMAP是斯坦福大學(xué)在1986年開發(fā)的研發(fā)的一種郵件獲取協(xié)議袁铐。它的主要作用是郵件客戶端(例如MS Outlook Express)可以通過這種協(xié)議從郵件服務(wù)器上獲取郵件的信息横浑,下載郵件等伪嫁。當(dāng)前的權(quán)威定義是RFC3501。IMAP協(xié)議運行在TCP/IP協(xié)議之上帝洪,使用的端口是143葱峡。它與POP3協(xié)議的主要區(qū)別是用戶可以不用把所有的郵件全部下載龙助,可以通過客戶端直接對服務(wù)器上的郵件進(jìn)行操作提鸟。
其特點是:
1.用戶可以維護自己在服務(wù)器上的郵件目錄;可以直接抓取郵件的特定部分
2.IMAP它只下載郵件的主題胸哥,并不是把所有的郵件內(nèi)容都下載下來空厌,而是你郵箱當(dāng)中還保留著郵件的副本银酬,沒有把你原郵箱中的郵件刪除揩瞪。
4.分布式系統(tǒng)初探
1.分布式系統(tǒng)的特點:
-
可擴展性
企業(yè)級應(yīng)用需求經(jīng)常隨時間而不斷變化,企業(yè)級應(yīng)用平臺必須要能適應(yīng)需求的變化,即具有可擴展性喷屋。
-
性能制約:內(nèi)部網(wǎng)絡(luò)通訊開銷
所以分布式系統(tǒng)每個節(jié)點一般不采用高性能的服務(wù)器屯曹,而是性能相對一般的普通PC服務(wù)器狱庇。提升分布式系統(tǒng)的整體性能是要通過橫向擴展(增加更多的服務(wù)器),而不是縱向擴展(提升每個節(jié)點的服務(wù)器性能)恶耽。
廉價高效
-
能夠企業(yè)應(yīng)用服務(wù)層面的彈性擴展
應(yīng)用服務(wù)層面的彈性擴展是相對計算資源層面的彈性擴展而言的密任。一般公有云服務(wù)(IaaS)廠商都會提供計算資源層面的彈性擴展,比如可以很方便地增加或刪除虛擬主機偷俭、提升或降低虛擬主機的性能配置等等浪讳。但是企業(yè)客戶真正需要的是應(yīng)用服務(wù)層面的彈性擴展,即隨著業(yè)務(wù)量的漲落涌萤,后臺應(yīng)用服務(wù)的實例能動態(tài)變化,這是IaaS廠商還做不到的负溪。比如透揣,某移動互聯(lián)網(wǎng)短視頻分享應(yīng)用,在晚間11點到凌晨1點是訪問高峰川抡,同時在線人數(shù)高達(dá)幾十萬辐真,這時后臺應(yīng)用服務(wù)要擴張到數(shù)千個實例才能應(yīng)付這么高并發(fā)的訪問請求;過了高峰時段崖堤,后臺應(yīng)用服務(wù)可以收縮到幾十個實例侍咱。有了分布式系統(tǒng),就可以很方便地調(diào)度應(yīng)用服務(wù)實例密幔,從幾十個到幾百個甚至上千個放坏,真正實現(xiàn)應(yīng)用服務(wù)的彈性擴展。
2.設(shè)計理念:
分布式系統(tǒng)對服務(wù)器硬件要求很低
分布式系統(tǒng)強調(diào)橫向可擴展性
分布式系統(tǒng)不允許單點失效
分布式系統(tǒng)盡可能減少節(jié)點間通訊開銷(Hadoop MapReduce)
-
分布式系統(tǒng)應(yīng)用服務(wù)最好做成無狀態(tài)的(Redis/Memcache)
把應(yīng)用服務(wù)設(shè)計成無狀態(tài)的老玛,讓程序把需要保存的數(shù)據(jù)都保存在專門的存儲上淤年,這樣應(yīng)用服務(wù)程序可以任意重啟而不丟失數(shù)據(jù),方便分布式系統(tǒng)在服務(wù)器宕機后恢復(fù)應(yīng)用服務(wù)蜡豹。
參考文章:
分布式系統(tǒng)的特點以及設(shè)計理念
5.Spring 異常處理辦法
1.局部異常處理:
- Annotation:@ExceptionHandler
2.全局異常處理:
- web.xml and Application.xml Configuration
- @ControllerAdvice
- SimpleMappingExceptionResolver
- Interface:HandlerExceptionResolver
2.1 Web.xml and Application.xml Configuration
In Web.xml:
<error-page>
<error-code>404</error-code>
<location>/404</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500</location>
</error-page>
<!-- 未捕獲的錯誤麸粮,同樣可指定其它異常類,或自定義異常類 -->
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/uncaughtException</location>
</error-page>
In Application.xml:
<!-- 錯誤路徑和錯誤頁面镜廉,注意指定viewResolver -->
<mvc:view-controller path="/404" view-name="404"/>
<mvc:view-controller path="/500" view-name="500"/>
<mvc:view-controller path="/uncaughtException" view-name="uncaughtException"/>
2.2 @ControllerAdvice
從注解名字上來看弄诲,其負(fù)責(zé)對所有的Controller進(jìn)行增強,具體增強的邏輯在其方法中實現(xiàn)。那么對于異常處理齐遵,其實就是對Controller的一種增強邏輯寂玲,具體做法如下:
@ControllerAdvice
public class ControllerAdvice {
@ExceptionHandler(NullPointerException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public String handleIOException(NullPointerException ex) {
return ClassUtils.getShortName(ex.getClass()) + ex.getMessage();
}
}
首先類ControllerAdvice
有一個類注解@ControllerAdvice
表示該類是對所有的Controller的增強,具體的增強邏輯在其方法handleIOException
中實現(xiàn)梗摇,同時在該方法上有一個最開始提到過的注解@ExceptionHandler
拓哟,表示該方法要對相應(yīng)的異常進(jìn)行捕獲,然后處理伶授。
同時断序,注解@ResponseStatus
經(jīng)常和@ExceptionHandler
共同使用,表示要返回的status糜烹。
2.3 Class: SimpleMappingExceptionResolver
該類SimpleMappingExceptionResolvers
是Spring MVC提供的一個異常處理實現(xiàn)類违诗。其常見用法如下:
基于傳統(tǒng)xml配置的:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 默認(rèn)錯誤頁面,就是不在exceptionMappings指定范圍內(nèi) -->
<property name="defaultErrorView" value="uncaughtException" />
<property name="exceptionMappings">
<props>
<!-- 異常類名疮蹦,可以是全路徑诸迟,錯誤頁面或Controller路徑! -->
<prop key="NullPointerException">NullPointerException</prop>
<prop key="java.io.IOException">IOException</prop>
</props>
</property>
</bean>
基于 Hard Code的:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.balbala.mvc.web"})
public class WebMVCConfig extends WebMvcConfigurerAdapter{
@Bean
public SimpleMappingExceptionResolver simpleMappingExceptionResolver()
{
SimpleMappingExceptionResolver b = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
mappings.put("org.springframework.web.servlet.PageNotFound", "page-404");
mappings.put("org.springframework.dao.DataAccessException", "data-access");
mappings.put("org.springframework.transaction.TransactionException", "transaction-Failure");
b.setExceptionMappings(mappings);
return b;
}
}
從上邊的使用上可以窺探到愕乎,該類內(nèi)部是封裝了一個Map對象亮蒋,該對象存儲、維護著異常類型與view之間的對應(yīng)關(guān)系妆毕,Spring會拋出異常之后慎玖,會根據(jù)該類的Map對象維護的映射關(guān)系來選擇返回的View。
2.4 Interface: HandlerExceptionResolver
用法如下:
public class CustomHandlerExceptionResolver implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
Map<String, Object> model = new HashMap<String, Object>();
model.put("e", e);
//這里可根據(jù)不同異常引起類做不同處理方式笛粘,本例做不同返回頁面趁怔。
String viewName = ClassUtils.getShortName(e.getClass());
return new ModelAndView(viewName, model);
}
}
實現(xiàn)該接口,并將其實現(xiàn)類注冊為一個Bean放入到Spring IOC中薪前,接著出現(xiàn)異常就會走這個實現(xiàn)方法润努。
參考文章:
Spring-MVC開發(fā)之全局異常捕獲全面解讀
Exception Handling in Spring MVC
[Spring Exception Demo](spring-mvc-exception demo:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc)
認(rèn)識的一些 "新的伙伴"
1.Mysql Route: lightweight middleware
2.敏捷項目開發(fā)工具:redMine,gitlab,Jira,MantisHub