Spring Cloud 我的心得 理論

 

1.分佈式項目爲何會崛起 有那些優點 什麼是分佈式項目前端

在沒有分佈式項目以前,一個系統全部的功能可能都是在一個項目中建立的,拿商城項目來講明
商城項目組成部分(基礎數據,用戶,商品,訂單,支付,一些輔助的排程/腳本服務)java

在沒有分佈式項目以前,這些可能都是寫在同一個項目中,而後把項目放到不一樣的服務器 A/B/C服務器。最前端有一個NGINX服務器,負責作負載均衡,客戶端請求的是Nginx服務器,由Nginx把請求轉發到A/B/C服務器,來減輕 在高併發的狀況下,單服務器的壓力。nginx

1.1什麼是分佈式項目,咱們先來看下 傳統項目和分佈式項目的結構圖git

傳統項目程序員

 

 分佈式項目spring

 

從項目結構圖中能夠看出,傳統項目全部模塊都建立在一個項目中的,而分佈式項目是按照不一樣的模塊建立不一樣的項目,模塊和模塊之間的耦合度獲得瞭解耦,數據庫

1.DB風險tomcat

項目發佈也不須要整個項目發佈,只須要發佈對應的模塊項目便可,分了模塊數據庫也獲得了劃分,假設那一天 某個程序員不當心把數據庫給刪除了,在傳統項目中全部模塊都是放在同一個數據庫的,這樣就會致使整個系統的DB都沒了,而分佈式項目項目劃分了模塊,數據庫也獲得了切割,即便刪除也是刪除一個模塊的數據庫,雖然這樣也是災難性的操做,不過這樣也下降了風險。服務器

2.發佈風險併發

項目發佈若是設計到修改文件過多,是須要真個項目發佈,假設須要發佈用戶模塊的一個bug,而小A在修復訂單模塊bug的時候,沒測試就提交了代碼,這個時候發佈就會把bug發佈到正式環境,從而影響到客戶使用,可能你會說不是有人會check代碼嗎?發佈前都要作文件檢測的,是人都會有犯錯和疏漏,咱們要在源頭把風險下降到最低。

說道這裏就想起來最近阿里的一件事情,一個實習生把阿里雲的一個xx刪了,致使阿里雲系統出現故障。

 

3.項目解耦&下降訪問併發量

傳統項目,當訪問訂單接口的時候,仍是會訪問整個系統所在的tomcat服務。用數據來講 好比有一萬個用戶訪問訂單模塊,這時候併發是一萬,對於tomcat來講是頗有壓力,即便前端有Nginx作了負載,不過有的時候仍是會存在丟失數據的狀況。若是這個時候還有其餘模塊的訪問量,那麼對於tomcat的壓力就更大了。

 

http://www.javashuo.com/article/p-wqencyrn-mo.html

大禹治水分而治之,分佈式項目也是這樣道理。

不一樣的模塊放放在不一樣的tomcat裏面,即便訂單模塊服務掛了,也不會影響到登陸和用戶模塊的訪問。

 

 

 

Spring Cloud 流程圖

我的理解的 spring cloud 流程,若有不對 歡迎留言...

// 註冊中心管理器
    private java.util.List<String> service = new ArrayList<String>();

    public static void main(String[] args) {
        // 客戶端請求
        zuul("/user/userInfo/getInfoById");
    }

    /**
     * zuul 路由/網關 接受客戶端請求 轉發到對應的服務
     **/
    public static void zuul(String url) {
        // 1.匹配url 定位serviceId 【equals只是一個象徵性的假設 匹配規則是xxx開頭的url 轉發到xxx服務】
        if (url.equals("/user/**")) {
            // 轉發到【用戶服務】 serviceId 【serviceId對應一個項目 每一個項目都有一個serviceId】
        }
        if (url.equals("/order/**")) {
            // 轉發到【訂單服務】 serviceId 【serviceId對應一個項目 每一個項目都有一個serviceId】
        }
        if (url.equals("/basedata/**")) {
            // 轉發到【基礎數據服務】 serviceId 【serviceId對應一個項目 每一個項目都有一個serviceId】
        }
        // ...不少個if判斷

    }

    /**
     * serviceId 服務ID/名稱 當項目啓動的時候 會把服務註冊到註冊中心【eureka】 註冊中心統一管理服務
     **/
    public void setService(String serviceId) {
        service.add(serviceId);
    }
    
    //zuul 等同於nginx的 根據URL匹配不一樣的服務
    /*http {
        server {
                server_name example.com;
     
                location /mail/ {
                        proxy_pass http://example.com:protmail/;
                }
     
                location /com/ {
                        proxy_pass http://example.com:portcom/main/;
                }
     
                location / {
                        proxy_pass http://example.com:portdefault;
                }
        }
    }*/

 

2.介紹

spring cloud核心組成部分

1.路由 Zuul

 

簡介

 

Zuul是Netflix基於JVM的路由器和服務器端負載均衡器。最經常使用的場景是替換Nginx反向代理後臺微服務供前端UI訪問。

 

Zuul使用Ribbon來定位一個經過發現轉發的實例,全部請求都以hystrix命令執行,因此故障將顯示在Hystrix指標中。

 

注:Zuul不包括髮現客戶端,所以對於基於服務ID的路由,須要在類路徑中提供其中一個路由

 

Zuul的能力:

智能路由:經過與Eureka整合,將自身註冊到服務中心,能夠獲到全部其餘微服務實例信息。Zuul默認經過以服務名做爲ContextPath來建立路由映射,能夠知足大多數狀況須要,特殊路由能夠經過配置來實現,在Zuul默認路由規則小節有詳細描述。

 

2.註冊中心

收集袋,全部的服務進行統一收集,至關於放到同一個代碼塊,代碼塊裏面的變量是能夠直接拿到的。

 

3.配置中心

全部配置不配置在本地,而是配置在GIT裏面,從GIT獲取配置信息。

也能夠把配置中心搞錯一個集羣,在併發獲取配置文件的時候,能夠減輕單服務的壓力。

配置文件放本地和放到git上,除了方便管理還有一點是 在使用@value註解獲取配置信息的時候,若是配置文件中信息發生變化,須要重啓服務,這個通常是不可取的。

簡單的來講 spring cloud 配置中心 解耦了@value註解對配置文件讀取的操做。

 

4.斷路器監控(Hystrix)

 當程序訪問接口,接口所依賴的服務出現故障,會致使訪問時間過長,線程消耗,堵塞 系統宕機。

用Hystrix能夠很好的避開這一點。

相關文章
相關標籤/搜索