Spring cloud入門
1. 概念
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分散式系統基礎設施的開發,如服務發現註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring Cloud並沒有重複製造輪子,它只是將各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過Spring Boot風格進行再封裝遮蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分散式系統開發工具包。
- Spring Cloud Netflix 是對Netflix開發的一套分散式服務框架的封裝,包括服務的發現和註冊,負載均衡、斷路器、REST客戶端、請求路由等。
- Spring Cloud Config 將配置資訊中央化儲存, 配置Spring Cloud Bus可以實現動態修改配置檔案
- Spring Cloud Bus 分散式訊息佇列,是對Kafka, MQ的封裝
- Spring Cloud Security 對Spring Security的封裝,並能配合Netflix使用
- Spring Cloud Zookeeper 對Zookeeper的封裝,使之能配置其它Spring Cloud的子專案使用
- Spring Cloud Eureka 是 Spring Cloud Netflix 微服務套件中的一部分,它基於Netflix Eureka 做了二次封裝,主要負責完成微服務架構中的服務治理功能。
1.1微服務架構的優勢
使用微服務架構能夠為我們帶來如下好處:
1)服務的獨立部署
每個服務都是一個獨立的專案,可以獨立部署,不依賴於其他服務,耦合性低。
2)服務的快速啟動
拆分之後服務啟動的速度必然要比拆分之前快很多,因為依賴的庫少了,程式碼量也少了。
3)更加適合敏捷開發
敏捷開發以使用者的需求進化為核心,採用迭代、循序漸進的方法進行。服務拆分可以快速釋出新版本,修改哪個服務只需要釋出對應的服務即可,不用整體重新發布。
4)職責專一,由專門的團隊負責專門的服務
業務發展迅速時,研發人員也會越來越多,每個團隊可以負責對應的業務線,服務的拆分有利於團隊之間的分工。
5)服務可以動態按需擴容
當某個服務的訪問量較大時,我們只需要將這個服務擴容即可。
6)程式碼的複用
每個服務都提供 REST API,所有的基礎服務都必須抽出來,很多的底層實現都可以以介面方式提供。
1.2微服務架構的劣勢
1)分散式部署,呼叫的複雜性高
單體應用的時候,所有模組之前的呼叫都是在本地進行的,在微服務中,每個模組都是獨立部署的,通過 HTTP 來進行通訊,這當中會產生很多問題,比如網路問題、容錯問題、呼叫關係等。
2)獨立的資料庫,分散式事務的挑戰
每個微服務都有自己的資料庫,這就是所謂的去中心化的資料管理。這種模式的優點在於不同的服務,可以選擇適合自身業務的資料,比如訂單服務可以用 MySQL、評論服務可以用 Mongodb、商品搜尋服務可以用 Elasticsearch。
缺點就是事務的問題了,目前最理想的解決方案就是柔性事務中的最終一致性,後面的章節會給大家做具體介紹。
3)測試的難度提升
服務和服務之間通過介面來互動,當介面有改變的時候,對所有的呼叫方都是有影響的,這時自動化測試就顯得非常重要了,如果要靠人工一個個介面去測試,那工作量就太大了。這裡要強調一點,就是 API 文件的管理尤為重要。
4)運維難度的提升
在採用傳統的單體應用時,我們可能只需要關注一個 Tomcat 的叢集、一個 MySQL 的叢集就可以了,但這在微服務架構下是行不通的。當業務增加時,服務也將越來越多,服務的部署、監控將變得非常複雜,這個時候對於運維的要求就高了。
1.3 Spring Cloud模組介紹
- Eureka:服務註冊中心,用於服務管理。
- Ribbon:基於客戶端的負載均衡元件。
- Hystrix:容錯框架,能夠防止服務的雪崩效應。
- Feign:Web 服務客戶端,能夠簡化 HTTP 介面的呼叫。
- Zuul:API 閘道器,提供路由轉發、請求過濾等功能。
- Config:分散式配置管理。
- Sleuth:服務跟蹤。
- Stream:構建訊息驅動的微服務應用程式的框架。
- Bus:訊息代理的叢集訊息匯流排。
1.4 Spring Cloud與Dubbo功能對比
功能名稱 | Dubbo | Spring Cloud |
---|---|---|
服務註冊中心 | ZooKeeper | Spring Cloud Netflix Eureka |
服務呼叫方式 | RPC | REST API |
服務閘道器 | 無 | Spring Cloud Netflix Zuul |
斷路器 | 不完善 | pring Cloud Netflix Hystrix |
分散式配置 | 無 | Spring Cloud Config |
服務跟蹤 | 無 | Spring Cloud Sleuth |
訊息匯流排 | 無 | Spring Cloud Bus |
資料流 | 無 | Spring Cloud Stream |
批量任務 | 無 | Spring Cloud Task |
1.5 讀取配置檔案
。Spring Boot 中的配置通常放在 application.properties 中,讀取配置資訊非常方便,總共分為 3 種方式:
- Environment
可以通過 Environment 的 getProperty 方法來獲取想要的配置資訊,程式碼如下所示。
@RestController
public class HelloController {
// 注入物件
@Autowired
private Environment env;
@GetMapping("/hello")
public String hello() {
// 讀取配置
String port = env.getProperty("server.port");
return port;
}
}
- @Value
可以注入具體的配置資訊,程式碼如下所示。
@RestController
public class HelloController {
// 注入配置
@Value("${server.port}")
private String port;
@GetMapping("/hello")
public String hello() {
return port;
}
}
- 自定義配置
prefix 定義配置的字首,程式碼如下所示。
@ConfigurationProperties(prefix = "net.biancheng")
@Component
public class MyConfig {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
讀取配置的方法程式碼如下所示。
@RestController
public class HelloController {
@Autowired
private MyConfig myConfig;
@GetMapping("/hello")
public String hello() {
return myConfig.getName();
}
}
定義配置 application.properties 的方法如下:
net.biancheng.name=zhangsan