天天看點

微服務與spring cloud

了解微服務

軟體架構演進

       軟體架構的發展經曆了從單體結構、垂直架構、SOA架構到微服務架構的過程。

單體架構

微服務與spring cloud

特點:

1、所有的功能內建在一個項目工程中。

2、所有的功能打一個war包部署到伺服器。

3、應用與資料庫分開部署。

4、通過部署應用叢集和資料庫叢集來提高系統的性能。

優點:

1、項目架構簡單,前期開發成本低,周期短,小型項目的首選。

缺點:

1、全部功能內建在一個工程中,對于大型項目不易開發、擴充及維護。

2、系統性能擴充隻能通過擴充叢集結點,成本高、有瓶頸。

3、技術棧受限。

垂直架構

微服務與spring cloud

特點:

1、以單體結構規模的項目為機關進行垂直劃分項目即将一個大項目拆分成一個一個單體結構項目。

2、項目與項目之間的存在資料備援,耦合性較大,比如上圖中三個項目都存在客戶資訊。

3、項目之間的接口多為資料同步功能,如:資料庫之間的資料庫,通過網絡接口進行資料庫同步。

優點:

1、項目架構簡單,前期開發成本低,周期短,小型項目的首選。

2、通過垂直拆分,原來的單體項目不至于無限擴大。

3、不同的項目可采用不同的技術。

缺點:

1、全部功能內建在一個工程中,對于大型項目不易開發、擴充及維護。

2、系統性能擴充隻能通過擴充叢集結點,成本高、有瓶頸。

SOA架構

微服務與spring cloud

特點:

1、基于SOA的架構思想将重複公用的功能抽取為元件,以服務的方式給各各系統提供服務。

2、各各項目(系統)與服務之間采用webservice、rpc等方式進行通信。

3、ESB企業服務總線作為項目與服務之間通信的橋梁。

優點:

1、将重複的功能抽取為服務,提高開發效率,提高系統的可重用性、可維護性。

2、可以針對不同服務的特點制定叢集及優化方案。

3、采用ESB減少系統中的接口耦合。

缺點:

1、系統與服務的界限模糊,不利于開發及維護。

2、雖然使用了ESB,但是服務的接口協定不固定,種類繁多,不利于系統維護。

3、抽取的服務的粒度過大,系統與服務之間耦合性高。

  1.        微服務架構
微服務與spring cloud

特點:1.按業務劃分為獨立的應用程式,及服務單元。

           2.服務之間通過http協定互相通信。

           3.自動化部署。

           4.可以采用不同的程式設計語言和儲存技術。

           5.服務集中化管理。

           6.分布式系統。

優點:

1、服務拆分粒度更細,有利于資源重複利用,提高開發效率。

2、可以更加精準的制定每個服務的優化方案,提高系統可維護性。

3、微服務架構采用去中心化思想,服務之間采用RESTful等輕量協定通信,相比ESB更輕量。

4、适用于網際網路時代,産品疊代周期更短。

缺點:

1、微服務過多,服務治理成本高,不利于系統維護。

2、分布式系統開發的技術成本高(網路延遲,分布式事務,異步消息等),對團隊挑戰大。

3.運維挑戰,微服務構架需要維護多個程序,難度加大。

4.接口一緻性,服務間通過接口通信,當對原有接口進行修改後,互動方也需要做出協調改變釋出,保證接口的正确調用

什麼是微服務

         為适應企業的業務發展,提高軟體研發的生産力,降低軟體研發的成本,軟體架構也作了更新和優化,将一個獨立的系統拆分成若幹小的服務,每個小服務運作在不同的程序中,服務與服務之間采用http 輕量協定(比如流行的RESTful)傳輸資料,每個服務所擁有的功能具有獨立性強、高内聚的特點,這樣的設計就實作了單個服務的高内聚,服務與服務之間的低耦合效果,這一個一個的小服務就是微服務,基于這種方法設計的系統架構即微服務架構。

