軟件架構的發展經歷了從單體結構、垂直架構、SOA架構到微服務架構的過程。java
特色:git
1、全部的功能集成在一個項目工程中。github
2、全部的功能打一個war包部署到服務器。web
3、應用與數據庫分開部署。算法
4、經過部署應用集羣和數據庫集羣來提升系統的性能。spring
優勢:數據庫
一、項目架構簡單,前期開發成本低,週期短,小型項目的首選。apache
缺點:編程
一、所有功能集成在一個工程中,對於大型項目不易開發、擴展及維護。安全
二、系統性能擴展只能經過擴展集羣結點,成本高、有瓶頸。
三、技術棧受限。
1.1.2 垂直架構
特色:
1、以單體結構規模的項目爲單位進行垂直劃分項目即將一個大項目拆分紅一個一個單體結構項目。
2、項目與項目之間的存在數據冗餘,耦合性較大,好比上圖中三個項目都存在客戶信息。
3、項目之間的接口多爲數據同步功能,如:數據庫之間的數據庫,經過網絡接口進行數據庫同步。
優勢:
一、項目架構簡單,前期開發成本低,週期短,小型項目的首選。
2、經過垂直拆分,原來的單體項目不至於無限擴大。
3、不一樣的項目可採用不一樣的技術。
缺點:
一、所有功能集成在一個工程中,對於大型項目不易開發、擴展及維護。
二、系統性能擴展只能經過擴展集羣結點,成本高、有瓶頸。
特色:
1、基於SOA的架構思想將重複公用的功能抽取爲組件,以服務的方式給各各系統提供服務。
2、各各項目(系統)與服務之間採用webservice、rpc等方式進行通訊。
3、ESB企業服務總線做爲項目與服務之間通訊的橋樑。
優勢:
1、將重複的功能抽取爲服務,提升開發效率,提升系統的可重用性、可維護性。
2、能夠針對不一樣服務的特色制定集羣及優化方案。
3、採用ESB減小系統中的接口耦合。
缺點:
1、系統與服務的界限模糊,不利於開發及維護。
2、雖然使用了ESB,可是服務的接口協議不固定,種類繁多,不利於系統維護。
3、抽取的服務的粒度過大,系統與服務之間耦合性高。
特色:
1、將系統服務層徹底獨立出來,並將服務層抽取爲一個一個的微服務。
2、微服務遵循單一原則。
3、微服務之間採用RESTful等輕量協議傳輸。
優勢:
1、服務拆分粒度更細,有利於資源重複利用,提升開發效率。
2、能夠更加精準的制定每一個服務的優化方案,提升系統可維護性。
3、微服務架構採用去中心化思想,服務之間採用RESTful等輕量協議通訊,相比ESB更輕量。
4、適用於互聯網時代,產品迭代週期更短。
缺點:
1、微服務過多,服務治理成本高,不利於系統維護。
2、分佈式系統開發的技術成本高(容錯、分佈式事務等),對團隊挑戰大。
爲適應企業的業務發展,提升軟件研發的生產力,下降軟件研發的成本,軟件架構也做了升級和優化,將一個獨立的系統拆分紅若干小的服務,每一個小服務運行在不一樣的進程中,服務與服務之間採用http 輕量協議(好比流行的RESTful)傳輸數據,每一個服務所擁有的功能具備獨立性強、高內聚的特色,這樣的設計就實現了單個服務的高內聚,服務與服務之間的低耦合效果,這一個一個的小服務就是微服務,基於這種方法設計的系統架構即微服務架構。
負載均衡,網關路由:高可用、集羣部署,校驗、請求轉發、服務集成。
服務治理:服務註冊、發現。
容錯:避免雪崩。
監控跟蹤:監控資源利用、服務響應、容器資源利用狀況。
消息總線:消息隊列、異步通訊。
配置管理:統一配置管理。
Spring Cloud爲開發人員構建微服務架構提供了完整的解決方案,SpringCloud是若干個框架的集合,它包括spring-cloud-config、spring-cloud-bus等近20個子項目,它提供了服務治理、服務網關、智能路由、負載均衡、斷路器、監控跟蹤、分佈式消息隊列、配置管理等領域的解決方案。
微服務的興起出現了不少優秀的公司和技術:
服務治理: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一統江湖。
Spring Cloud的不少技術來源於Netfix(https://netflix.github.io/),摘自百度百科的信息以下:
Spring Cloud是基於Java構建,本課程使用Java8做爲基礎平臺。
優秀的架構離不開優秀的項目構建工具,採用Maven來構建(使用apache-maven-3.3.9-bin)。
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>
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>
MySQL做爲數據庫的第二把交椅甚至直逼Oralce這個老大,在互聯網開發中MySQL的應用是最普遍的。本課程採用MySQL5來構建架構。
IntelliJ IDEA功能的強大及易用性不亞於Eclipse,據統計其使用人數已直逼Eclipse,成爲老大指日可待。
微服務架構的缺點中最主要的就是因爲微服務數量衆多致使維護成本巨大,服務治理爲解決此問題而產生的。服務治理的做用是讓維護人員從人工維護中解放出來,由服務自維護,微服務做爲服務提供方主動向服務治理中心註冊,服務的消費方經過服務治理中心查詢須要的服務並進行調用。
以下圖:
Spring Cloud Eureka 是對Netflix公司的Eureka的二次封裝,它實現了服務治理的功能,Spring Cloud Eureka提供服務端與客戶端,服務端便是服務註冊中心,客戶端完成服務的註冊與發現。服務端和客戶端均採用Java語言編寫(Eureka支持多語言)。
以下圖顯示了Eureka Server與Eureka Client的關係:
1、建立Spring Boot工程
2、在pom.xml中添加依賴(spring boot 、spring cloud、Eureka Server)
3、配置application.yml
4、部署兩臺Eureka Server,而且互相註冊,實現高可用。
注意:若是沒有設置Eureka Server的複製結點eureka默認會找8761端口。
用戶信息服務實現用戶信息查詢、用戶註冊、用戶信息修改等功能。
開發用戶信息服務採用Spring Boot、SpringMVC、Mybatis架構,數據庫採用MySqL5。
服務註冊完成將用戶信息服務註冊到Eureka Server中,供服務消費方查詢。
1、在用戶信息服務中配置Eureka服務中心地址及用戶信息服務名稱。
2、在SpringBoot的啓動類中添加註解@EnableDiscoveryClient
3、注意Eureka服務中心地址配置兩個,由於有兩臺Eureka服務中心。
4、用戶服務註冊中心啓動兩個服務,爲後邊測試負載均衡準備。
負載均衡是微服務架構中必須使用的技術,經過負載均衡來實現系統的高可用、集羣擴容等功能。負載均衡可經過硬件設備及軟件來實現,硬件好比:F5、Array等 ,軟件好比:LVS、Nginx等 。
以下圖是負載均衡的架構圖:
用戶請求先到達負載均衡器(也至關於一個服務),負載均衡器根據負載均衡算法將請求轉發到微服務。負載均衡算法有:輪訓、隨機、加權輪訓、加權隨機、地址哈希等方法,負載均衡器維護一份服務列表,根據負載均衡算法將請求轉發到相應的微服務上,因此負載均衡能夠爲微服務集羣分擔請求,下降系統的壓力。
Spring Cloud Ribbon是基於客戶端的負載均衡工具,負載均衡分爲服務端負載均衡和客戶端負載均衡,3.1小節的圖形指的是服務端負載均衡,客戶端負載均衡與服務端負載均衡的區別在於客戶端要維護一份服務列表,Ribbon從Eureka Server獲取服務列表,Ribbon根據負載均衡算法直接請求到具體的微服務,中間省去了負載均衡服務。
以下圖是Ribbon負載均衡的流程圖:
1、在消費微服務中使用Ribbon實現負載均衡,Ribbon先從Eureka Server中獲取服務列表。
2、Ribbon根據負載均衡的算法進行負載均衡,將請求轉發到其它微服務。
單點登陸服務提供用戶登陸、用戶退出等功能。
單點登陸服務須要調用用戶信息服務查詢用戶信息。
單點登陸服務採用Spring Boot、SpringMVC開發。
單點登陸服務須要從EurekaServer查詢用戶信息服務。
1、配置Eureka Server服務地址。
2、在SpringBoot的啓動類中添加註解@EnableDiscoveryClient
1、定義RestTemplate對象
2、配置 @LoadBalanced
3、設置負載均衡算法。
4、使用RestTemplate調用微服務。
容錯保護是指微服務在執行過程當中出現錯誤並從錯誤中恢復的能力。微服務容錯性很差很容易致使雪崩效應,什麼是雪崩效應?摘自百度百科中的定義:
微服務的雪崩效應表如今服務與服務之間調用,當其中一個服務沒法提供服務可能致使其它服務也死掉,好比:單點登陸服務調用用戶信息服務查詢用戶信息,因爲用戶信息服務沒法提供服務致使單點登陸服務一直等待,從而致使用戶登陸、用戶退出功能沒法使用,像這樣由一個服務所引發的一連串的多個服務沒法提供服務便是微服務的雪崩效應。
Spring Cloud Hystrix 是基於Netflix的開源框架Hystrix的整合,它實現了斷路器、線程隔離、信號隔離等容錯功能。
下圖是Hystrix斷路器示意圖:
1.要在服務消費方添加hystrix。
2、使用Hystrix實現容錯。
3、在Spring boot的啓動類上添加@enableHystrix註解
服務網關是在微服務前邊設置一道屏障,請求先到服務網關,網關會對請求進行過慮、校驗、路由等處理。有了服務網關能夠提升微服務的安全性,校驗不經過的請求將被拒絕訪問。
前邊介紹的Ribbon客戶端負載均衡技術能夠不用通過網關,由於一般使用Ribbon完成微服務與微服務之間的內部調用,而對那些對外提供服務的微服務,好比:用戶登陸、提交訂單等,則必須通過網關來保證微服務的安全。
Spring Cloud Zuul是整合Netflix公司的Zuul開源項目實現的微服務網關,它實現了請求路由、負載均衡、校驗過慮等 功能。
1、部署用戶信息服務A、單點登陸服務B,每一個服務部署至少兩臺機器。
2、將用戶信息服務A、單點登陸服務B註冊到EurekaServer中。
3、開發並部署zuul。
4、在zuul中配置路由
5、能夠定義filter,須要集成zuul提供filter類,進行校驗攔截。
6、在spring boot的啓動類中配置註解
7、根據上邊的路由配置訪問微服務。
凡是以/sso/打頭的請求,路由到 microservice-sso微服務。
zuul網關,不只提供對外服務訪問 ,微服務也能夠經過zuul請求其它的微服務。