[TOC]
Spring Cloud是一個基于Spring Boot實現的云應用開發工具,它為基于JVM的云應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分布式會話[Spring Cloud(三)服務提供者 Eureka + 服務消費者(rest + Ribbon)](SpringCloud%EF%BC%88%E4%B8%89%EF%BC%89%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85Eureka+%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%EF%BC%88rest+Ribbon%EF%BC%89.md)和集群狀態管理等操作提供了一種簡單的開發方式。
# Spring Cloud簡介
Spring Cloud包含了多個子項目(針對分布式系統中涉及的多個不同開源產品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等項目。
# 微服務架構
微服務(Microservices Architecture)是一種架構風格,一個大型復雜軟件應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是松耦合的。每個微服務僅關注于完成一件任務并很好地完成該任務。在所有情況下,每個任務代表著一個小的業務能力。
微服務的概念源于2014年3月Martin Fowler所寫的章“Microservices”http://martinfowler.com/articles/microservices.html
## 微服務架構(Microservices Architecture)
微服務架構的核心思想是,一個應用是由多個小的、相互獨立的、微服務組成,這些服務運行在自己的進程中,開發和發布都沒有依賴。不同服務通過一些輕量級交互機制來通信,例如 RPC、HTTP 等,服務可獨立擴展伸縮,每個服務定義了明確的邊界,不同的服務甚至可以采用不同的編程語言來實現,由獨立的團隊來維護。簡單的來說,一個系統的不同模塊轉變成不同的服務!而且服務可以使用不同的技術加以實現!
## 微服務設計
那我們在微服務中應該怎樣設計呢。以下是微服務的設計指南:
- 職責單一原則(Single Responsibility Principle):把某一個微服務的功能聚焦在特定業務或者有限的范圍內會有助于敏捷開發和服務的發布。
- 設計階段就需要把業務范圍進行界定。
- 需要關心微服務的業務范圍,而不是服務的數量和規模盡量小。數量和規模需要依照業務功能而定。
- 于SOA不同,某個微服務的功能、操作和消息協議盡量簡單。
- 項目初期把服務的范圍制定相對寬泛,隨著深入,進一步重構服務,細分微服務是個很好的做法。
## 關于微服務架構的取舍
- 在合適的項目,合適的團隊,采用微服務架構收益會大于成本。
- 微服務架構有很多吸引人的地方,但在擁抱微服務之前,也需要認清它所帶來的挑戰。
- 需要避免為了“微服務”而“微服務”。
- 微服務架構引入策略 – 對傳統企業而言,開始時可以考慮引入部分合適的微服務架構原則對已有系統進行改造或新建微服務應用,逐步探索及積累微服務架構經驗,而非全盤實施微服務架構。
[更多關于微服務架構內容-請參考我的另一篇文章:《什什么是微服務架構?》 ](http://www.ymq.io/2017/09/17/MicroServices/#微服務架構microservices-architecture)
# 服務治理
由于Spring Cloud為服務治理做了一層抽象接口,所以在Spring Cloud應用中可以支持多種不同的服務治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服務治理抽象層的作用下,我們可以無縫地切換服務治理實現,并且不影響任何其他的服務注冊、服務發現、服務調用等邏輯。
# Spring Cloud Eureka
Spring Cloud Eureka來實現服務治理。
Spring Cloud Eureka是Spring Cloud Netflix項目下的服務治理模塊。而Spring Cloud Netflix項目是Spring Cloud的子項目之一,主要內容是對Netflix公司一系列開源產品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。通過一些簡單的注解,開發者就可以快速的在應用中配置一下常用模塊并構建龐大的分布式系統。它主要提供的模塊包括:服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶端負載均衡(Ribbon)等。
## Eureka Server
提供服務注冊和發現
### 添加依賴
在項目 `spring-cloud-eureka-service` `pom.xml`中引入需要的依賴內容:
```xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
```
### 開啟服務注冊
通過 `@EnableEurekaServer` 注解啟動一個服務注冊中心提供給其他應用進行對話,這個注解需要在springboot工程的啟動application類上加
```java
package io.ymq.example.eureka.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
```
### 添加配置
在默認設置下,該服務注冊中心也會將自己作為客戶端來嘗試注冊它自己,所以我們需要禁用它的客戶端注冊行為,只需要在`application.yml`配置文件中增加如下信息:
```sh
registerWithEureka: false
fetchRegistry: false
```
完整配置
```sh
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
```
### 訪問服務
啟動工程后,訪問:[http://localhost:8761/](http://localhost:8761/)
可以看到下面的頁面,其中還沒有發現任何服務。
![ System Status ][1]
## Service Provider
- 服務提供方
- 將自身服務注冊到 Eureka 注冊中心,從而使服務消費方能夠找到
### 添加依賴
在項目 `spring-cloud-eureka-provider` `pom.xml`中引入需要的依賴內容:
```xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
```
### 開啟服務注冊
在應用主類中通過加上 @EnableEurekaClient,但只有Eureka 可用,你也可以使用@EnableDiscoveryClient。需要配置才能找到Eureka注冊中心服務器
```java
package io.ymq.example.eureka.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class, args);
}
}
```
### 添加配置
需要配置才能找到Eureka服務器。例:
完整配置
```sh
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eureka-provider
server:
port: 8081
```
其中`defaultZone`是一個魔術字符串后備值,為任何不表示首選項的客戶端提供服務URL(即它是有用的默認值)。
通過`spring.application.name`屬性,我們可以指定微服務的名稱后續在調用的時候只需要使用該名稱就可以進行服務的訪問
### 訪問服務
啟動該工程后,再次訪問啟動工程后:[http://localhost:8761/](http://localhost:8761/)
可以如下圖內容,我們定義的服務被成功注冊了。
![ DS Replicas][2]
[1]: https://www.souyunku.com/images/2017/SpringCloud/eureka/11.png
[2]: https://www.souyunku.com/images/2017/SpringCloud/eureka/22.png
## 源碼下載
**GitHub:**[https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka](https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka)
**碼云:**[https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka](https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka)
- Spring Cloud(一)服務的注冊與發現(Eureka)
- Spring Cloud(二)Consul 服務治理實現
- Spring Cloud(三)服務提供者 Eureka + 服務消費者(rest + Ribbon)
- Spring Cloud(四)服務提供者 Eureka + 服務消費者 Feign
- Spring Cloud(五)斷路器監控(Hystrix Dashboard)
- Spring Cloud(六)服務網關 zuul 快速入門
- Spring Cloud(七)服務網關 Zuul Filter 使用
- Spring Cloud(八)高可用的分布式配置中心 Spring Cloud Config
- Spring Cloud(九)高可用的分布式配置中心 Spring Cloud Config 集成 Eureka 服務
- Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh
- Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息總線集成(RabbitMQ)