Spring Cloud技術棧

  1.        微服務的技術棧
微服務與spring cloud

負載均衡,網關路由:高可用、叢集部署,校驗、請求轉發、服務內建。

服務治理:服務注冊、發現。

容錯:避免雪崩。

監控跟蹤:監控資源利用、服務響應、容器資源利用情況。

消息總線:消息隊列、異步通信。

配置管理:統一配置管理。

  1.        Spring Cloud是什麼

         Spring Cloud為開發人員建構微服務架構提供了完整的解決方案,SpringCloud是若幹個架構的集合。

Spring Cloud Netfix:核心元件,對多個Netflix OSS開源套件進行整合。

Eureka:服務治理元件,包含服務注冊中心,服務注冊與發現機制。

Ribbon:用戶端負載均衡的服務調用元件。

Hystrix: 容錯管理元件,實作斷路器模式,幫助服務依賴中心出現的延遲和故障提供強大的容錯能力。

Feign:于Ribbon和Hystrix的聲明式服務調用元件。

Zuul:網關元件,提供智能路由,通路過濾等功能。

Spring Cloud Config:分布式調用中心,配置管理工具,支援使用存儲配置内容,實作應用配置的外部存儲,支援用戶端配置資訊重新整理,加密,解密配置内容。

Spring Cloud Bus:事件,消息總線,用于傳播叢集中狀态變化或事件,以觸發後續處理,比如動态重新整理配置。

Spring Cloud Stream:消息驅動的微服務,通過Redis,Rabbit或Kafka實作的消費微服務,可以通過簡單的聲明式模型來發送和接收消息。

Spring Cloud Sleuth:Spring Cloud應用的分布式跟蹤實作,可以完美整合Zipkin.

  1.        Spring Cloud技術棧

         微服務的興起出現了很多優秀的公司和技術:

         服務治理:Dubbo(阿裡巴巴)、Dubbox(當當)、Eureka(Netflix)等 。

         配置管理:Disconf(百度)、QConf(360)、Diamood(淘寶)等 。

         服務跟蹤:Hydra(京東)、Zipkin(Twitter)、Sleuth(Spring Cloud)等 。

         Spring Cloud 提供一站式的微服務架構解決方案,如下圖:

