0.SpringCloud,微服務架構。包括 服務發現(Eureka),斷路器(Hystrix),服務網關(Zuul),客戶端負載均衡(Ribbon)、服務跟蹤(Sleuth)、消息總線(Bus)、消息驅動(Stream)、批量任務(Task)等。html
1.前端
android
ios
git
github
下面是Eureka的治理機制:spring
服務提供者bootstrap
服務消費者小程序
Eureka Server(服務註冊中心):後端
PS:總感受這個「失效剔除」和「自我保護」,有些矛盾。。
6.一樣做爲註冊中心,Eureka和Zookeeper的區別是什麼?
分佈式事務的CAP理論。C是一致性,A是可用性,P是分區容錯性(必備)。
Eureka是AP,注重可用性。
而Zookeeper是CP,注重一致性。
2.RestTemplate對象,經過getForObject()等方法實現對服務提供者接口的調用。
注入方式以下:
@Autowired private RestTemplate restTemplate;
可用方法以下:
getForObject(URI url, Class<T> responseType)
3.將eureka-server(服務註冊中心)、eureka-client(服務提供者)、eureka-consumer(服務消費者)都啓動起來,而後訪問 eureka-consumer的Controller層方法對應的請求,能夠觀察eureka-consumer服務是如何消費eureka-client服務的Controller層方法接口的。
4.使用Spring Cloud Ribbon能夠做爲服務消費者,實現服務的調用以及客戶端負載均衡。
5.在Ribbon中能夠採用服務名的方式進行請求,由於Ribbon有一個攔截器,它可以在這裏進行實際調用的時候,自動的去選取服務實例,並將實際要請求的IP地址和端口替換這裏的服務名,從而完成服務接口的調用。
服務名是application文件中的spring.application.name 屬性。
6.Ribbon底層原理:負載均衡。輪詢。
7.Ribbon:重試機制。
Eureka因爲在可用性和一致性的取捨上,選擇了可用性。因此服務調用遇到實例故障時,可使用重試機制。Ribbon的重試機制能夠經過簡單的配置實現。
spring.cloud.loadbalancer.retry.enabled=true
1. Feign是一套基於Netflix Feign實現的聲明式服務調用客戶端。Feign能夠作爲服務消費者。須要經過建立接口並用註解來配置它既可完成對Web服務接口的綁定。
2.@EnableFeignClients註解在Application類上方,能夠開啓掃描Spring Cloud Feign客戶端的功能
3.@FeignClient註解用在Feign接口上方,用來指定這個接口所要調用的服務名稱。
2.Feign底層原理 :動態代理。
3.Feign接口支持SpringMvc的註解。包括@RequestBody,@RequestParam等
4.重試機制:Feign自帶Ribbon,默認實現了請求重試機制。當請求時間超過設置的超時時間時,Feign會發起重試。
5.使用Feign的時候,同時也會自動建立負載均衡的Ribbon,還會自動引入服務保護與容錯的Hystrix。
6.Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp。
1.服務熔斷: 在分佈式架構中,當某個服務單元發生故障(相似用電器發生短路)以後,經過斷路器的故障監控(相似熔斷保險絲),向調用方返回一個錯誤響應,而不是長時間的等待。這樣就不會使得線程因調用故障服務被長時間佔用不釋放,避免了故障在分佈式系統中的蔓延。
雪崩效應:是一種因服務提供者的不可用致使服務調用者的不可用,並將不可用逐漸放大的過程。
熔斷能夠避免服務雪崩。
2.Spring Cloud中使用了Hystrix 來實現斷路器的功能。Hystrix具有擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監控和配置等功能。Hystrix具備融斷機制。
Hystrix能夠進行服務降級、服務隔離、服務熔斷。
3.在Ribbon中須要引入Hystrix依賴。不然服務不可用時,會返回404。
而Feign中已經依賴了Hystrix,不須要再引入,會直接返回內部錯誤(500) 。
4.@SpringCloudApplication註解,它整合了@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker。
5.當服務提供者不可用時,斷路器Hystrix會返回錯誤響應。
6.使用了@HystrixCommand來將某個函數包裝成了Hystrix命令,這裏除了定義服務降級以外,Hystrix框架就會自動的爲這個函數實現調用的隔離。因此,依賴隔離、服務降級在使用時候都是一體化實現的.
@HystrixCommond,顧名思義,使用了「命令模式」。
Hystrix通常都是和Feign一塊兒使用,使用@HystrixCommond的較少。
7.服務隔離: Hystrix使用"艙壁模式"實現線程池的隔離,它會爲每個Hystrix命令建立一個獨立的線程池,這樣就算某個在Hystrix命令包裝下的依賴服務出現延遲太高的狀況,也只是對該依賴服務的調用產生影響,而不會拖慢其餘的服務。
經過對依賴服務實現線程池隔離,應用更加健壯,不會由於個別依賴服務出現問題而引發非相關服務的異常。
8.服務降級:當服務器壓力劇增的狀況下,根據實際業務狀況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務器資源以保證核心交易正常運做或高效運做。
爲了保證重要或基本的服務能正常運行,咱們能夠將一些不重要或不緊急的服務或任務進行服務的延遲使用或暫停使用。
9.思考:服務降級和服務熔斷有什麼區別?
熔斷是直接返回一個錯誤響應,降級是延遲使用或暫停使用。
10.Hystix隔離機制:線程池隔離、信號量隔離。
11.能夠在熔斷的FallBack方法中,將Throwable異常做爲參數,並顯示熔斷的異常信息。
15.Hystrix-dashboard,能夠對服務進行監控,展現數據。
1.服務網關:經過服務網關統一貫外系統提供REST API的過程當中,具有服務路由、均衡負載、權限控制等功能。Spring Cloud Netflix中的服務網關爲Zuul。
通常微服務架構中都必然會設計一個網關在裏面,像android、ios、pc前端、微信小程序、H5等等,不用去關心後端有幾百個服務,就知道有一個網關,全部請求都往網關走,網關會根據請求中的一些特徵,將請求轉發給後端的各個服務。並且有了網關以後,還有不少好處,好比能夠作統一的降級、限流、認證受權、安全,等等。
2.服務路由:經過服務路由的功能,在對外提供服務的時候,只須要經過暴露Zuul中配置的調用地址就可讓調用方統一的來訪問咱們的服務,而不須要了解具體提供服務的主機信息了。
3.服務過濾:在服務網關中定義過濾器只須要繼承ZuulFilter
抽象類實現其定義的四個抽象函數就可對請求進行攔截與過濾。
4.網關Zuul自帶Ribbon和Hystrix。
示例圖:
1.分佈式配置中心,集中管理配置,"一次配置,隨處可用"。
2.在SpringCloudConfig中,程序中bootstrap.yml中的配置優先級高於application.yml的配置。。
3.SpringCloudConfig主要由基於Git倉庫的配置中心服務端 、 使用配置中心的客戶端組成。
1.配置高可用的Eureka服務集羣,多個服務註冊中心互相註冊,若是有某個服務註冊節點失效,那麼還有其餘節點可用。
1.SpringCloudStream。
詳情見GitHub :
https://github.com/firefoxer1992/SpringCloudProject
參考資料:
http://www.javashuo.com/article/p-bnqvdjec-bq.html
http://www.javashuo.com/article/p-xrlwzdkw-cx.html
http://blog.didispace.com/spring-cloud-learning/
《SpringCloud微服務實戰》