前言
??什么是微服務(wù)
微服務(wù)(Micoservice),服務(wù)一個或者一組相對較小且獨立的功能單元,是用戶可以感知的最小功能集。具有職責單一,充分解耦,集群化等特點。
??微服務(wù)技術(shù)
目前比較流行的微服務(wù)技術(shù)有阿里的dubbo和Netflix的feign。很多人將dubbo與spring cloud相提并論,其實這種觀念是錯誤的,spring cloud是一個生態(tài)體系,dubbo是一個框架。dubbo與feign的最大差異是:dubbo是基于tcp,feign是基于http的客戶端封裝。
??其它相關(guān)技術(shù)
只要是能支持遠程調(diào)用的技術(shù),其實都可以算做微服務(wù)技術(shù),這樣的有一個專有名詞RPC(Remote Procedure Call,遠程過程調(diào)用)。常見的rpc技術(shù)有:java的RMI,Caucho Technolopy的Hession和Burlap、spring的HTTP invoke、JAX-RPC和JAX-WS。有興趣的可以去了解以上這些技術(shù),在此就不再詳述了。
??本文的目的
闡述Spring Cloud的相關(guān)組件,比如eureka、ribbon、feign、zuul。搭建注冊中心,網(wǎng)關(guān)路由,服務(wù)提供者,服務(wù)調(diào)用者,讓讀者可以快速理解和使用相關(guān)技術(shù)。本人其它博文會詳述各個組件使用方式,配置,源碼閱讀和理解。
簡單微服務(wù)結(jié)構(gòu)圖

??注冊中心
??Spring Cloud注冊中心組件為Netflix的eureka,eureka的作用是服務(wù)治理與服務(wù)發(fā)現(xiàn)。
??Eureka服務(wù)端,我們也稱為服務(wù)注冊中心。它同其他注冊中心一樣,支持高可用配置。它依托于強一致性提供良好的服務(wù)實例可用性,可以應(yīng)對多種不同的故障場景。如果Eureka以集群模式部署,當集群中有分片出現(xiàn)故障時,那么Eureka就轉(zhuǎn)入自我保護模式。它允許在分片故障期間繼續(xù)提供服務(wù)的發(fā)現(xiàn)和注冊,當故障分片恢復(fù)運行時,集群中的其他分片會把它們的狀態(tài)再次同步回來。以在AWS上的實踐為例,Netflix推薦每個可用的區(qū)域運行一個Eureka服務(wù)端,通過它來形成集群。不同可用區(qū)域的服務(wù)注冊中心通過異步模式互相復(fù)制各自的狀態(tài),這意味著在任意給定的時間點每個實例關(guān)于服務(wù)點狀態(tài)是有細微差別的。
??服務(wù)剔除:有些時候,我們的服務(wù)實例并不一定會正常下線,可能由于內(nèi)存溢出、網(wǎng)絡(luò)故障等原因使得服務(wù)不能正常工作,而服務(wù)注冊中心并未收到“服務(wù)下限”的請求。為了從服務(wù)列表中將這些無法提供服務(wù)的實例提出,Eureka Server在啟動的時候會創(chuàng)建一個定時線程認為每隔一段時間(默認為60s)將當前清單中超時(默認為90s)沒有續(xù)約的服務(wù)剔除出去。
??自我保護:Eureka Server在運行期間,會統(tǒng)計心跳失敗的比例在15分鐘之內(nèi)是否低于85%,如果出現(xiàn)這種請求(單機調(diào)試,開發(fā)環(huán)境很容易出現(xiàn)),Eureka Server會將當前的實例注冊信息保護起來,讓這些這些實例不會過期。但是,在這段保護期間內(nèi)實例若出現(xiàn)問題,那么客戶端很容易拿到實際已經(jīng)不存在的服務(wù)實例,會出現(xiàn)調(diào)用失敗的情況,所以客戶端必須要有容錯機制,比如可以使用請求重試、斷路器等機制。
??由于本地調(diào)試很容易觸發(fā)注冊中心等保護機制,這會使得注冊中心維護等服務(wù)實例不那么準確。所以,通過以下配置關(guān)閉自我保護機制。
==關(guān)閉eureka自我保護機制==
eureka.server.enable-self-preservation=false
??服務(wù)提供者
??服務(wù)注冊:服務(wù)提供者在啟動的時候會通過發(fā)送REST請求的方式將自己注冊到Eureka Server上,同時帶上了自身服務(wù)的一些元數(shù)據(jù)信息。Eureka Server接收到這個REST請求之后,將元數(shù)據(jù)信息存在一個雙層結(jié)構(gòu)Map重,其中第一層的key是服務(wù)名,第二層的key是具體服務(wù)的實例名。
??服務(wù)續(xù)約:在注冊完服務(wù)之后,服務(wù)提供者會維護一個心跳用來持續(xù)告訴Eureka Server:“我還活著”,以防止Eureka Server的“剔除任務(wù)”將改服務(wù)實例從服務(wù)列表中排除出去,我們稱該操作為服務(wù)續(xù)約(Renew)。
??關(guān)于服務(wù)續(xù)約有兩個重要屬性,我們可以關(guān)注并根據(jù)需要來進行調(diào)整:
==eureka節(jié)點定時續(xù)約時間,默認30==
eureka.instance.leaseRenewalIntervalInSeconds=15
==eureka節(jié)點剔除時間,默認90==
eureka.instance.leaseExpirationDurationInSeconds=45
??服務(wù)調(diào)用者
??服務(wù)發(fā)現(xiàn):當我們啟動服務(wù)調(diào)用者的時候,它除了將自身注冊到注冊中心,還會發(fā)送一個REST請求,來獲取上面注冊的服務(wù)清單。出于性能的考慮,Eureka Server會維護一份只讀懂服務(wù)清單來返回給客戶端,同時該緩存清單會每隔30秒更新一次。
==從注冊中心獲取注冊信息==
eureka.client.fetchRegistry=true
==從注冊中心獲取注冊信息的時間間隔==
eureka.client.registryFetchIntervalSeconds=10
??服務(wù)調(diào)用:服務(wù)調(diào)用者哉獲取服務(wù)清單后,通過服務(wù)名可以獲得具體提供服務(wù)的實例名和該實例等元數(shù)據(jù)信息。因為有這些服務(wù)實例等詳細信息,所以客戶端可以通過自己的需要決定具體調(diào)用哪個實例,在Ribbon中會默認采用輪詢的方式進行調(diào)用,從而實現(xiàn)客戶端的負載均衡。
對于訪問實例等選擇,Eureka中有Region和Zone的概念,一個Region中可以包含多個Zone
注冊中心集群部署

