第六章 Spring Boot
1.Spring Boot
介紹:相當(dāng)于模板,快速創(chuàng)建應(yīng)用,每個(gè)服務(wù)項(xiàng)目通過(guò)boot引導(dǎo)創(chuàng)建,可定制成為任意服務(wù)。
特點(diǎn):
1.快速構(gòu)建Spring應(yīng)用
2.內(nèi)嵌tomcat、jetty容器,無(wú)須單獨(dú)安裝容器
3.簡(jiǎn)化maven、gradle配置
4.注解自動(dòng)化配置Spring,實(shí)現(xiàn)零配置
5.與其他主流框架如Spring Cloud無(wú)縫集成
6.jar包直接運(yùn)行
補(bǔ)充:官網(wǎng)或者某些IDE可定制化工程,界面選擇需要的組件模塊。
2.Spring Boot與微服務(wù)之間的關(guān)系
概述:它們之間沒(méi)有直接關(guān)系。
1.Spring Boot不是微服務(wù)框架,只是個(gè)基礎(chǔ)框架,只有加入了其他服務(wù)管理的組件后才叫微服務(wù)。
2.Spring Boot是目前Spring應(yīng)用中最輕量級(jí)的,而微服務(wù)架構(gòu)要求每個(gè)應(yīng)用都必須輕量靈活,所以一定會(huì)用到Spring Boot。
p.s. Spring Cloud是微服務(wù)的實(shí)現(xiàn)方案之一,所以Spring Boot與Spring Cloud之間的關(guān)系,同上。(使用的工具是否屬于微服務(wù),可根據(jù)引用的包名判斷,是來(lái)源于cloud還是boot)
第七章 Spring Cloud
1.Spring Cloud
優(yōu)勢(shì):Spring Cloud是個(gè)龐大的工具包,與Spring一脈相承。只做集成的框架,無(wú)代碼侵入,使用簡(jiǎn)單。
特點(diǎn):
1.功能齊全。集成了很多公司優(yōu)秀的開(kāi)源框架,充分考慮并滿足開(kāi)發(fā)者的需求。
2.標(biāo)準(zhǔn)化。使用方式的標(biāo)準(zhǔn)化:maven或gradle引入依賴,注解打開(kāi)開(kāi)關(guān),簡(jiǎn)單少量配置。
3.簡(jiǎn)單方便。使用上方便。
4.按需取用。只引入需要的組件。
5.輕量。每個(gè)組件都輕量。
6.易擴(kuò)展、易維護(hù)。組件易拔插。
7.可復(fù)用性。組件間的可復(fù)用性很高(?)一個(gè)服務(wù)簡(jiǎn)單修改就能成為另一個(gè)服務(wù),不用重新開(kāi)發(fā)(?)
(以上并沒(méi)認(rèn)真整理出實(shí)質(zhì)特點(diǎn),并沒(méi)有將特點(diǎn)和由特點(diǎn)帶來(lái)的好處進(jìn)行區(qū)分。例如,使用簡(jiǎn)單應(yīng)該是由組件輕量和易拔插特性造成的結(jié)果)
2.發(fā)現(xiàn)注冊(cè)中心 Eureka
概念:分布式系統(tǒng)中,注冊(cè)中心發(fā)現(xiàn)服務(wù)、注冊(cè)服務(wù),并將所有的服務(wù)進(jìn)行統(tǒng)一管理。
說(shuō)明:
-Eureka是Netflix開(kāi)發(fā)的服務(wù)發(fā)現(xiàn)框架。
-注冊(cè)中心提供服務(wù)注冊(cè)功能,采用客戶端發(fā)現(xiàn)模式。
-服務(wù)的發(fā)現(xiàn)有2方式:服務(wù)端發(fā)現(xiàn)(服務(wù)端主動(dòng)發(fā)現(xiàn)其他服務(wù))和客戶端發(fā)現(xiàn)(服務(wù)注冊(cè)進(jìn)服務(wù)端)。
(作者認(rèn)為服務(wù)端與客戶端是發(fā)現(xiàn)與被發(fā)現(xiàn)的關(guān)系,注冊(cè)和被注冊(cè)的關(guān)系)
(個(gè)人:服務(wù)端和客戶端指的是Eureka Server和Eureka Client,Client指的是否是其他微服務(wù)項(xiàng)目?)
(個(gè)人:客戶端發(fā)現(xiàn)模式與作者描述的服務(wù)發(fā)現(xiàn)的2個(gè)方式,是兩件事情)
(個(gè)人:客戶端發(fā)現(xiàn)模式指,各個(gè)客戶端,從服務(wù)端獲取所有服務(wù)列表,所有的請(qǐng)求直接指向各個(gè)服務(wù),而非Eureka注冊(cè)中心服務(wù))
(個(gè)人:服務(wù)只有一種方式注冊(cè)到服務(wù)端,而客戶端模式指的是服務(wù)調(diào)用時(shí)候的差別?)
-Eureka儀表盤(pán)功能,頁(yè)面直觀監(jiān)控所有服務(wù)狀態(tài)。
-節(jié)點(diǎn)服務(wù)的心跳機(jī)制,動(dòng)態(tài)刷新注冊(cè)中心服務(wù)列表。
-客戶端緩存,即使Eureka Server障礙“掛掉”,各個(gè)服務(wù)依然能通過(guò)客戶端緩存的服務(wù)節(jié)點(diǎn)信息,繼續(xù)被調(diào)用。
3.網(wǎng)關(guān) Zuul
概念:網(wǎng)關(guān)為前臺(tái)提供一個(gè)統(tǒng)一的服務(wù)入口,所有后臺(tái)服務(wù)的聚合,同時(shí)實(shí)現(xiàn)鑒權(quán)、認(rèn)證、安全、路由等作用。除了Zuul還有Nginx、Node.js等實(shí)現(xiàn)方式。
方向代理:正向代理代理的是客戶端,服務(wù)端不知道客戶端是誰(shuí);反響代理代理的是服務(wù)端,客戶端不知道服務(wù)端是誰(shuí)。
說(shuō)明:Zuul是反向代理,代理了所有后臺(tái)服務(wù),前端請(qǐng)求不需要知道請(qǐng)求的服務(wù)端是誰(shuí),只需要交給Zuul,由其進(jìn)行正確的路由。
4.客戶端負(fù)載均衡 Ribbon
概念:通過(guò)采取某種策略為客戶端選擇一個(gè)服務(wù)端,從而盡可能減少對(duì)服務(wù)端的壓力。策略是核心,有輪詢、隨機(jī)、響應(yīng)時(shí)間加權(quán)等。Ribbon從Eureka獲取的服務(wù)列表,在客戶端調(diào)用服務(wù)實(shí)例時(shí)候,進(jìn)行負(fù)載均衡。
用法備注:協(xié)議:/Ribbon服務(wù)IP:端口/請(qǐng)求服務(wù)路徑,多個(gè)服務(wù)配置了相同的請(qǐng)求服務(wù)路徑,但這些完全相同的服務(wù)項(xiàng)目通過(guò)不同端口號(hào)啟動(dòng)運(yùn)行,Ribbon服務(wù)通過(guò)相同的路徑負(fù)載調(diào)用這些的項(xiàng)目。
5.斷路器 Hystrix
概念:容錯(cuò)管理工具,通過(guò)隔離、控制服務(wù)處理局部的延遲、故障,保證系統(tǒng)整體正常運(yùn)行。
電路熔斷器模式:熔斷部分反應(yīng)慢或大量超時(shí)的服務(wù),使后續(xù)請(qǐng)求無(wú)法訪問(wèn);隔一段時(shí)間后,允許部分請(qǐng)求通過(guò),若正常調(diào)用,則恢復(fù)連接。不斷熔斷與恢復(fù)。
回滾降級(jí)fallback:當(dāng)服務(wù)被熔斷后,調(diào)用實(shí)現(xiàn)設(shè)定好的回滾fallback方法。方法中可以是用戶提示或者返回備用數(shù)據(jù)等。
6.分布式配置中心 Spring Cloud Config
概念:配置管理工具,所有配置信息放在遠(yuǎn)程服務(wù)器上,集中管理集群配置。目前支持3中存儲(chǔ)方式:本地資源、SVN和GIT。
特性:中心化、版本控制、動(dòng)態(tài)更新(無(wú)需重啟)、平臺(tái)獨(dú)立、語(yǔ)言獨(dú)立。
配置演變:
1.硬編碼,配置信息與代碼耦合在一起 →
2.xml、properties、yml等配置文件中,配置信息與應(yīng)用在一處,每次修改需要重新打包發(fā)布 →
3.文件系統(tǒng),依賴操作系統(tǒng)(個(gè)人想法:獨(dú)立于項(xiàng)目外,如本地文件、數(shù)據(jù)庫(kù)、SVN、GIT等,但當(dāng)多個(gè)項(xiàng)目時(shí),各個(gè)項(xiàng)目獨(dú)自使用其開(kāi)發(fā)語(yǔ)言,分別從不同的存儲(chǔ)方式上讀取信息) →
4.云端存儲(chǔ),增加一個(gè)服務(wù)用于讀取所有配置信息,配置信息允許以任意方式存儲(chǔ)
∴使用何種配置方式,視實(shí)際情況而定
7.服務(wù)間調(diào)用 Feign
概念:Spring Cloud的一個(gè)組件,通過(guò)偽裝者Feign來(lái)實(shí)施服務(wù)間的調(diào)用。
用法(簡(jiǎn)單說(shuō)明):被調(diào)用的服務(wù)無(wú)任何修改;調(diào)用方添加@FeignClient在DAO接口上,接口類中再定義各個(gè)調(diào)用的服務(wù)方法(將被調(diào)用的服務(wù)視為當(dāng)前服務(wù)的DAO)。 p.s.Feign內(nèi)部繼承了Ribbon,即帶有負(fù)載均衡功能
8.服務(wù)追蹤及記錄 Sleuth Zipkin
Sleuth
概念:Spring Cloud實(shí)現(xiàn)的一種分布式追蹤解決方案,追蹤一個(gè)請(qǐng)求發(fā)起的過(guò)程中,所有被調(diào)用的服務(wù)及其調(diào)用關(guān)系、時(shí)長(zhǎng),便于排查問(wèn)題。
說(shuō)明:Sleuth包含trace ID和span ID。一個(gè)請(qǐng)求一個(gè)trace ID,期間被調(diào)用的服務(wù)各有其span ID。類比快遞,一張訂單一個(gè)trace ID,快遞經(jīng)各個(gè)物流站點(diǎn)各有其span ID。
用法:每個(gè)服務(wù)都需要引入pom依賴;在服務(wù)方法內(nèi)增加語(yǔ)句log.inf("xxx calling xx service");控制臺(tái)將輸出[服務(wù)名,trace ID,span ID]info。
Zipkin
概念:日志聚合工具Zipkin,為Google論文Dapper的開(kāi)源實(shí)現(xiàn),解決服務(wù)全鏈路調(diào)用的追蹤定位問(wèn)題,并可視化展示。與Sleuth共同使用,支持多種語(yǔ)言。
用法:本身是一個(gè)服務(wù)項(xiàng)目,注冊(cè)進(jìn)發(fā)現(xiàn)中心;每一個(gè)服務(wù)同Sleuth一樣都需要添加Zipkin的依賴;瀏覽器訪問(wèn)Zipkin服務(wù)地址,可視化查看調(diào)用關(guān)系及時(shí)長(zhǎng)等信息,便于查詢問(wèn)題與低效率服務(wù),達(dá)到高性能的優(yōu)化目的。
9.Spring Cloud和Dubbo的比較
Dubbo:是一個(gè)分布式服務(wù)框架,致力于提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案。阿里巴巴SOA服務(wù)化管理方案的核心框架。
說(shuō)明:Dubbo的阿里團(tuán)隊(duì)已經(jīng)解散,作者認(rèn)為是種逆淘汰(壞的淘汰好的),失敗原因是開(kāi)發(fā)者的懶惰,選擇使用方便的工具,但國(guó)內(nèi)還有很多公司選擇使用。
對(duì)比:
1.Spring Cloud是一套完整的框架,自帶體系。Dubbo只有服務(wù)管理這一塊。
2.使用上,Spring Cloud集成組件十分方便。
3.背景上,各大國(guó)際大牌高科技公司,將自家框架開(kāi)源,納入Spring Cloud中,而Dubbo勢(shì)單力薄。
第八章 相關(guān)技術(shù)和工具
1.Liquibase
概念:用于跟蹤、管理和應(yīng)用數(shù)據(jù)庫(kù)變化的開(kāi)源的數(shù)據(jù)庫(kù)重構(gòu)工具。
特性:支持多種主流數(shù)據(jù)庫(kù);支持多種格式的存儲(chǔ)數(shù)據(jù)庫(kù)腳本;支持上下文context,對(duì)應(yīng)不同環(huán)境(測(cè)試、開(kāi)發(fā)、生成);支持代碼分支和合并(如SVN版本控制);自動(dòng)生成運(yùn)行結(jié)果便于DBAreview;集群安全的數(shù)據(jù)庫(kù)升級(jí);兩個(gè)數(shù)據(jù)庫(kù)差異比較;多種運(yùn)行方式(maven、ant、command line等);提供了Eclipse等的IDE插件;等等。
2.Swagger
概念:幫助使用者設(shè)計(jì)、構(gòu)建、文檔化,使用RESTful服務(wù)API(即生成、顯示、測(cè)試RESTful服務(wù))。
說(shuō)明:使接口可視化,瀏覽器可查看并調(diào)用測(cè)試所有接口;接口文檔與代碼同步更新;接口文檔自動(dòng)化管理
3.Spring Security
服務(wù)的訪問(wèn)權(quán)限控制,類似shiro。
4.微服務(wù)架構(gòu)的通信方式
同步:實(shí)現(xiàn)方式有面向方法的SOAP、面向資源的Rest、面向接口的RPC等(基本都被REST取代) p.s.Dubbo使用RPC,當(dāng)當(dāng)開(kāi)發(fā)DubboX支持REST
REST:
概念:是一種軟件架構(gòu)風(fēng)格,是一套規(guī)范,面向資源的服務(wù)。
主要特點(diǎn):每個(gè)資源都有一個(gè)ID;連接資源在一起;使用標(biāo)準(zhǔn)方法;資源多重表達(dá);無(wú)狀態(tài)通信
優(yōu)勢(shì):易開(kāi)發(fā),易維護(hù)(較之RPC、AXIS、CXF等,REST輕量,無(wú)代碼的侵入耦合,不依賴平臺(tái)與開(kāi)發(fā)語(yǔ)言);直觀,所見(jiàn)即所得(URL易懂服務(wù)含義)
請(qǐng)求類型:GET獲取資源;PUT更新資源;DELETE刪除資源;POST創(chuàng)建資源
支持格式:JSON和XML
異步:結(jié)合消息隊(duì)列使用。優(yōu)點(diǎn):1.遇到異常將會(huì)跳過(guò),延遲處理,而同步時(shí)將在異常處阻塞,better late than never;2.吞吐能力強(qiáng),消息隊(duì)列本身是一種緩沖機(jī)制。
消息隊(duì)列產(chǎn)品:JMS、ActiveMQ、Apache Kafka、RabbitMQ
5.微服編排 Netflix Conductor
概念:意義不明(一堆比喻與Conductor的工具特點(diǎn),不涉及概念明確定義,與Conductor的作用說(shuō)明)。對(duì)所有服務(wù)進(jìn)行架構(gòu)設(shè)計(jì)?
6.管理工具 JIRA
介紹:被業(yè)界認(rèn)為最好的敏捷團(tuán)隊(duì)項(xiàng)目管理和開(kāi)發(fā)管理工具,管理需求和缺陷BUG,通過(guò)敏捷看板功能,讓團(tuán)隊(duì)專注提供迭代和增量?jī)r(jià)值。
第九章 測(cè)試相關(guān)
1.單元測(cè)試 Junit Mockito
Mock:Mock測(cè)試是單元測(cè)試的重要方法——測(cè)試過(guò)程中,對(duì)于某些不容易構(gòu)造(如HttpServletRequest)或者不容易獲取的復(fù)雜中對(duì)象(如JDBC中的ResultSet),使用一個(gè)虛擬對(duì)象(Mock對(duì)象)來(lái)創(chuàng)建,以便進(jìn)行測(cè)試的方法。Mock最大作用是單元測(cè)試的解耦。
Mockito:最好的Mock測(cè)試框架。特點(diǎn):1.可以Mock任何對(duì)象;2.使用非常簡(jiǎn)單;3.驗(yàn)證結(jié)果更加自由;4.可以驗(yàn)證行為、順序等;5.可以連續(xù)調(diào)用。
使用備注:另外學(xué)習(xí),該書(shū)寫(xiě)得凌亂。注意@Mock和@InjectMocks的區(qū)別。PodamFactory自動(dòng)補(bǔ)全實(shí)體類的數(shù)據(jù)的使用。@Before啟動(dòng)前setUp()的初始化代碼。MocMVC模擬客戶端請(qǐng)求。
2.接口測(cè)試 Swagger
說(shuō)明:接口測(cè)試也叫契約測(cè)試。在持續(xù)集成、持續(xù)交付的過(guò)程中,接口的變化難免,如何方便地通知調(diào)用方。使用Swagger,及時(shí)更新接口文檔,方便接口測(cè)試。
3.代碼質(zhì)量管理工具 Sonar
概念:是一個(gè)代碼質(zhì)量管理的開(kāi)放平臺(tái)。通過(guò)插件機(jī)制,可以集成不同的測(cè)試工具、代碼分析工具,以及持續(xù)集成工具(如Jenkins)。
特點(diǎn):
1.設(shè)置質(zhì)量門檻,直觀的看到工程質(zhì)量是否達(dá)標(biāo)。
2.能看到總體健康程度,以及專門針對(duì)從測(cè)試的覆蓋率和重復(fù)2個(gè)重要指標(biāo)。
3.代碼規(guī)則檢查工具,可檢測(cè)不符合標(biāo)準(zhǔn)的代碼和潛在的bug和缺陷。
4.其他:檢測(cè)注釋不足或過(guò)多;統(tǒng)計(jì)代碼行數(shù);整合DevOps;集中管理質(zhì)量。
使用:下載配置并啟動(dòng)Sonar,安裝插件,創(chuàng)建工程,本地項(xiàng)目pom.xml中引入配置,mvn啟動(dòng),在Sonar的工程頁(yè)面查看測(cè)試結(jié)果:質(zhì)量門檻是否Passed狀態(tài)、Bug數(shù)量、代碼異味、單元測(cè)試數(shù)量及覆蓋率、代碼重復(fù)率