Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,均可以用Spring Boot的開發風格作到一鍵啓動和部署。Spring並無重複製造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,經過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分佈式系統開發工具包。web
微服務是能夠獨立部署、水平擴展、獨立訪問(或者有獨立的數據庫)的服務單元,springcloud就是這些微服務的大管家,採用了微服務這種架構以後,項目的數量會很是多,springcloud作爲大管家須要管理好這些微服務,天然須要不少小弟來幫忙。spring
Spring Boot 是 Spring 的一套快速配置腳手架,能夠基於Spring Boot 快速開發單個微服務,Spring Cloud是一個基於Spring Boot實現的雲應用開發工具;Spring Boot專一於快速、方便集成的單個個體,Spring Cloud是關注全局的服務治理框架;Spring Boot使用了默認大於配置的理念,不少集成方案已經幫你選擇好了,能不配置就不配置,Spring Cloud很大的一部分是基於Spring Boot來實現,能夠不基於Spring Boot嗎?不能夠。數據庫
Spring Boot能夠離開Spring Cloud獨立使用開發項目,可是Spring Cloud離不開Spring Boot,屬於依賴的關係。springboot
spring -> spring booot > Spring Cloud 這樣的關係。架構
微服務的框架那麼多好比:dubbo、Kubernetes,爲何就要使用Spring Cloud的呢?app
Spring Cloud對於中小型互聯網公司來講是一種福音,由於這類公司每每沒有實力或者沒有足夠的資金投入去開發本身的分佈式系統基礎設施,使用Spring Cloud一站式解決方案能在從容應對業務發展的同時大大減小開發成本。同時,隨着近幾年微服務架構和Docker容器概念的火爆,也會讓Spring Cloud在將來愈來愈「雲」化的軟件開發風格中立有一席之地,尤爲是在目前五花八門的分佈式解決方案中提供了標準化的、全站式的技術方案,意義可能會堪比當前Servlet規範的誕生,有效推動服務端軟件系統技術水平的進步。負載均衡
咱們用Spring Cloud Eureka來實現服務治理。框架
建立一個基礎的Spring Boot工程,命名爲springboot-register,並在pom.xml
中引入須要的依賴內容:分佈式
1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-web</artifactId> 5 </dependency> 6 7 <dependency> 8 <groupId>org.springframework.cloud</groupId> 9 <artifactId>spring-cloud-starter-eureka-server</artifactId> 10 </dependency> 11 <dependency> 12 <groupId>org.springframework.boot</groupId> 13 <artifactId>spring-boot-starter-test</artifactId> 14 <scope>test</scope> 15 </dependency> 16 </dependencies> 17 <dependencyManagement> 18 <dependencies> 19 <dependency> 20 <groupId>org.springframework.cloud</groupId> 21 <artifactId>spring-cloud-dependencies</artifactId> 22 <version>Brixton.SR5</version> 23 <type>pom</type> 24 <scope>import</scope> 25 </dependency> 26 </dependencies> 27 </dependencyManagement>
經過@EnableEurekaServer
註解啓動一個服務註冊中心提供給其餘應用進行對話:spring-boot
@EnableEurekaServer @SpringBootApplication public class ApplicationRegister { public static void main(String[] args) { SpringApplication.run(ApplicationRegister.class, args); } }
在application.properties
配置文件中增長以下信息:
server.port=1111 eureka.server.enable-self-preservation=false eureka.instance.hostname=localhost eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
訪問:http://localhost:1111/ ,如圖所示:
頁面中尚未任何服務!
建立一個基本的Spring Boot應用。命名爲spring boot-client
,在pom.xml
中,加入以下配置:
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-web</artifactId> 4 </dependency> 5 6 <dependency> 7 <groupId>org.springframework.cloud</groupId> 8 <artifactId>spring-cloud-starter-eureka-server</artifactId> 9 </dependency> 10 <dependency> 11 <groupId>org.springframework.boot</groupId> 12 <artifactId>spring-boot-starter-test</artifactId> 13 <scope>test</scope> 14 </dependency> 15 </dependencies> 16 <dependencyManagement> 17 <dependencies> 18 <dependency> 19 <groupId>org.springframework.cloud</groupId> 20 <artifactId>spring-cloud-dependencies</artifactId> 21 <version>Brixton.SR5</version> 22 <type>pom</type> 23 <scope>import</scope> 24 </dependency> 25 </dependencies> 26 </dependencyManagement>
編寫一個controller:
1 @RestController 2 public class HelloController { 3 private final Logger logger = Logger.getLogger(getClass()); 4 5 @Autowired 6 private DiscoveryClient client; 7 8 @RequestMapping(value = "/hello", method = RequestMethod.GET) 9 public String index() throws Exception{ 10 11 return "Hello World"; 12 } 13 }
最後在應用主類中經過加上@EnableDiscoveryClient
註解,實現Controller中對服務信息的輸出:
1 @EnableDiscoveryClient 2 @SpringBootApplication 3 public class ApplicationClient { 4 5 public static void main(String[] args) { 6 SpringApplication.run(ApplicationClient.class, args); 7 } 8 9 }
在application.properties配置文件中增長以下信息:
server.port=2224 spring.application.name=hello-service eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
啓動該工程後,再次訪問:http://localhost:1111/ ,如圖:
咱們也能夠經過直接訪問spring boot-client服務提供的/hello接口,訪問:http://localhost:2224/hello,獲得以下輸出:
這樣咱們的服務註冊與發現就完成了。
server端:
1.關閉註冊中心自我保護機制 eureka.server.enable-self-preservation:false 2.註冊中心清理間隔(單位毫秒,默認60*1000) eureka.server.eviction-interval-timer-in-ms:10000
client端:
1.開啓健康檢查(須要spring-boot-starter-actuator依賴) eureka.client.healthcheck.enabled:true 2.租期更新時間間隔(默認30秒) eureka.instance.lease-renewal-interval-in-seconds=10 3.租期到期時間(默認90秒) eureka.instance.lease-expiration-duration-in-seconds=15
以上參數配置下來,從服務中止,到註冊中心清除不健康實例,時間大約在30秒左右。租期到期時間爲30秒時,清除時間大約在59秒,若採用默認的30-60配置,清除時間大約在2分半(以上均在關閉保護機制狀況下),生產環境建議採用默認配置,服務中止到註冊中心清除實例之間有一些計算什麼的。