??maven的pom配置

??● spring-cloud-dependencies版本Camden.SR7
??● spring-boot-starter-parent版本1.4.5.RELEASE
??● spring-cloud-starter-eureka-server提供了注冊中心相關(guān)的組件
??主啟動類Application

?? ● @EnableEurekaServer:注冊中心服務(wù)端注解
?? ● @SpringBootApplication:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan的合并注解,組件掃描默認要掃描下級目錄。
??eureka-server的properties配置

?? ● eureka.client.registerWithEureka,eureka.client.fetchRegistry為true。
??● server.port分別為8887,8888,8889進行啟動。
?? ● eureka.client.serviceUrl.defaultZone,互相支持
??頁面效果:

??eureka-client的properties配置

很簡單,就是將自身暴露給所有eureka-server節(jié)點。
服務(wù)調(diào)用者負載均衡
??maven的pom配置

??● spring-boot-starter-parent版本1.4.5.RELEASE
?? ● spring-cloud-dependencies版本Camden.SR7
??● spring-cloud-starter-eureka提供eureka-client組件
?? ● spring-cloud-starter-ribbon提供ribbon組件
??主啟動類Application

?? ● @EnableEurekaClient:注冊中心客戶端注解
?? ● @SpringBootApplication:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan的合并注解,組件掃描默認要掃描下級目錄。
??service-ribbon的properties配置(ribbon配置)

以上配置對全局有效,<serviceName>.ribbon.<key>對當個服務(wù)有效,進行細粒度配置。
《Ribbon詳解》
《Spring Cloud Feign使用詳解》
《Spring Cloud Zuul》
如果需要給我修改意見的發(fā)送郵箱:erghjmncq6643981@163.com
本博客的代碼示例已上傳GitHub:Spring Cloud Netflix組件入門
轉(zhuǎn)發(fā)博客,請注明,謝謝。