Spring Cloud(一):服務註冊與發現

Spring Cloud是什麼

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,均可以用Spring Boot的開發風格作到一鍵啓動和部署。Spring並無重複製造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,經過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分佈式系統開發工具包。web

微服務是能夠獨立部署、水平擴展、獨立訪問(或者有獨立的數據庫)的服務單元,springcloud就是這些微服務的大管家,採用了微服務這種架構以後,項目的數量會很是多,springcloud作爲大管家須要管理好這些微服務,天然須要不少小弟來幫忙。spring

和Spring Boot 是什麼關係

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 這樣的關係。架構

Spring Cloud的優點

微服務的框架那麼多好比:dubbo、Kubernetes,爲何就要使用Spring Cloud的呢?app

  • 產出於spring你們族,spring在企業級開發框架中無人能敵,來頭很大,能夠保證後續的更新、完善。好比dubbo如今就差很少死了
  • 有Spring Boot 這個獨立干將能夠省不少事,大大小小的活Spring Boot都搞的挺不錯。
  • 做爲一個微服務治理的你們夥,考慮的很全面,幾乎服務治理的方方面面都考慮到了,方便開發開箱即用。
  • Spring Cloud 活躍度很高,教程很豐富,遇到問題很容易找到解決方案
  • 輕輕鬆鬆幾行代碼就完成了熔斷、均衡負責、服務中心的各類平臺功能

Spring Cloud對於中小型互聯網公司來講是一種福音,由於這類公司每每沒有實力或者沒有足夠的資金投入去開發本身的分佈式系統基礎設施,使用Spring Cloud一站式解決方案能在從容應對業務發展的同時大大減小開發成本。同時,隨着近幾年微服務架構和Docker容器概念的火爆,也會讓Spring Cloud在將來愈來愈「雲」化的軟件開發風格中立有一席之地,尤爲是在目前五花八門的分佈式解決方案中提供了標準化的、全站式的技術方案,意義可能會堪比當前Servlet規範的誕生,有效推動服務端軟件系統技術水平的進步。負載均衡

Spring Cloud Eureka

咱們用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分半(以上均在關閉保護機制狀況下),生產環境建議採用默認配置,服務中止到註冊中心清除實例之間有一些計算什麼的。

相關文章
相關標籤/搜索