1. 程式人生 > >聊聊分散式開發 Spring Cloud

聊聊分散式開發 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容器中。