小時候出去春游嘹锁,大家都會分工合作葫录,有人帶水,有人帶主食领猾,有人帶零食米同,有人帶工具等等。
小朋友多了管理就是個麻煩事了摔竿,有時候一個老師還管理不過來面粮。
微服務也是這么一個概念,每個服務負責自己的事拯坟;但是當服務多了但金,協(xié)調服務就是個麻煩事了。
SpringCloud就是為了解決這一問題而誕生的郁季。
注冊中心
誰來了冷溃,誰不在,他都知道梦裂;他會給你一個通信錄似枕,這樣你就可以聯(lián)系到所有人。
服務注冊中?本質上是為了解耦服務提供者和服務消費者年柠。
消費者和提供者的角色是互相轉換的凿歼,實際上下圖的消費者和提供者都是微服務。當他成為消費者要找服務的時候,他能知道服務的地址答憔。
主流的:Zookeeper味赃,Eureka,Nacos虐拓,其他沒用過的就不講了心俗。
Zookeeper:依靠監(jiān)聽實現(xiàn);Zookeeper本質就是?存儲 + 監(jiān)聽通知蓉驹;依靠消費端創(chuàng)建節(jié)點來監(jiān)聽注冊進來的服務城榛。
Eureka:依靠心跳包實現(xiàn);需要有Eureka Server微服務模塊态兴,其他的微服務作為(提供者和消費者都是客戶端)Eureka Client狠持,啟動時去注冊,Eureka Client會向Eureka Server發(fā)送心跳包瞻润,續(xù)約的同時拉取注冊中心信息(默認30s喘垂,超過90s沒續(xù)約,將會剔除服務)敢订;Eureka已經不更新了王污。是Netflix的產品罢吃。
Nacos:原理和Eureka差不多也是通過心跳包楚午,但是多了配置中心功能,操作更簡單尿招;目前最好用的矾柜,注冊中心+配置中心的功能。
除了單個的服務就谜,還有集群服務怪蔑,我覺得主要還是為了集群服務,單個服務可以直接寫配置文件里丧荐。
網(wǎng)關
你只需要問他你們組誰帶了鍋缆瓣?他就會把那個帶鍋的小朋友找出來;和注冊中心不一樣虹统,網(wǎng)關會幫你找到弓坞,而不是自己去找。
網(wǎng)關和負載均衡一樣也是反向代理车荔,網(wǎng)關是按功能路由渡冻,負載均衡是按性能分發(fā)。如果只是路由的話自己寫都行忧便,SpringCloud插件功能一定不止這點族吻。
Spring Cloud GateWay它基于Spring5.0+SpringBoot2.0+WebFlux,除了路由還能攔截。
看上去和注冊中心差不多超歌,都是找服務的砍艾;由于網(wǎng)關的反向代理,可以使用同一個端口去訪問整個微服務巍举。感覺像nginx就能做的事辐董;nginx是在服務器上的,網(wǎng)關是在項目里的禀综,如果又多個項目要部署在同一個服務器上nginx就不夠用了简烘,而且也不好修改。
還有過濾器功能定枷,
網(wǎng)關要不要依靠注冊中心工作孤澎?
路由到集群又是怎么工作的?
網(wǎng)關項目為什么要和主項目平級欠窒?因為gateway和web包沖突覆旭,需要引用webflux;如果有沖突要剔除web包岖妄。
分布式配置中心
有些東西大家都要用的型将,就交給他拿。nacos包含配置中心荐虐。點擊發(fā)布可以直接刷新配置七兜。
消息總線
通知所有微服務,像廣播一樣福扬。
除了用來刷新配置還能干嘛腕铸?網(wǎng)上大多也是拿來刷新spring cloud config 配置中心,但是現(xiàn)在用nacos铛碑,自帶配置中心狠裹。
發(fā)現(xiàn)其他用處再更新//todo
消息驅動總線
消息隊列專家,無差別的使用任何消息隊列汽烦。
Spring Cloud Stream 消息驅動組件幫助我們更快速涛菠,更?便,更友好的去構建消息驅動微服務的
就像Hibernate屏蔽掉了具體數(shù)據(jù)庫的差異(Mysql和Oracle)撇吞,Spring Cloud Stream也屏蔽掉了消息隊列的差異(RabbitMQ和Kafka)俗冻。
使用消息隊列可以優(yōu)化性能,創(chuàng)建一個緩沖區(qū)梢夯,服務器處理不了的消息就可以先去隊列排隊言疗,而不至于直接卡死,等服務器空閑了颂砸,再去隊列拉取消息噪奄;就是常說的削峰填谷死姚。
熔斷器
負責安全,將受傷的小朋友帶到安全的地方勤篮。
SpringCloud兩個熔斷器插件比較
Hystrix(豪豬):
1)??搭建監(jiān)控平臺 dashboard
2)沒有提供UI界?進?服務熔斷都毒、服務降級等配置(?是寫代碼,?侵了我們源程序環(huán)境)
Sentinel(哨兵):
1)獨?可部署Dashboard/控制臺組件
2)減少代碼開發(fā)碰缔,通過UI界?配置即可完成細粒度控制(?動投遞微服務)
Hystrix需要自己搭建項目账劲,Sentinel只需要引入Jar包,還自帶UI金抡;方便很多瀑焦。
sentinel怎么使用?
java -jar sentinel-dashboard-(版本號).jar &
使用8080端口訪問
賬號密碼都是sentinel
項目需要引入sentinel包梗肝,在網(wǎng)關模塊引入就可以管理所有連接了榛瓮。
配置文件加上,spring-cloud標簽下
界面巫击,需要接口被調用過才會出現(xiàn)
QPS是什么禀晓?
QPS:(每秒鐘請求數(shù)量)當調?該資源的QPS達到閾值時進?限流
負載均衡
把工作平均分配。主要就那幾種分配方式坝锰。nginx也可以做負載均衡粹懒,還有其他的很多工具都可以,為什么要用Ribbon顷级?
應該是歷史原因:之前Eureka和Ribbon是配套使用凫乖。
Ribbon利?從Eureka中讀取到服務信息,在調?服務提供者提供的服務時愕把,會根據(jù)?定的算法進?負載拣凹。
Ribbon和Nginx處理負責均衡的方式不同:
Nginx是服務端選擇一個好的服務器給你連接,Ribbon則是在客戶端選好服務器在連接恨豁。
一個負載均衡算法在服務端執(zhí)行,一個負載均衡算法在客戶端執(zhí)行爬迟。
Ribbon的幾種策略
RoundRobinRule:輪詢策略
默認超過10次獲取到的server都不可?橘蜜,會返回?個空的server
RandomRule:隨機策略
如果隨機到的server為null或者不可?的話,會while不停的循環(huán)選取
RetryRule:重試策略
?定時限內循環(huán)重試付呕。默認繼承RoundRobinRule计福,也?持?定義注?,RetryRule會在每次選取之后徽职,對選舉的server進?判斷象颖,是否為null,是否alive姆钉,并且在500ms內會不停的選取判斷说订。?RoundRobinRule失效的策略是超過10次抄瓦,RandomRule是沒有失效時間的概念,只要serverList沒都掛陶冷。
BestAvailableRule:最?連接數(shù)策略
遍歷serverList钙姊,選取出可?的且連接數(shù)最?的?個server。該算法??有?個LoadBalancerStats的成員變量埂伦,會存儲所有server的運?狀況和連
接數(shù)煞额。如果選取到的server為null,那么會調?RoundRobinRule重新選取沾谜。1(1) 2(1)3(1)
AvailabilityFilteringRule:可?過濾策略
擴展了輪詢策略膊毁,會先通過默認的輪詢選取?個server,再去判斷該server是否超時可?基跑,當前連接數(shù)是否超限媚媒,都成功再返回。
ZoneAvoidanceRule:區(qū)域權衡策略(默認策略)
擴展了輪詢策略涩僻,繼承了2個過濾器:ZoneAvoidancePredicate和AvailabilityPredicate缭召,除了過濾超時和鏈接數(shù)過多的server,還會過濾掉不符合要求的zone區(qū)域??的所有節(jié)點逆日,AWS --ZONE 在?個區(qū)域/機房內的服務實例中輪詢
遠程調用
小朋友直接傳話的技術嵌巷。feign和dubbo就像手機和對講機一樣。
模塊和模塊之間的方法調用室抽。
Feign:是Netflflix開發(fā)的?個輕量級RESTful的HTTP服務客戶端(?它來發(fā)起請求搪哪,遠程調?的),是以Java接?注解的?式調?Http請求坪圾,?不?像Java中通過封裝HTTP請求報?的?式直接調?晓折,F(xiàn)eign被?泛應?在Spring Cloud 的解決?案中。
Dubbo:是基于RPC的兽泄,性能上就比基于HTTP的Feign快漓概。不需要通過controller層來調用。私人定制和模板貨(RPC和Http的區(qū)別)
//todo? dubbo原理解析
通過中間模塊創(chuàng)建接口病梢,然后實現(xiàn)模塊和引用模塊都調用中間模塊的接口胃珍;實現(xiàn)模塊的@Service需要使用dubbo的注解;controller調用需要用@Reference注解蜓陌,而不是@Autowired觅彰。
鏈路追蹤
記錄大家工作,是誰犯錯了钮热,他都清楚填抬。
說白了就是記錄日志和分析日志。
Sleuth +Zipkin
Spring Cloud Sleuth (追蹤服務框架)可以追蹤服務之間的調?隧期,Sleuth可以記錄?個服務請求經過哪些服務飒责、服務處理時?等赘娄,根據(jù)這些,我們能夠理清各微服務間的調?關系及進?問題追蹤分析读拆。
Trace(蹤跡):一次請求
Trace ID:一次請求的id擅憔,整個鏈的id
Span(跨度) ID:請求到達模塊時的id,每次調用內部接口生成一個id
通過span的時間戳判斷調用延遲檐晕。span之間的時間戳相減暑诸。
不會全部采集分析,抽樣采集辟灰,可以配置比例个榕。全部分析太消耗性能了。
Zipkin(記錄日志)
端口9411芥喇,可以直接查看西采。
包括Zipkin Server和 Zipkin Client兩部分,Zipkin Server是?個單獨的服務继控,Zipkin Client就是具體的微服務械馆。
保存在數(shù)據(jù)庫中。
一個分析一個記錄武通。
具體使用//tido
統(tǒng)一認證
工牌霹崎,證明你可以和小朋友說話。
Spring Cloud OAuth2 +JWT
OAuth(開放授權)是?個開放協(xié)議/標準冶忱,允許?戶授權第三?應?訪問他們存儲在另外的服務提供者上的信息尾菇,?不需要將?戶名和密碼提供給第三?應?或分享他們數(shù)據(jù)的所有內容。
JWT是一種加密規(guī)則囚枪,將token和驗證信息加密后一起發(fā)送派诬,然后直接在微服務模塊自行驗證;而不需要拿到token之后再次調用OAuth的方法來驗證链沼。