1 理解微服務
1.1 軟件架構演進
軟件架構的發展經歷了從單體結構、垂直架構、SOA架構到微服務架構的過程。
1.1.1 單體架構

特點:
1、所有的功能集成在一個項目工程中。
2、所有的功能打一個war包部署到服務器。
3、應用與數據庫分開部署。
4、通過部署應用集群和數據庫集群來提高系統的性能。
優點:
1、項目架構簡單,前期開發成本低,周期短,小型項目的首選。
缺點:
1、全部功能集成在一個工程中,對於大型項目不易開發、擴展及維護。
2、系統性能擴展只能通過擴展集群結點,成本高、有瓶頸。
3、技術棧受限。
1.1.2 垂直架構

特點:
1、以單體結構規模的項目為單位進行垂直划分項目即將一個大項目拆分成一個一個單體結構項目。
2、項目與項目之間的存在數據冗余,耦合性較大,比如上圖中三個項目都存在客戶信息。
3、項目之間的接口多為數據同步功能,如:數據庫之間的數據庫,通過網絡接口進行數據庫同步。
優點:
1、項目架構簡單,前期開發成本低,周期短,小型項目的首選。
2、通過垂直拆分,原來的單體項目不至於無限擴大。
3、不同的項目可采用不同的技術。
缺點:
1、全部功能集成在一個工程中,對於大型項目不易開發、擴展及維護。
2、系統性能擴展只能通過擴展集群結點,成本高、有瓶頸。
1.1.3 SOA架構

特點:
1、基於SOA的架構思想將重復公用的功能抽取為組件,以服務的方式給各各系統提供服務。
2、各各項目(系統)與服務之間采用webservice、rpc等方式進行通信。
3、ESB企業服務總線作為項目與服務之間通信的橋梁。
優點:
1、將重復的功能抽取為服務,提高開發效率,提高系統的可重用性、可維護性。
2、可以針對不同服務的特點制定集群及優化方案。
3、采用ESB減少系統中的接口耦合。
缺點:
1、系統與服務的界限模糊,不利於開發及維護。
2、雖然使用了ESB,但是服務的接口協議不固定,種類繁多,不利於系統維護。
3、抽取的服務的粒度過大,系統與服務之間耦合性高。
1.1.1 微服務架構

特點:
1、將系統服務層完全獨立出來,並將服務層抽取為一個一個的微服務。
2、微服務遵循單一原則。
3、微服務之間采用RESTful等輕量協議傳輸。
優點:
1、服務拆分粒度更細,有利於資源重復利用,提高開發效率。
2、可以更加精准的制定每個服務的優化方案,提高系統可維護性。
3、微服務架構采用去中心化思想,服務之間采用RESTful等輕量協議通信,相比ESB更輕量。
4、適用於互聯網時代,產品迭代周期更短。
缺點:
1、微服務過多,服務治理成本高,不利於系統維護。
2、分布式系統開發的技術成本高(容錯、分布式事務等),對團隊挑戰大。
1.2 什么是微服務
為適應企業的業務發展,提高軟件研發的生產力,降低軟件研發的成本,軟件架構也作了升級和優化,將一個獨立的系統拆分成若干小的服務,每個小服務運行在不同的進程中,服務與服務之間采用http 輕量協議(比如流行的RESTful)傳輸數據,每個服務所擁有的功能具有獨立性強、高內聚的特點,這樣的設計就實現了單個服務的高內聚,服務與服務之間的低耦合效果,這一個一個的小服務就是微服務,基於這種方法設計的系統架構即微服務架構。
1.3 Spring Cloud技術棧
1.3.1 微服務的技術棧
負載均衡,網關路由:高可用、集群部署,校驗、請求轉發、服務集成。
服務治理:服務注冊、發現。
容錯:避免雪崩。
監控跟蹤:監控資源利用、服務響應、容器資源利用情況。
消息總線:消息隊列、異步通信。
配置管理:統一配置管理。
1.3.2 Spring Cloud是什么
Spring Cloud為開發人員構建微服務架構提供了完整的解決方案,SpringCloud是若干個框架的集合,它包括spring-cloud-config、spring-cloud-bus等近20個子項目,它提供了服務治理、服務網關、智能路由、負載均衡、斷路器、監控跟蹤、分布式消息隊列、配置管理等領域的解決方案。
1.3.3 Spring Cloud技術棧
微服務的興起出現了很多優秀的公司和技術:
服務治理:Dubbo(阿里巴巴)、Dubbox(當當)、Eureka(Netflix)等 。
配置管理:Disconf(百度)、QConf(360)、Diamood(淘寶)等 。
服務跟蹤:Hydra(京東)、Zipkin(Twitter)、Sleuth(Spring Cloud)等 。
Spring Cloud 提供一站式的微服務架構解決方案,如下圖:

