分布式理論
分布式基礎(chǔ)理論
分布式系統(tǒng)目標(biāo):提升系統(tǒng)的整體性能和吞吐量另外還要盡量保證分布式系統(tǒng)的容錯性涮母;
分布式系統(tǒng)設(shè)計(jì)思想:中心化和去中心化;
CAP定理:一致性(Consistence)提岔、可用性(Availability)玄货、分區(qū)容錯性(Partition tolerance) ;
BASE理論:Basically Available(基本可用)跨细、Soft-state(軟狀態(tài))臭猜、Eventually Consistent(最終一致性)躺酒;
微服務(wù)基礎(chǔ)理論
什么是微服務(wù):小、獨(dú)立蔑歌、輕量級通信羹应、無集中式管理;
微服務(wù)利弊:強(qiáng)模塊邊界 次屠、獨(dú)立部署园匹、技術(shù)多樣性;分布式復(fù)雜性帅矗、最終一致性偎肃、運(yùn)維復(fù)雜性、測試復(fù)雜性浑此;
中臺戰(zhàn)略:對后臺的細(xì)分累颂,大中臺小前臺,把前端的應(yīng)用變得更小更靈活凛俱;
微服務(wù)分層:接入層紊馏、網(wǎng)關(guān)層、業(yè)務(wù)服務(wù)層(聚合服務(wù)蒲犬、基礎(chǔ)服務(wù))朱监、支撐服務(wù)層、平臺服務(wù)原叮、基礎(chǔ)設(shè)施層赫编;
微服務(wù)技術(shù)棧:服務(wù)發(fā)現(xiàn)巡蘸、網(wǎng)關(guān)、配置中心擂送、服務(wù)框架和治理悦荒、監(jiān)控、限流熔斷嘹吨、容器部署&持續(xù)交付流水線搬味、容器調(diào)度和發(fā)布體系;
分布式事務(wù)
產(chǎn)生原因:數(shù)據(jù)庫分庫分表導(dǎo)致多數(shù)據(jù)源訪問蟀拷;應(yīng)用SOA化碰纬,每個服務(wù)都有自己的數(shù)據(jù)庫;
2PC:請求階段和提交階段问芬;缺點(diǎn):同步阻塞悦析、協(xié)調(diào)者單點(diǎn)故障、數(shù)據(jù)不一致(任一階段發(fā)生網(wǎng)絡(luò)故障就會導(dǎo)致)愈诚;無法解決的問題:協(xié)調(diào)者和參與者同時出現(xiàn)故障時她按,保證事務(wù)的完整性牛隅;
3PC:準(zhǔn)備階段炕柔、請求階段和提交階段;優(yōu)點(diǎn):減少阻塞范圍媒佣,單點(diǎn)故障后能達(dá)成一致匕累;缺點(diǎn):還是有不一致問題;
TCC補(bǔ)償事務(wù):Try(負(fù)責(zé)資源的檢查和預(yù)留)默伍、Confirm(執(zhí)行真正的業(yè)務(wù)操作)欢嘿、Cancel (執(zhí)行回滾)3個方法均由業(yè)務(wù)編碼實(shí)現(xiàn);
業(yè)務(wù)實(shí)現(xiàn)TCC的注意事項(xiàng):業(yè)務(wù)操作需要按Try也糊、Confirm/Cancel兩步驟完成炼蹦、允許空回滾、防懸掛控制(Cancel之后不處理Try)狸剃、冪等控制掐隐;
本地消息表:發(fā)起和執(zhí)行事務(wù)的服務(wù)都記錄消息到本地DB;保證本地事務(wù)(消息和業(yè)務(wù)同一事務(wù)提交)钞馁;更新消息狀態(tài)虑省;輪訓(xùn)并重試機(jī)制;
MQ事務(wù)消息:RocketMQ中間件能夠支持一種事務(wù)消息機(jī)制僧凰,確保本地操作和發(fā)送消息的異步處理達(dá)到本地事務(wù)的結(jié)果一致探颈;
最大努力通知:重復(fù)N次嘗試相同動作;
分布式一致性
CAP训措、BASE伪节、2PC光羞、3PC:參考上面;
Paxos :3個角色:proposers提議怀大,acceptors投票接收提議狞山, learners被通知結(jié)果;絕大多數(shù)acceptors接收才通過提議叉寂;節(jié)點(diǎn)可身兼多角色萍启;
Zab:為Zookeeper專門設(shè)計(jì)的一種支持崩潰恢復(fù)和原子廣播協(xié)議;一種Paxos的實(shí)現(xiàn)和改進(jìn)屏鳍;主備模式即只有主節(jié)點(diǎn)才是proposers即leader勘纯,然后由主節(jié)點(diǎn)復(fù)制給其他節(jié)點(diǎn)follower;
消息廣播:使用原子廣播協(xié)議钓瞭,類似2階段提交驳遵,但只要一半以上Fllower返回ACK即提交,減少阻塞山涡;
崩潰恢復(fù):Leader掛了之后堤结,自動進(jìn)入崩潰恢復(fù)模式,選舉新的?Leader鸭丛,并完成數(shù)據(jù)同步竞穷,然后退出崩潰恢復(fù)模式進(jìn)入消息廣播模式;
Raft:用于管理復(fù)制日志的一致性算法鳞溉,也是一個主備模型瘾带,有一個唯一的?leader?控制任務(wù)的提交;節(jié)點(diǎn)分為領(lǐng)袖熟菲、群眾和候選人看政;每一個?leader?都有自己的任期,必須在任期內(nèi)發(fā)送心跳信息給?follower?來延長自己的任期抄罕。
NWR:在分布式存儲系統(tǒng)中控制一致性允蚣;N(備份數(shù)據(jù)數(shù)量),W(一次更新操作寫入成功的數(shù)量)呆贿、R(一次讀取操作讀取成功的數(shù)量)嚷兔;NWR值的不同組合會產(chǎn)生不同的一致性效果,當(dāng)?W+R>N?的時候榨崩,整個系統(tǒng)對于客戶端來講能保證強(qiáng)一致性谴垫;
分布式緩存
應(yīng)用場景:頁面緩存、應(yīng)用緩存母蛛、解決Session同步翩剪、并行計(jì)算共享中間數(shù)據(jù)等;
框架主要是Memcache和Redis:Memcache不支持持久化彩郊、只支持簡單keyValue數(shù)據(jù)類型前弯、KeyValue空間較小蚪缀、使用CAS保證數(shù)據(jù)一致性、內(nèi)存管理采用預(yù)先分配恕出,避免了內(nèi)存碎片但不能變長會浪費(fèi)询枚;
常見問題:緩存雪崩、緩存穿透浙巫、緩存預(yù)熱金蜀、緩存更新、緩存降級的畴;
分布式鎖
需考慮問題:分布式鎖是否可重入渊抄,分布式鎖的釋放時機(jī)(超時),分布式鎖服務(wù)端是否有單點(diǎn)問題等丧裁。
基于數(shù)據(jù)庫(唯一索引)實(shí)現(xiàn):通過唯一索引保持排他性护桦,加鎖時插入一條記錄,解鎖是刪除這條記錄煎娇;
通過判斷鎖持有者實(shí)現(xiàn)可重入二庵,通過記錄和查詢鎖時間實(shí)現(xiàn)超時,通過數(shù)據(jù)庫分布式解決單點(diǎn)問題缓呛;
基于緩存(Redis)實(shí)現(xiàn):內(nèi)存操作催享,效率最高,利用SETNX key value命令實(shí)現(xiàn)强经;解鎖使用Lua腳本實(shí)現(xiàn)保證原子性睡陪;
通過判斷鎖持有者實(shí)現(xiàn)可重入寺渗,通過Redis自帶的Key超時機(jī)制實(shí)現(xiàn)鎖超時匿情,通過Redis分布式解決單點(diǎn)問題;
基于Zookeeper實(shí)現(xiàn)分布式鎖:利用Zookeeper創(chuàng)建臨時有序節(jié)點(diǎn)來實(shí)現(xiàn)分布式鎖信殊;判斷節(jié)點(diǎn)序號最小則加鎖成功炬称,否則注冊Watcher事件等待前面節(jié)點(diǎn)(序號小的獲取到鎖的)通知則獲取到鎖;通過客戶端加鎖時將主機(jī)和線程信息寫入鎖中涡拘,下一次再來加鎖時直接和序列最小的節(jié)點(diǎn)對比實(shí)現(xiàn)可重入玲躯,ZK自動刪除灰化斷開的臨時節(jié)點(diǎn)實(shí)現(xiàn)鎖超時;ZK集群解決單點(diǎn)問題鳄乏;通過curator框架可實(shí)現(xiàn)ZK分布式鎖跷车;
分布式Session
粘性session:將用戶鎖定到某一個服務(wù)器上,Nginx通過配置ip_hash實(shí)現(xiàn)橱野;
session復(fù)制:任何一個服務(wù)器上的session發(fā)生改變(增刪改)朽缴,該節(jié)點(diǎn)會把這個 session的所有內(nèi)容序列化,然后廣播給所有其它節(jié)點(diǎn)水援,不管其他服務(wù)器需不需要session密强,以此來保證Session同步茅郎;優(yōu)點(diǎn):可容錯;缺點(diǎn):網(wǎng)絡(luò)壓力或渤,拖慢服務(wù)器性能系冗;可通過Tomcat集群配置實(shí)現(xiàn);
session共享:將Session保存在分布式緩存Memcache或Redis中薪鹦,Tomcat本身不存儲session掌敬,Tomcat可通過MSM插件實(shí)現(xiàn);
session持久化到數(shù)據(jù)庫:數(shù)據(jù)庫專門用來存儲session信息池磁,保證session的持久化涝开;
負(fù)載均衡
負(fù)載均衡分類:按照ISO網(wǎng)絡(luò)模型及工作的層數(shù)分為:
二層負(fù)載均衡:基于數(shù)據(jù)鏈路層,負(fù)載均衡服務(wù)器和業(yè)務(wù)服務(wù)器綁定同一個虛擬IP框仔,客戶端請求虛擬IP舀武,負(fù)載均衡服務(wù)器通過改寫Http請求的MAC地址實(shí)現(xiàn);
三層負(fù)載均衡:基于網(wǎng)絡(luò)層离斩,按照不同機(jī)器不同IP地址進(jìn)行轉(zhuǎn)發(fā)請求到不同的機(jī)器上银舱;
四層負(fù)載均衡:基于傳輸層,通過TCP/UDP協(xié)議跛梗,基于IP+端口號進(jìn)行請求的轉(zhuǎn)發(fā)寻馏,如LVS;
七層負(fù)載均衡:基于應(yīng)用層核偿,通過HTTP诚欠,DNS協(xié)議,基于請求的URL進(jìn)行轉(zhuǎn)發(fā)負(fù)載漾岳,如Nginx轰绵;
一般會采用DNS+LVS+Nginx的方式進(jìn)行多層次軟件層面的負(fù)債均衡,還有在前面多加一層物理負(fù)載均衡尼荆,比如知名的F5左腔。
負(fù)載均衡算法:
靜態(tài)算法:輪訓(xùn)、隨機(jī)捅儒、源地址哈希液样、加權(quán)輪訓(xùn)、加權(quán)隨機(jī)巧还、鍵值范圍法鞭莽;
動態(tài)算法:最小連接數(shù)法、最快響應(yīng)時間法麸祷、觀察模式法(綜合最小連接數(shù)和最快響應(yīng)度澎怒,進(jìn)行權(quán)重分配);
Spring
核心模塊:Spring Core摇锋、Spring Context丹拯、Spring AOP站超、Spring DAO、Spring ORM乖酬、Spring Web死相、Spring MVC;
優(yōu)點(diǎn):低侵入咬像、IOC降低組件的耦合算撮、AOP提高復(fù)用、支持集成主流框架县昂;
AOP:對OOP的補(bǔ)充肮柜,抽離可復(fù)用模塊;采用動態(tài)代理實(shí)現(xiàn)倒彰,有接口采用JDK動態(tài)代理(InvocationHandler审洞、Proxy),無接口采用基于繼承的CGLib(不能Final待讳,MethodInterceptor芒澜、Enhancer);不修改字節(jié)碼创淡,AspectJ是靜態(tài)代理痴晦,需要使用特定編譯器修改字節(jié)碼,性能好些琳彩;
幾個名詞:切面(Aspect)誊酌、連接點(diǎn)(Join point)、通知(Advice)露乏、切入點(diǎn)(Pointcut)碧浊、目標(biāo)對象、織入(Weaving)施无,關(guān)鍵是連接點(diǎn)和切入點(diǎn)匹配辉词;
通知類型:前置通知、返回后通知猾骡、拋出異常后通知、后通知敷搪、環(huán)繞通知兴想;
IOC:即創(chuàng)建對象的主動權(quán)和時機(jī)的權(quán)利由類本身轉(zhuǎn)移給Spring容器;采用反射實(shí)現(xiàn)組件間松耦合赡勘;和DI一個意思只是描述角度不同嫂便;3種注入方式:構(gòu)造器、Setter闸与、實(shí)例工廠毙替、靜態(tài)工廠岸售、注解题诵;
BeanFactory和ApplicationContext:都是Spring容器殿如,BeanFactory管理bean的生命周期和依賴叫惊,bean采用延遲加載裆赵;ApplicationContext是其子接口哩俭,做了擴(kuò)展嘁字,增加了國際化码倦、監(jiān)聽事件等功能咽块,容器啟動時一次性加載所有bean忽洛;
Bean的加載(生命周期):通過解析XML和掃描注解獲取Bean定義腻惠、實(shí)例化bean、設(shè)置對象屬性(DI)欲虚、處理xxAware接口集灌、執(zhí)行BeanPostProcessor的before方法、執(zhí)行初始化方法init-method复哆、執(zhí)行BeanPostProcessor的after方法即完成bean的創(chuàng)建绝页;銷毀:調(diào)用DisposableBean的destory方法、調(diào)用destroy-method方法寂恬;
Bean作用域:singleton续誉、prototype、request初肉、session酷鸦、global-session、application牙咏;
Bean的元數(shù)據(jù)配置:基于XML配置臼隔、基于注解配置(@Component、@Servce等)妄壶、基于JavaConfig(@Configration摔握、@Bean)代碼配置;
線程安全:默認(rèn)單例丁寄,線程不安全氨淌,需要自己處理或者使用prototype;Spring內(nèi)部對有狀態(tài)的bean采用ThreadLocal解決線程安全問題伊磺;
自動裝配:基于XML:ref盛正、byName、byType屑埋、constructor豪筝、autodetect;基于注解:Autowired、Resource续崖;
使用的設(shè)計(jì)模式:工廠(BeanFactory)敲街、單例模式、代理模式(AOP)严望、模板方法(RestTemplate)多艇、觀察者模式(ApplicationListener);
事務(wù):Spring事務(wù)的本質(zhì)其實(shí)就是數(shù)據(jù)庫對事務(wù)的支持著蟹,沒有數(shù)據(jù)庫的事務(wù)支持墩蔓,spring是無法提供事務(wù)功能的;
事務(wù)種類:編程式事務(wù)(TransactionTemplate寫代碼手動提交)萧豆、聲明式事務(wù)(Transactional注解自動提交)奸披;
事務(wù)傳播行為(存在多個事務(wù)是如何處理):根據(jù)是否存在事務(wù)、當(dāng)前事務(wù)是新建涮雷、不建阵面、拋異常、嵌套洪鸭、加入已有事務(wù)(默認(rèn))等分成多種样刷;
事務(wù)隔離級別:默認(rèn)使用數(shù)據(jù)庫的事務(wù)隔離級別、READ_UNCOMMITTED览爵、READ_COMMITTED置鼻、REPEATABLE_READ、SERIALIZABLE蜓竹;
事務(wù)超時:支持定義事務(wù)執(zhí)行超時時間箕母;
事務(wù)回滾規(guī)則:定義了哪些異常會導(dǎo)致事務(wù)回滾而哪些不會。默認(rèn)情況下俱济,事務(wù)只有遇到運(yùn)行期異常時才會回滾嘶是;
事務(wù)是否只讀:表示這個事務(wù)只讀取數(shù)據(jù)但不更新數(shù)據(jù), 這樣可以幫助數(shù)據(jù)庫引擎優(yōu)化事務(wù);
主要類:PlatformTransactionManager(事務(wù)管理器接口蛛碌,Spring 有默認(rèn)實(shí)現(xiàn)聂喇,或者需要其他持久層框架實(shí)現(xiàn))、TransactionDefinition(事務(wù)基本屬性:隔離級別蔚携、傳播行為希太、是否只讀、事務(wù)超時浮梢、回滾規(guī)則)跛十、TransactionStatus(記錄事務(wù)狀態(tài));
事件:繼承ApplicationEvent 秕硝,如果實(shí)現(xiàn)了ApplicationListener接口,當(dāng)一個ApplicationEvent 被發(fā)布以后,bean會自動被通知远豺,包括ContextRefreshed/Started/Stopped/ClosedEvent(上下文刷新奈偏、啟動等)、RequestHandledEvent(http請求結(jié)束)躯护;
Spring MVC
流程:用戶請求發(fā)送至前端控制器DispatcherServlet惊来、DispatcherServlet調(diào)用HandlerMapping獲取Handle、HandlerMapping根據(jù)URL找到handle及所有攔截器生成調(diào)用鏈返回給DispatcherServlet棺滞、DispatcherServlet 調(diào)用 HandlerAdapter處理器適配器執(zhí)行裁蚁、HandlerAdapter 調(diào)用handle執(zhí)行并返回ModelAndView給DispatcherServlet、DispatcherServlet將ModelAndView傳給ViewResolver視圖解析器進(jìn)行解析继准、ViewResolver解析后返回具體View枉证、DispatcherServlet對View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)、DispatcherServlet響應(yīng)用戶移必;
主要組件:DispatcherServlet(轉(zhuǎn)發(fā)器室谚,總調(diào)度)、HandlerMapping(處理器映射器崔泵、根據(jù)URL找Handle)秒赤、HandlerAdapter(處理器適配器,執(zhí)行handle)憎瘸、Handler(處理器入篮,需要開發(fā))、ViewResolver(視圖解析器幌甘、解析成真正的視圖View)潮售、View(視圖,需要開發(fā)jsp)含潘;
和Struts2區(qū)別:SpringMVC入口是DispatcherServlet饲做、一個URL一個方法、通過請求解析器對方法形參賦值遏弱;Struts入口是過濾器盆均、基于類開發(fā)即類屬性為請求參數(shù),需要多例漱逸,采用值棧存儲數(shù)據(jù)泪姨,通過OGNL存取數(shù)據(jù);
實(shí)現(xiàn)攔截器:實(shí)現(xiàn)接口HandlerInterceptor(方法執(zhí)行順序:preHandle饰抒、postHandle肮砾、afterCompletion)、繼承HandlerInterceptorAdapter袋坑;
常用注解:@Component仗处、@Repository、@Service、@Controller婆誓、@RestController吃环、@Configuration 、@Bean洋幻;@Autowired郁轻、@Resource、@PostConstruct 文留、@PreDestroy 好唯;@RequestMapping、@RequestParam燥翅、@PathVariable骑篙、@ResponseBody、@RequestBody权旷、@Transactional?替蛉;
SpringBoot
優(yōu)點(diǎn):簡化難度,提供啟動器拄氯,快速上手躲查,獨(dú)立運(yùn)行,簡化配置译柏,自動配置镣煮,無代碼生成和XML配置,無需部署war文件鄙麦;
核心注解:@SpringBootApplication典唇,是復(fù)合注解包括@SpringBootConfiguration(復(fù)合注解即@Configuration實(shí)現(xiàn)配置文件的功能)、@EnableAutoConfiguration(實(shí)現(xiàn)自動配置)胯府、@ComponentScan(組件掃描)介衔;
Maven中引入SpringBoot的方式:繼承spring-boot-starter-parent項(xiàng)目、導(dǎo)入spring-boot-dependencies項(xiàng)目依賴骂因;
兼容老Spring項(xiàng)目:使用 @ImportResource 導(dǎo)入老 Spring 項(xiàng)目配置文件炎咖;
配置加載:按順序依次:命令行參數(shù)、系統(tǒng)環(huán)境變量寒波、properties文件乘盼、YAML文件(先找Jar外面的,再里面的俄烁,如果指定了profile則先找profile文件再找沒有的绸栅,沒指定profile只找沒有的),后加載的不會覆蓋前面的页屠;
熱部署:在springboot的maven插件中引入springloaded插件并使用mvn spring-boot:run啟動粹胯;或者引入項(xiàng)目依賴spring-boot-devtools并配置devtools參數(shù)實(shí)現(xiàn)蓖柔;
讀取配置:@Value(讀值)、@ConfigurationProperties(指定前綴)矛双、@PropertySource(指定文件路徑)渊抽、Environment(所有配置)蟆豫;
啟動時執(zhí)行:實(shí)現(xiàn)ApplicationRunner 或者 CommandLineRunner接口议忽;
自動配置原理:通過SpringBootApplication注解引入EnableAutoConfiguration(引入@Import(AutoConfigurationImportSelector.class))、AutoConfigurationImportSelector的selectImports()方法通過SpringFactoriesLoader.loadFactoryNames()掃描所有jar包的META-INF/spring.factories文件獲取KeyValue即自動配置類JavaConfig十减、解析這些Spring容器配置類即可完成自動加載栈幸;
啟動原理:第1步:通過SpringApplication.run方法進(jìn)行SpringApplication的初始化模塊,配置一些基本的環(huán)境變量帮辟、資源速址、構(gòu)造器、監(jiān)聽器由驹;第2步:實(shí)現(xiàn)應(yīng)用具體的啟動方案芍锚,包括啟動流程的監(jiān)聽模塊、加載配置環(huán)境模塊蔓榄、及核心的創(chuàng)建上下文環(huán)境模塊并炮;第3步:自動化配置模塊,該模塊作為springboot自動配置核心甥郑;
Spring Cloud
特點(diǎn):約定優(yōu)于配置逃魄、開箱即用,快速啟動澜搅、輕量級的組件伍俘、組件豐富,功能齊全勉躺;
和Dubbo區(qū)別:Dubbo基于RPC二進(jìn)制傳輸癌瘾,帶寬占用較少,Spring基于Rest傳輸饵溅;Dubbo是SOA的產(chǎn)物妨退,除了服務(wù)注冊和服務(wù)監(jiān)控沒有其他網(wǎng)關(guān)、配置中心概说、斷路器等組件碧注;Dubbo需要區(qū)分服務(wù)生產(chǎn)者和消費(fèi)者,Eureka不區(qū)分糖赔,統(tǒng)稱Client萍丐;ZK維持與集群間的長連接,定時發(fā)送心跳放典,Eureka只是基于心跳超時沒有長聯(lián)接逝变;ZK節(jié)點(diǎn)變更后會立刻反饋基茵,Eureka基于節(jié)點(diǎn)定時拉取有延遲;
Spring Cloud Eureka
設(shè)計(jì)原則:AP壳影,即可用性和分區(qū)容錯性拱层,只保證最終一致性;ZK是CP宴咧,保證強(qiáng)一致性根灯,ZK選舉時和節(jié)點(diǎn)超過一半掛掉時會不可用;
設(shè)計(jì)架構(gòu):CS架構(gòu)掺栅,包含Eureka?Server(注冊中心)和Eureka Client(包含服務(wù)提供和消費(fèi)者)兩個組件烙肺;
服務(wù)提供者:啟動時發(fā)送register請求,運(yùn)行中定時發(fā)送renew請求氧卧,主動停止時發(fā)送cancel請求桃笙;服務(wù)消費(fèi)者:啟動時拉取服務(wù)注冊信息,運(yùn)行中定時更新服務(wù)注冊信息沙绝,優(yōu)先調(diào)用同區(qū)域服務(wù)搏明,若沒有同區(qū)域則負(fù)載均衡調(diào)用其他區(qū)域;注冊中心:啟動時從其他節(jié)點(diǎn)拉取服務(wù)信息闪檬,定期剔除沒有renew的服務(wù)星著,接收到的請求會同步給其他節(jié)點(diǎn);
數(shù)據(jù)存儲結(jié)構(gòu):分?jǐn)?shù)據(jù)存儲層和緩存層兩層谬以,內(nèi)部采用ConcurrentHashMap保存服務(wù)信息强饮;
服務(wù)管理:服務(wù)注冊(啟動時向注冊中心注冊)、服務(wù)續(xù)約(注冊后每隔30S發(fā)送renew請求)为黎、服務(wù)注銷(正常停止前向注冊中心發(fā)送cancel請求)邮丰、服務(wù)剔除(若沒有開啟自我保護(hù)并且90s沒收到renew請求則剔除)、服務(wù)獲让(全量同步和增量同步剪廉,先從緩存中取)炕檩、服務(wù)同步(啟動時同步斗蒋、運(yùn)行時同步:節(jié)點(diǎn)有register、renew笛质、cancel 請求則構(gòu)造對象加入隊(duì)列等待線程處理)泉沾;
自我保護(hù):短時間15分鐘內(nèi)過多85%客戶端失去連接(可能自身網(wǎng)絡(luò)問題)時進(jìn)入自我保護(hù)模式,不刪除服務(wù)注冊信息妇押;可以繼續(xù)處理注冊請求跷究,不再同步給其他節(jié)點(diǎn);網(wǎng)絡(luò)恢復(fù)后退出自我保護(hù)并同步節(jié)點(diǎn)敲霍;
使用:@EnableDiscoveryClient 俊马、@EnableEurekaServer 丁存;
和ZK區(qū)別:ZK遵循CP原則,leader選舉期間集群不可用柴我;Eureka遵循AP原則解寝,節(jié)點(diǎn)平等互不影響,一個節(jié)點(diǎn)也能工作艘儒,通過自我保護(hù)能很好地應(yīng)對網(wǎng)絡(luò)故障聋伦;
Spring Cloud?Hystrix
作用:解決服務(wù)雪崩、控制和保護(hù)第三方依賴彤悔、阻止故障的連鎖反應(yīng)嘉抓、快速失敗并迅速恢復(fù)、回退并優(yōu)雅降級晕窑;
使用:繼承HystrixCommand或HystrixObservableCommand,通過execute卵佛、queue杨赤、observe、toObservable方法執(zhí)行截汪;@HystrixCommand配置策略疾牲,
資源隔離:線程池隔離:將每個command放到單獨(dú)的線程池中,線程池滿則拒絕服務(wù)衙解;缺點(diǎn):增加了排隊(duì)阳柔、調(diào)度、上下文切換的開銷蚓峦;信號量隔離:不啟動新線程舌剂,在原有線程中執(zhí)行,沒有上下文切換的開銷暑椰,通過信號量限制并發(fā)資源數(shù)量霍转,拿不到信號量則拒絕進(jìn)入fallback,不支持異步執(zhí)行和超時一汽;
熔斷器:初始關(guān)閉狀態(tài)避消,若統(tǒng)計(jì)時間窗內(nèi)請求數(shù)超過閾值并且錯誤率超過50%則打開(請求數(shù)不夠則不處理);5秒后為半開狀態(tài)召夹,允許一個請求執(zhí)行岩喷;若成功則熔斷器關(guān)閉,失敗則打開监憎;
回退降級:command執(zhí)行拋異常纱意、熔斷器打開、線程池信號量滿枫虏、命令執(zhí)行超時都會進(jìn)入降級妇穴;快速失斉朗:直接拋異常;無聲失斕谒:返回空跑筝、靜態(tài)或緩存數(shù)據(jù);
Spring Cloud Ribbon
使用:客戶端負(fù)載均衡瞒滴,引入jar曲梗、配置參數(shù),RestTemplate加上@LoadBalanced妓忍,通過RestTemplate的方法直接通過服務(wù)名調(diào)用接口即可虏两;
核心組件:每個組件都有默認(rèn)實(shí)現(xiàn),方便開箱即用和自定義各組件功能世剖;ILoadBalancer(負(fù)載均衡器定罢,協(xié)調(diào)其他組件完成獲取和選擇服務(wù)實(shí)例的功能)、IClientConfig(客戶端配置)旁瘫、IRule(負(fù)載均衡策略)祖凫、IPing(實(shí)例檢查策略,默認(rèn)不檢查都可用)酬凳、ServerList(服務(wù)實(shí)例清單維護(hù)機(jī)制)惠况、ServerListFilter(服務(wù)實(shí)例清單過濾機(jī)制);
負(fù)載均衡策略:簡單輪詢roundRobin宁仔、加權(quán)響應(yīng)時間(根據(jù)響應(yīng)時間分配一個weight稠屠,時間越長weight越小)翎苫、隨機(jī)权埠、重試、選擇一個最小的并發(fā)請求的server拉队;
Spring Cloud Feign
使用:聲明式的 Web Service 客戶端弊知,簡化對第三方服務(wù)的調(diào)用方式,Spring Cloud Open Feign 對 Feign 進(jìn)行增強(qiáng)支持 Spring MVC粱快;使用注解@EnableFeignClients秩彤、@FeignClient(配置要調(diào)用的服務(wù)名稱和地址);通過定義一個接口即可完成本地化調(diào)用事哭,無需寫代碼漫雷;
工作原理:
主程序添加 @EnableFeignClients 注解開啟對 Feign Client 掃描,定義接口并加 @FeignClients 注解鳍咱;
掃描所有 @FeignClients 的注解的類降盹,注入 Spring IOC 容器中,當(dāng)方法被調(diào)用時谤辜,通過JDK的代理的方式蓄坏,為每個接口方法生成RequestTemplate价捧,并封裝所需的所有Http請求參數(shù);
然后由 RequestTemplate 生成 Request涡戳,把 Request 交給 Client(原生的 URLConnection或HttpClient) 去處理结蟋;
最后 Client 被封裝到 LoadBalanceClient 類,結(jié)合 Ribbon 負(fù)載均衡發(fā)起服務(wù)之間的調(diào)用渔彰;
Spring Cloud Zuul
作用:身份驗(yàn)證嵌屎、監(jiān)控、動態(tài)路由恍涂、限流過濾等宝惰;
使用:引入Jar,啟動類加上@EnableZuulProxy再沧、配置路由規(guī)則即可尼夺;
工作原理:通過一系列不同類型的過濾器實(shí)現(xiàn),包括pre過濾器(發(fā)送到原始服務(wù)器前)产园、route過濾器(發(fā)送原始服務(wù)器處理)汞斧、post過濾器(原始服務(wù)器返回后),每種都自帶多個默認(rèn)的過濾器什燕;
自定義過濾器:繼承ZuulFilter,filterType方法指定過濾類型(pre竞端、route屎即、post、error)事富、filterOrder指定過濾器優(yōu)先級技俐、shouldFilter開啟過濾、run實(shí)現(xiàn)過濾邏輯统台;
Spring Cloud Config
使用:新建工程雕擂、引入Jar、加上@EnableConfigServer贱勃,配置文件存儲參數(shù)(GIT井赌、數(shù)據(jù)庫、SVN贵扰、本地文件)仇穗,自帶Rest接口可通過瀏覽器訪問獲取對應(yīng)服務(wù)的配置文件;
自動刷新配置:引入actuator包戚绕,在使用參數(shù)的類上加@RefreshScope纹坐,手動調(diào)用refresh Rest接口刷新配置到服務(wù)中;
解決單服務(wù)自動刷新:利用Github的Webhook機(jī)制配置刷新接口地址舞丛,做到代碼更改自動調(diào)用接口耘子;
解決多服務(wù)自動刷新:引入Sprng Cloud Bus結(jié)合消息中間件做消息廣播果漾,調(diào)用一個服務(wù)的刷新接口自動通知其他服務(wù)自動調(diào)用;
Spring Cloud Sleuth
作用:調(diào)用鏈監(jiān)控工具的客戶端谷誓,集成在各個微服務(wù)上绒障,負(fù)責(zé)產(chǎn)生調(diào)用鏈監(jiān)控?cái)?shù)據(jù);
概念:Span:跨度片林,基本工作單元端盆;Trance:跟蹤,包含一系列的span费封;Annotation:標(biāo)注焕妙,包括CS(Client Sent 客戶端發(fā)送)、SR(Server Received 服務(wù)端接收)弓摘、SS(Server Sent 服務(wù)端發(fā)送)焚鹊、CR(Client Received 客戶端接收);
集成Zipkin:Sleuth負(fù)責(zé)生成調(diào)用鏈數(shù)據(jù)韧献,Zipkin對的各個服務(wù)的調(diào)用鏈數(shù)據(jù)進(jìn)行采集末患、存儲、分析和展示并提供API查詢锤窑;包含采集器璧针、
幾個概念:traceId:確定一個追蹤鏈,在某個追蹤鏈中保持不變渊啰;spanId:區(qū)域Id探橱,在一個追蹤鏈中spanId可能存在多個,每個spanId用于表明在某個服務(wù)中的身份绘证;parentId:調(diào)用自己的父spanId隧膏;
Spring Cloud?Security
作用:為構(gòu)建安全的SpringBoot應(yīng)用提供了一系列解決方案,結(jié)合Oauth2可以實(shí)現(xiàn)單點(diǎn)登錄嚷那、令牌中繼胞枕、令牌交換等功能;
OAuth2:(Open Auth)
相關(guān)名詞:Resource owner:資源擁有者魏宽,有訪問資源的賬號密碼腐泻;Resource server:資源服務(wù)器,擁有受保護(hù)資源的服務(wù)器湖员,如果請求包含正確的訪問令牌贫悄,可以訪問資源;Client:客戶端娘摔,訪問資源的客戶端窄坦;Authorization server:認(rèn)證服務(wù)器,用于認(rèn)證用戶的服務(wù)器,如果客戶端認(rèn)證通過鸭津,發(fā)放訪問資源服務(wù)器的令牌彤侍;
授權(quán)模式:Authorization Code(授權(quán)碼模式):正宗的OAuth2的授權(quán)模式,客戶端先將用戶導(dǎo)向認(rèn)證服務(wù)器逆趋,登錄后獲取授權(quán)碼盏阶,然后進(jìn)行授權(quán),最后根據(jù)授權(quán)碼獲取訪問令牌闻书;Implicit(簡化模式):和授權(quán)碼模式相比名斟,取消了獲取授權(quán)碼的過程,直接獲取訪問令牌魄眉;Resource Owner Password Credentials(密碼模式):客戶端直接向用戶獲取用戶名和密碼砰盐,之后向認(rèn)證服務(wù)器獲取訪問令牌;Client Credentials(客戶端模式):客戶端直接通過客戶端認(rèn)證(比如client_id和client_secret)從認(rèn)證服務(wù)器獲取訪問令牌坑律。
使用:@EnableAuthorizationServer岩梳、@EnableResourceServer,添加SpringSecurity配置晃择,自帶一個登陸界面冀值;
JWT:(Json Web Token),解決OAuth不攜帶用戶信息宫屠,且資源服務(wù)器無法進(jìn)行本地驗(yàn)證列疗,需要向認(rèn)證服務(wù)器發(fā)起請求的問題;
格式:特殊的token浪蹂;頭部Header(加密方式)作彤、載荷Payload(需要傳輸?shù)臄?shù)據(jù))、簽名Signature(防篡改) 3部分均用base64進(jìn)行編碼乌逐,當(dāng)中用.進(jìn)行分隔,加密密碼在服務(wù)端保存创葡;
Spring Cloud Stream
作用:實(shí)現(xiàn)消息驅(qū)動開發(fā)浙踢,抽象消息中間件,封裝統(tǒng)一的接口方法灿渴,可以輕松與各種消息中間件對接和實(shí)現(xiàn)替換洛波;
應(yīng)用模型:Source(序列化消息并發(fā)送消息到Channel中)、Sink(監(jiān)聽并從Channel中獲取消息并反序列化消息)骚露、Channel(消息通道蹬挤,通過抽象解耦具體的消息中間件)、Binder(通過不同的Binder可以實(shí)現(xiàn)與不同消息中間件的整合)棘幸;
應(yīng)用原理:提供注解@Input:創(chuàng)建一個消息輸入通道焰扳,用于消息監(jiān)聽;@Output:創(chuàng)建一個消息輸出通道,用于消息發(fā)送吨悍;@EnableBinding:建立與消息通道的綁定扫茅;提供Source、Sink接口支持開箱即用育瓜;
Spring Cloud Bus
作用:在Stream基礎(chǔ)之上再次進(jìn)行抽象封裝葫隙,使得我們可以在不用理解消息發(fā)送、監(jiān)聽等概念的基礎(chǔ)上使用消息來完成事件的業(yè)務(wù)邏輯的處理躏仇;
Spring的事件機(jī)制:ApplicationEvent定義事件恋脚、ApplicationListener<E extends ApplicationEvent>監(jiān)聽事件、ApplicationContext.publishEvent()發(fā)布事件焰手;
Bus事件機(jī)制:擴(kuò)展了Spring糟描,開啟功能掃描@RemoteApplicationEventScan、繼承RemoteApplicationEvent定義事件册倒、RemoteApplicationEventPublisher.publishEvent發(fā)布事件蚓挤、ApplicationListener監(jiān)聽事件;