Spring Cloud 經過自動配置和綁定到Spring環境和其餘Spring編程模型慣例,爲Spring Boot應用程序提供Netflix OSS集成。 經過幾個簡單的註釋,能夠快速啓用和配置應用程序中的常見功能模塊,並使用久經考驗的Netflix組件構建大型分佈式系統。 提供的功能模塊包括服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul)和客戶端負載均衡(Ribbon)。前端
服務發現是microservice基礎架構的關鍵原則之一。Eureka是Netflix服務發現的一種服務和客戶端。java
當一個客戶端註冊到Eureka,它提供關於本身的元數據(諸如主機和端口,健康指標URL,首頁等)Eureka經過一個服務從各個實例接收心跳信息。若是心跳接收失敗超過配置的時間,實例將會正常從註冊裏面移除。web
可使用@EnableEurekaClient
或@EnableDiscoveryClient
註解。
配置eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
屬性,注意修改URL地址。
確保spring.application.name
有默認值。spring
注:@EnableEurekaClient
只能用於Eureka,@EnableDiscoveryClient
能用於zookeeper等其餘註冊組件。編程
@EnableEurekaClient
使其成爲Eureka實例(被其餘服務發現)和客戶端(能發現其餘服務)註冊到應用裏面。可經過eureka.instance.*
進行相關配置的修改。後端
若是其中一個eureka.client.serviceUrl.defaultZone
的url已經把憑證嵌入到它裏面,那麼HTTP基本的身份驗證將會被自動添加到你的eureka客戶端(curl風格,如http://user:password@localhost:8761/eureka
)。 對於更復雜的需求,能夠建立一個帶「@Bean」註解的「DiscoveryClientOptionalArgs」類型而且爲它注入「ClientFilter」實例。api
健康指標和狀態頁面分別對應一個Eureka實例的「/health」和「/info」。spring-mvc
若要用HTTPS,須要設置兩個標記,分別是EurekaInstanceConfig
,即eureka.instance.[nonSecurePortEnabled,securePortEnabled]=[false,true]
。緩存
默認狀況下,Eureka使用客戶端心跳來肯定一個客戶端是否活着(狀態爲「UP」)。安全
有標準的元數據,如主機名、IP地址、端口號、狀態頁面和健康檢查。額外的元數據能夠被添加到實例註冊在eureka.instance.metadataMap
裏面。
在 Cloudfoundry 使用 Eureka
Cloudfoundry有總的路由,全部在同個應用的實例有相同的主機名。
在AWS上使用Eureka
定製EurekaInstanceConfigBean
修改Eureka實例ID
經過eureka.instance.instanceId
進行配置。
使用@EnableDiscoveryClient
(或@EnableEurekaClient
),使它從Eureka Server發現服務實例。
注:不要在@PostConstruct
方法或@Scheduled
方法使用EurekaClient(或任何ApplicationContext還沒被啓動的地方)。
Spring Cloud已經支持Feign(一個REST客戶端構建)跟Spring RestTemplate(使用邏輯Eureka服務標識符(VIPs)代替物理的URL)。
實例默認與註冊中心持續30秒的週期心跳(經過客戶的serviceUrl
)。當實例、服務端和客戶端全都在它們的緩存裏面擁有相同的元數據(這可能還須要3次心跳),那麼服務對於客戶端的discovery將變爲不可用。可經過eureka.instance.leaseRenewalIntervalInSeconds
這個修改配置,能夠加快這一進程的客戶端鏈接到其餘服務。
例子,添加依賴spring-cloud-starter-eureka-server
@SpringBootApplication @EnableEurekaServer public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
服務端有一個帶UI的首頁,HTTP API端點在/eureka/*
下提供標準的Eureka功能。
Eureka服務端沒有後臺存儲,可是服務實例在註冊裏面全都得發送心跳去保持註冊更新(在內存裏操做)客戶端們也有一分內存緩存着eureka的註冊信息。
eureka.client.registerWithEureka=false eureka.client.fetchRegistry=false eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
運行多個Eureka Servers。
Eureka甚至能夠更有彈性和可用的運行多個實例,並讓他們互相註冊。事實上,這也是默認的行爲,所以全部你須要讓它工做的,只要添加一個有效的節點serviceUrl,例如:
--- spring: profiles: peer1 eureka: instance: hostname: peer1 client: serviceUrl: defaultZone: http://peer2/eureka/ --- spring: profiles: peer2 eureka: instance: hostname: peer2 client: serviceUrl: defaultZone: http://peer1/eureka/
而後經過不一樣的「profile」進行運行不一樣的Eureka Server。
設置eureka.instance.preferIpAddress=true
使應用註冊到eureka的是IP地址而不是主機名。
Netflix建立了一個庫實現斷路器模式,名爲Hystrix。一個低水平的服務羣中一個服務掛掉會給用戶致使級聯失效的。當調用一個特定的服務達到必定閾值(在Hystrix裏默認是5秒內20個失敗),斷路器開啓而且調用沒有成功的。開發人員可以提供錯誤緣由和開啓一個斷路由回調。
例子,需添加依賴org.springframework.cloud.spring-cloud-starter-hystrix
@SpringBootApplication @EnableCircuitBreaker public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } } @Component public class StoreIntegration { @HystrixCommand(fallbackMethod = "defaultStores") public Object getStores(Map<String, Object> parameters) { //do stuff that might fail } public Object defaultStores(Map<String, Object> parameters) { return /* something useful */; } }
經測試,失敗就直接調用defaultStores()方法了。
若是你想一些線程的本地的上下文傳播到一個@HystrixCommand,默認聲明將不會工做,由於他在線程池裏執行命令。(在超時的狀況下)。你能夠切換Hystrix去使用同個線程讓調用者使用一些配置,或直接在註解中,讓它去使用不一樣的「隔離策略」。舉例:
@HystrixCommand(fallbackMethod = "stubMyService", commandProperties = { @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE") } ) ...
若是你使用@SessionScope
或@RequestScope
一樣適用。你會知道你要這麼作,由於一個runtime異常說他不能找到做用域上下文。
鏈接的斷路器的狀態也暴露在應用程序的/health
端點中。
添加依賴org.springframework.boot.spring-boot-starter-actuator
,使/hystrix.stream
流做爲一個管理端點。
Hystrix的主要做用是會採集每個HystrixCommand的信息指標,把每個斷路器的信息指標顯示的Hystrix儀表盤上。
環境須要
org.springframework.cloud.spring-cloud-starter-hystrix-dashboard
@EnableHystrixDashboard
/hystrix
http://host:port/hystrix.stream
略
略
Ribbon是一個客戶端負載均衡器,有不少控制HTTP和TCP客戶端的行爲,可以使用@FeignClient
註解。
略
略
略
略
public class MyClass { @Autowired private LoadBalancerClient loadBalancer; public void doStuff() { ServiceInstance instance = loadBalancer.choose("stores"); URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort())); // ... do something with the URI } }
略
略
Zuul是Netflix出品的一個基於JVM路由和服務端的負載均衡器。
Spring Cloud建立了一個嵌入式Zuul代理來緩和急需一個UI應用程序來代理調用一個或多個後端服務的通用需求,這個功能對於代理前端須要訪問的後端服務很是有用,避免了全部後端服務須要關心管理CORS和認證的問題。
。
在Spring Boot主函數上經過註解@EnableZuulProxy
來開啓。
使用@EnableZuulProxy
同時引入了Spring Boot Actuator,默認將增長一個endpoint,提供http服務的/routes
。
逐步替代舊的接口是一種通用的遷移現有應用程序或者API的方式,使用不一樣的具體實現逐步替換它們。Zuul代理是一種頗有用的工具,由於你可使用這種方式處理全部客戶端到舊接口的請求。只是重定向了一些請求到新的接口。
Spring Cloud Netflix 包含 RxJava。
Spring Cloud Netflix提供並支持從Spring MVC Controllers返回rx.Single
對象,還支持使用rx.Observable
對象。
略