微服務與spring cloud
  1.        為什麼使用Spring Cloud

         微服務架構的優點表明它可以提高我們的生産力,但是分布式系統本身的技術成本問題給網際網路那些創業型公司不少的挑戰,阿裡、百度等巨頭所提供的微服務技術隻是解決其中某個問題,而整合封裝這些優秀的技術恐怕是Spring最擅長的領域了,Spring Cloud也正因為此而誕生。

         使用Spring Cloud來建構微服務架構可以省去你整合各家技術的成本,Spring Cloud為我們建構微服務架構提供了一站式的解決方案,就好比當初Spring誕生是為解決EJB企業應用開發的衆多問題而提供的一站式輕量級企業應用開發解決方案一樣,随着使用Spring Cloud公司數量的增加,相信微服務将被Spring Cloud一統江湖。

  1.        Netflix公司介紹

         Spring Cloud的很多技術來源于Netflix(https://netflix.github.io/),摘自百度百科的資訊如下:

微服務與spring cloud
  1.         服務治理:Spring Cloud Eureka

什麼是服務治理

         微服務架構的缺點中最主要的就是由于微服務數量衆多導緻維護成本巨大,服務治理為解決此問題而産生的。服務治理的作用是讓維護人員從人工維護中解放出來,由服務自維護,微服務作為服務提供方主動向服務治理中心注冊,服務的消費方通過服務治理中心查詢需要的服務并進行調用。

如下圖:

微服務與spring cloud

Spring Cloud Eureka

         Spring Cloud Eureka 是對Netflix公司的Eureka的二次封裝,它實作了服務治理的功能,Spring Cloud Eureka提供服務端與用戶端,服務端即是服務注冊中心,用戶端完成服務的注冊與發現。服務端和用戶端均采用Java語言編寫(Eureka支援多語言)。

如下圖顯示了Eureka Server與Eureka Client的關系:

微服務與spring cloud

架構

微服務與spring cloud
  1.        流程圖
微服務與spring cloud
  1.        開發并部署Eureka Server

建立eureka server

  1.   添加依賴
  2. 微服務與spring cloud

2.  配置application.yml

微服務與spring cloud

3、在啟動類上添加@EnableEurekaServer注解。

微服務與spring cloud

4.在浏覽器中輸入http://localhost:8761 就會顯示:

微服務與spring cloud

  1.        服務注冊

服務注冊完成将使用者資訊服務注冊到Eureka Server中,供服務消費方查詢。

  1.   添加依賴
  2. 微服務與spring cloud

2、配置application.yml

#應用(服務)名稱

spring.application.name=hello-service 

server.port=8762

#注冊中心位址

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

3.在啟動類上添加EnbleDiscoverClient注解

@EnableDiscoveryClient 

@SpringBootApplication

public class HelloApplication {

    public static void main(String[] args) {

    new SpringApplicationBuilder(HelloApplication.class).web(true).run(args);

    }

}

4.在浏覽器中輸入http://localhost:8761 就會顯示:

微服務與spring cloud
  1.         負載均衡:Spring Cloud Ribbon

什麼是負載均衡

         負載均衡是微服務架構中必須使用的技術,通過負載均衡來實作系統的高可用、叢集擴容等功能。負載均衡可通過硬體裝置及軟體來實作,硬體比如:F5、Array等 ,軟體比如:LVS、Nginx等 。

如下圖是負載均衡的架構圖:

微服務與spring cloud

         使用者請求先到達負載均衡器(也相當于一個服務),負載均衡器根據負載均衡算法将請求轉發到微服務。負載均衡算法有:輪訓、随機、權重輪訓、權重随機、位址哈希等方法,負載均衡器維護一份服務清單,根據負載均衡算法将請求轉發到相應的微服務上,是以負載均衡可以為微服務叢集分擔請求,降低系統的壓力。

Spring Cloud Ribbon

         Spring Cloud Ribbon是基于用戶端的負載均衡工具,負載均衡分為服務端負載均衡和用戶端負載均衡,3.1小節的圖形指的是服務端負載均衡,用戶端負載均衡與服務端負載均衡的差別在于用戶端要維護一份服務清單,Ribbon從Eureka Server擷取服務清單,Ribbon根據負載均衡算法直接請求到具體的微服務,中間省去了負載均衡服務。

如下圖是Ribbon負載均衡的流程圖:

微服務與spring cloud

1、在消費微服務中使用Ribbon實作負載均衡,Ribbon先從Eureka Server中擷取服務清單。

2、Ribbon根據負載均衡的算法進行負載均衡,将請求轉發到其它微服務。

微服務與spring cloud
  1.        開發單點登入服務

單點登入服務提供使用者登入、使用者退出等功能。

單點登入服務需要調用使用者資訊服務查詢使用者資訊。

單點登入服務采用Spring Boot、SpringMVC開發。

  1.        服務發現

單點登入服務需要從EurekaServer查詢使用者資訊服務。

1、配置Eureka Server服務位址。

2、在啟動類中添加注解@EnableDiscoveryClient

微服務與spring cloud
  1.        Ribbon程式設計

1、定義RestTemplate對象

2、配置 @LoadBalanced

3、設定負載均衡算法。

4、使用RestTemplate調用微服務。

微服務與spring cloud
  1.         容錯保護:Spring Cloud Hystrix

什麼是容錯保護

         在微服務構架中,将系統拆分成很多的服務單元,各單元之間通過服務注冊與訂閱的方式互相依賴,由于每個單元都運作在不同的程序中,依賴通過遠端調用方式執行,這樣可能因為網絡原因或依賴服務自身的問題出現調用故障或延遲,而這些問題直接導緻了調用方的對外服務也出現延遲,若此時調用方的請求不斷增加,最後就會因為等待出現故障的依賴方相應形成任務積壓,最終導緻自身服務癱瘓。

         斷路器模式的作用就是當某個服務單元發生故障,通過斷路器的故障監控,向調用方傳回一個錯誤響應,而不是長時間的等待,這樣就不會使線程因調用故障服務被長時間占用不釋放,避免了故障在分布式系統上蔓延。

容錯保護簡單來說就是微服務在執行過程中出現錯誤并從錯誤中恢複的能力。微服務容錯性不好很容易導緻雪崩效應,什麼是雪崩效應?摘自百度百科中的定義:

         微服務的雪崩效應表現在服務與服務之間調用,當其中一個服務無法提供服務可能導緻其它服務也死掉,比如:單點登入服務調用使用者資訊服務查詢使用者資訊,由于使用者資訊服務無法提供服務導緻單點登入服務一直等待,進而導緻使用者登入、使用者退出功能無法使用,像這樣由一個服務所引起的一連串的多個服務無法提供服務即是微服務的雪崩效應。

Spring Cloud Hystrix

         Spring Cloud Hystrix 是基于Netflix的開源架構Hystrix的整合,它實作了斷路器、線程隔離、信号隔離等容錯功能。

下圖是Hystrix斷路器示意圖:

微服務與spring cloud

1.要在服務消費方添加hystrix。

微服務與spring cloud

2、使用Hystrix實作容錯。

微服務與spring cloud

3.              在Spring boot的啟動類上添加@enableHystrix注解

  1.         聲明式服務調用: Spring Cloud Feign     

Feign 

Feign在RestTemplate的基礎上對其封裝,由它來幫助我們定義和實作依賴服務接口的定義。Spring Cloud Feign 基于Netflix Feign 實作的,整理Spring Cloud Ribbon 與 Spring Cloud Hystrix,并且實作了聲明式的Web服務用戶端定義方式。

1. 添加依賴

微服務與spring cloud

2. 在啟動類添加@EnableFeignClients開啟Spring Cloud Feign的支援

微服務與spring cloud

3.application.yml檔案配置如下

  spring:

  application:

    name: movie-service

server:

  port: 9092

eureka:

  client:

    healthcheck:

      enabled: true

    serviceUrl:

      defaultZone: http://localhost:1111/eureka

4.USER-SERVICE接口

微服務與spring cloud

5.UserFeignClient接口

在定義各參數綁定時,@RequestParam和@RequestHeader等可以指定參數名稱的注解,他們的value千萬不能省略,在SpringMVC中這些注解會根據參數名作為預設值但在Feign中必須顯示指定,否則會抛出異常

微服務與spring cloud

6. 在Controller中添加測試接口進行測試

微服務與spring cloud

  7.結果

微服務與spring cloud
  1.      服務網關:Spring Cloud zuul

什麼是服務網關

         服務網關是在微服務前邊設定一道屏障,請求先到服務網關,網關會對請求進行過慮、校驗、路由等處理。有了服務網關可以提高微服務的安全性,校驗不通過的請求将被拒絕通路。

         前邊介紹的Ribbon用戶端負載均衡技術可以不用經過網關,因為通常使用Ribbon完成微服務與微服務之間的内部調用,而對那些對外提供服務的微服務,比如:使用者登入、送出訂單等,則必須經過網關來保證微服務的安全。

Spring Cloud Zuul

         Spring Cloud Zuul是整合Netflix公司的Zuul開源項目實作的微服務網關,它實作了請求路由、負載均衡、校驗過慮等 功能。

微服務與spring cloud
微服務與spring cloud

1、部署使用者資訊服務A、單點登入服務B,每個服務部署至少兩台機器。

2、将使用者資訊服務A、單點登入服務B注冊到EurekaServer中。

3、開發并部署zuul。

微服務與spring cloud

4、在zuul中配置路由

微服務與spring cloud

5、可以定義filter,需要內建zuul提供filter類,進行校驗攔截。

6、在spring boot的啟動類中配置注解

微服務與spring cloud

7、根據上邊的路由配置通路微服務。

微服務與spring cloud

凡是以/sso/打頭的請求,路由到 itcast-microservice-sso微服務。

微服務與spring cloud

總結

zuul網關,不僅提供對外服務通路 ,微服務也可以通過zuul請求其它的微服務。

  1.      分布式配置中心:Spring Cloud Config

Spring Cloud Config

Spring Cloud Config 用來為分布式系統中的基礎設施和微服務應用 提供集中化的外部配置支援,分為用戶端和服務端兩部分。服務端稱為配置中心,它是一個獨立的微服務應用,用來連接配接配置倉庫,并為用戶端提供配置資訊,加密,解密等資訊的通路接口。用戶端是微服務構架中的各個微服務應用或基礎設施,通過指定的配置中心來管理應用資源與業務相關的配置内容,并在啟動時從配置中心擷取和加載配置資訊。由于Spring Cloud Config實作的配置中心預設采用Git來存儲配置資訊,是以使用Spring Cloud Config建構的配置伺服器,天然就支援微服務應用配置資訊的版本管理,并且可以通過Git用戶端工具友善管理和通路配置内容。

微服務與spring cloud

建構服務端Config Server

 1.添加依賴

微服務與spring cloud

2. 在程式的入口Application類加上@EnableConfigServer注解開啟配置伺服器的功能

微服務與spring cloud

3. application.properties檔案配置以下:

spring.application.name=config-server

server.port=8888

spring.cloud.config.server.git.uri=https://github.com/xjmxjm/SpringcloudConfig/

spring.cloud.config.server.git.searchPaths=respo

spring.cloud.config.label=master

spring.cloud.config.server.git.username=username

spring.cloud.config.server.git.password=password

  • spring.cloud.config.server.git.uri:配置git倉庫位址
  • spring.cloud.config.server.git.searchPaths:配置倉庫路徑
  • spring.cloud.config.label:配置倉庫的分支
  • spring.cloud.config.server.git.username:通路git倉庫的使用者名
  • spring.cloud.config.server.git.password:通路git倉庫的使用者密碼

如果Git倉庫為公開倉庫,可以不填寫使用者名和密碼,如果是私有倉庫需要填寫,本例子是公開倉庫,放心使用。

遠端倉庫https://github.com/xjmxjm/SpringcloudConfig/ 中有個檔案config-client-dev.properties檔案中有一個屬性:

微服務與spring cloud

    啟動程式:通路http://localhost:8888/foo/dev

證明配置服務中心可以從遠端程式擷取配置資訊。

http請求位址和資源檔案映射如下:

/{application}/{profile}[/{label}]

/{application}-{profile}.yml

/{label}/{application}-{profile}.yml

/{application}-{profile}.properties

/{label}/{application}-{profile}.properties

建構用戶端config client

  1.      添加依賴
微服務與spring cloud

2其配置檔案bootstrap.properties:

微服務與spring cloud
  • spring.cloud.config.label 指明遠端倉庫的分支
  • spring.cloud.config.profile
    • dev開發環境配置檔案
    • test測試環境
    • pro正式環境
  • spring.cloud.config.uri= http://localhost:8888/ 指明配置服務中心的網址。

3.程式的入口類,寫一個API接口“/hi”,傳回從配置中心讀取的foo變量的值

微服務與spring cloud

打開網址通路:http://localhost:8881/hi,網頁顯示

這就說明,config-client從config-server擷取了foo的屬性,而config-server是從git倉庫讀取的。

微服務與spring cloud

繼續閱讀