1.3.4 為什么使用Spring Cloud
微服務架構的優點表明它可以提高我們的生產力,但是分布式系統本身的技術成本問題給互聯網那些創業型公司不少的挑戰,阿里、百度等巨頭所提供的微服務技術只是解決其中某個問題,而整合封裝這些優秀的技術恐怕是Spring最擅長的領域了,Spring Cloud也正因為此而誕生。
使用Spring Cloud來構建微服務架構可以省去你整合各家技術的成本,Spring Cloud為我們構建微服務架構提供了一站式的解決方案,就好比當初Spring誕生是為解決EJB企業應用開發的眾多問題而提供的一站式輕量級企業應用開發解決方案一樣,隨着使用Spring Cloud公司數量的增加,相信微服務將被Spring Cloud一統江湖。
1.3.5 Netflix公司介紹
Spring Cloud的很多技術來源於Netfix(https://netflix.github.io/),摘自百度百科的信息如下:
2 開發環境
2.1 Java8
Spring Cloud是基於Java構建,本課程使用Java8作為基礎平台。
2.2 Maven
優秀的架構離不開優秀的項目構建工具,采用Maven來構建(使用apache-maven-3.3.9-bin)。
2.3 Spring Boot
Spring Cloud是基於Spring Boot構建,使用Spring Boot 1.5.4版本。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
2.4 Spring Cloud
Spring Cloud為了避免和各子項目的版本名稱混淆,它采用倫敦地鐵站命名。
使用Dalston.SR3版本。
<!-- 導入Spring Cloud的依賴管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.5 MySQL
MySQL作為數據庫的第二把交椅甚至直逼Oralce這個老大,在互聯網開發中MySQL的應用是最廣泛的。本課程采用MySQL5來構建架構。
2.6 IDEA
IntelliJ IDEA功能的強大及易用性不亞於Eclipse,據統計其使用人數已直逼Eclipse,成為老大指日可待。
3 服務治理
3.1 什么是服務治理
微服務架構的缺點中最主要的就是由於微服務數量眾多導致維護成本巨大,服務治理為解決此問題而產生的。服務治理的作用是讓維護人員從人工維護中解放出來,由服務自維護,微服務作為服務提供方主動向服務治理中心注冊,服務的消費方通過服務治理中心查詢需要的服務並進行調用。
如下圖:

3.2 Spring Cloud Eureka
Spring Cloud Eureka 是對Netflix公司的Eureka的二次封裝,它實現了服務治理的功能,Spring Cloud Eureka提供服務端與客戶端,服務端即是服務注冊中心,客戶端完成服務的注冊與發現。服務端和客戶端均采用Java語言編寫(Eureka支持多語言)。
如下圖顯示了Eureka Server與Eureka Client的關系:

3.3 架構
3.4 實戰
3.4.1 流程圖
3.4.2 開發並部署Eureka Server
1、創建Spring Boot工程
2、在pom.xml中添加依賴(spring boot 、spring cloud、Eureka Server)
3、配置application.yml
4、部署兩台Eureka Server,並且互相注冊,實現高可用。

注意:如果沒有設置Eureka Server的復制結點eureka默認會找8761端口。
1.1.1 開發用戶信息服務
用戶信息服務實現用戶信息查詢、用戶注冊、用戶信息修改等功能。
開發用戶信息服務采用Spring Boot、SpringMVC、Mybatis架構,數據庫采用MySqL5。
3.4.3 服務注冊
服務注冊完成將用戶信息服務注冊到Eureka Server中,供服務消費方查詢。
1、在用戶信息服務中配置Eureka服務中心地址及用戶信息服務名稱。
2、在SpringBoot的啟動類中添加注解@EnableDiscoveryClient
3、注意Eureka服務中心地址配置兩個,因為有兩台Eureka服務中心。
4、用戶服務注冊中心啟動兩個服務,為后邊測試負載均衡准備。

4 負載均衡
4.1 什么是負載均衡
負載均衡是微服務架構中必須使用的技術,通過負載均衡來實現系統的高可用、集群擴容等功能。負載均衡可通過硬件設備及軟件來實現,硬件比如:F5、Array等 ,軟件比如:LVS、Nginx等 。
如下圖是負載均衡的架構圖:

用戶請求先到達負載均衡器(也相當於一個服務),負載均衡器根據負載均衡算法將請求轉發到微服務。負載均衡算法有:輪訓、隨機、加權輪訓、加權隨機、地址哈希等方法,負載均衡器維護一份服務列表,根據負載均衡算法將請求轉發到相應的微服務上,所以負載均衡可以為微服務集群分擔請求,降低系統的壓力。
4.2 Spring Cloud Ribbon
Spring Cloud Ribbon是基於客戶端的負載均衡工具,負載均衡分為服務端負載均衡和客戶端負載均衡,3.1小節的圖形指的是服務端負載均衡,客戶端負載均衡與服務端負載均衡的區別在於客戶端要維護一份服務列表,Ribbon從Eureka Server獲取服務列表,Ribbon根據負載均衡算法直接請求到具體的微服務,中間省去了負載均衡服務。
如下圖是Ribbon負載均衡的流程圖:

1、在消費微服務中使用Ribbon實現負載均衡,Ribbon先從Eureka Server中獲取服務列表。
2、Ribbon根據負載均衡的算法進行負載均衡,將請求轉發到其它微服務。
4.3 實戰

4.3.1 開發單點登錄服務
單點登錄服務提供用戶登錄、用戶退出等功能。
單點登錄服務需要調用用戶信息服務查詢用戶信息。
單點登錄服務采用Spring Boot、SpringMVC開發。
4.3.2 服務發現
單點登錄服務需要從EurekaServer查詢用戶信息服務。
1、配置Eureka Server服務地址。
2、在SpringBoot的啟動類中添加注解@EnableDiscoveryClient

4.3.3 Ribbon編程
1、定義RestTemplate對象
2、配置 @LoadBalanced
3、設置負載均衡算法。
4、使用RestTemplate調用微服務。
5 容錯保護
5.1 什么是容錯保護
容錯保護是指微服務在執行過程中出現錯誤並從錯誤中恢復的能力。微服務容錯性不好很容易導致雪崩效應,什么是雪崩效應?摘自百度百科中的定義:
微服務的雪崩效應表現在服務與服務之間調用,當其中一個服務無法提供服務可能導致其它服務也死掉,比如:單點登錄服務調用用戶信息服務查詢用戶信息,由於用戶信息服務無法提供服務導致單點登錄服務一直等待,從而導致用戶登錄、用戶退出功能無法使用,像這樣由一個服務所引起的一連串的多個服務無法提供服務即是微服務的雪崩效應。
5.2 Spring Cloud Hystrix
Spring Cloud Hystrix 是基於Netflix的開源框架Hystrix的整合,它實現了斷路器、線程隔離、信號隔離等容錯功能。
下圖是Hystrix斷路器示意圖:

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

2、使用Hystrix實現容錯。
3、在Spring boot的啟動類上添加@enableHystrix注解

6 服務網關
6.1 什么是服務網關
服務網關是在微服務前邊設置一道屏障,請求先到服務網關,網關會對請求進行過慮、校驗、路由等處理。有了服務網關可以提高微服務的安全性,校驗不通過的請求將被拒絕訪問。
前邊介紹的Ribbon客戶端負載均衡技術可以不用經過網關,因為通常使用Ribbon完成微服務與微服務之間的內部調用,而對那些對外提供服務的微服務,比如:用戶登錄、提交訂單等,則必須經過網關來保證微服務的安全。
6.2 Spring Cloud Zuul
Spring Cloud Zuul是整合Netflix公司的Zuul開源項目實現的微服務網關,它實現了請求路由、負載均衡、校驗過慮等 功能。

6.3 實戰

1、部署用戶信息服務A、單點登錄服務B,每個服務部署至少兩台機器。
2、將用戶信息服務A、單點登錄服務B注冊到EurekaServer中。
3、開發並部署zuul。

4、在zuul中配置路由
5、可以定義filter,需要集成zuul提供filter類,進行校驗攔截。
6、在spring boot的啟動類中配置注解

7、根據上邊的路由配置訪問微服務。
凡是以/sso/打頭的請求,路由到 microservice-sso微服務。

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



