聊聊分布式開發 Spring Cloud
概述
本文章只是簡單介紹了微服務開發的一些關鍵詞,如果需要知道具體實現和可以評論留言 我會及時的增加連接寫出具體實現(感覺沒人看 就沒寫具體實現)。
持續更新中。。。。。。
SpringCloud和Dubbo的區別
Dubbo的定位始終是一款基於傳輸層(TCP)的RPC框架,RPC(Remote Procedure Call)通信過程在傳輸層中完成(HTTP通信在應用層完成),
所以RPC調用方式需要服務端與客戶端之間建立Socket連接來實現二進制數據的交換
SpringCloud拋棄了Dubbo的RPC通信,采用的是基於HTTP的REST方式(Spring Cloud就真正的將整個Rest作為RPC實現技術)。
而SpringCloud的目標是微服務架構下的一站式解決方案。
服務治理和服務發現Eureka
Spring的服務治理是使用Netflix的Eureka作為服務治理的,它是我們構建Spring Cloud分布式最為核心和最為基礎的模塊,
他的作用是註冊和發現Spring Boot服務,並提供監控管理功能。
每一個微服務都可以像服務治理中心註冊多個節點(服務名稱相同,更改端口號 在啟動一次即可)
很多時候 我們也希望服務治理中心也是多個節點,這才可能滿足高可用和負載均衡的要求
解決辦法: 我們可以采用服務治理中心互相註冊來保持相互監控
服務治理中心名稱保持不變,將當前的服務治理中心節點A註冊到服務治理中心節點B,然後將服務治理中心節點B註冊到服務治理中心節點A。
Eureka心跳機制
微服務客戶端之所以可以和Eureka保持聯系,依靠的是心跳機制,也就是說你客戶端可以自己來進行心跳的配置處理。
如果最大心跳時間間隔微服務沒有進行心跳(如配置2s心跳心跳一次 最大心跳時間間隔5s),則因為該微服務已經死宕機了(Eureka會默認出現紅字提醒)
微服務之間的調用
Rabbion實際上是一個RestTemplate對象。
通過註解@LoadBalance 可以讓RestTemplete實現負載均衡,也就是通過這個restTemplete對象調用用戶微服務請求的時候,Ribbon會自動給用戶微服務實現負載均衡,請求會被分攤到微服務的各個節點上。
Feign聲明式調用。
使用restTemplete對象調用除了編寫URL,還需要註意這些參數的組裝和結果的返回操作。為了克服這些不友好,Spring Cloud提供了聲明式調用組件Feign。
Feign是一個基於接口的編程方式,開發者只需要聲明接口和配置註解,在調度接口方法時,Spring Cloud就根據配置來調度對應的REST風格的請求。
斷路器—Hystrix
在互聯網中,某一個微服務可能出現故障,為了不蔓延到其他微服務上面導致雪崩效應。斷路器會將產生故障的服務節點進行"熔斷",保持各個微服務持續可用。
處理熔斷的方式有 限流、緩存、服務降級,下面介紹服務降級。
所謂降級服務,就是當請求發生超時或者發生故障時,就會使用自身服務的其他方法進行相應。
對於Hystrix,Spring Cloud還提供了一個儀表盤進行監控短路的情況。
路由網關Zuul
網關的功能對分布式網站十分重要,首先他可以將請求路由到真是服務器的IP地址,避免直接的攻擊真實服務器
其次它也可以作為一種負載均衡的手段,使請求按照一定的算法平攤到多個節點上,減緩單點的壓力。
類似Nginx的反向代理和負載均衡
SpringCloud Stream
Spring Boot之中為了方便開發者,已經整合了消息組件,也提供了有一系列的處理支持。如果按照這樣的方式在Spring Cloud之中進行消息處理,有些人會認為比較麻煩。
所以在Spring Cloud裏面將消息整合的處理操作進行了進一步的抽象操作,實現了更加簡化的消息處理。
簡單總結:SpringCloud Stream就是實現了MDB功能,同時可以增加更加簡化方便的整合消息組件。
Docker
幾乎每個有趣的應用都至少有一個類似數據庫或者消息中間件的基礎設施服務,我們可以選擇把這些基礎設施服務安裝在自己的機器上。
不幸的是安裝起來並不容易,就比如說之前在window上安裝mysql各種問題。如果有一鍵安裝的配置就完美了,並且我們並不喜歡在自己的機器上裝滿各種亂七八糟的服務。
因此我們要用docker容器,docker將作為一個容器運行我們需要的所有的服務。(Nginx Mq Redis Mysql 等等等等)
Docker幾個重要的概念
鏡像
一般情況下,我們首先需要將程序打包到Docker鏡像中,隨後才能將鏡像交給其他人使用。
容器
當我們獲取到Docker鏡像以後,可以隨時運行該Docker鏡像,此時變會啟動一個Docker容器,該容器將運行鏡像中封裝的程序
如果我們把Docker鏡像理解為JAVA類的話,那麽Docker容器就相當於Java實列。
倉庫
集中存放鏡像文件的地方(可以理解為GitHub這樣的托管服務器)
Jenkins
我們使用Git管理代碼,使用Maven構建項目,使用Docker封裝服務,這些事情都需要通過手工方式一步一步的完成,能否讓這些步驟自動的去執行呢?
也就是說開發人員將源代碼推送到Git遠程倉庫,自動進行Maven構建,並自動將構建生成的程序包放入Docker容器中。
聊聊分布式開發 Spring Cloud