Spring 社群的唯一一個國產開源專案 - Spring Cloud Alibaba 畢業了
阿里妹導讀:一年多前,Java 界最近發生了一件大事,阿里開源 Spring Cloud Alibaba,並推出首個預覽版。Spring Cloud 本身是一套微服務規範,並不是一個拿來即可用的框架,而 Spring Cloud Alibaba 的開源為開發者們提供了這套規範的實現方式。同時,Spring Cloud Alibaba 提供的完整的微服務元件、中文文件和本地化的開源服務提高了開發者們接入微服務的速率,並降低了後續的運維難度。
經過一年多的孵化,Spring Cloud Alibaba 作為 Spring 社群的唯一一個國產開源專案,正式從 Spring Cloud Incubator 孵化器畢業,併發布了適配 Spring Cloud Edgware、Finchley、Greenwich 三個版本的新版本。
Spring Cloud Alibaba 是 Spring 社群第一個也是唯一一個國產開源專案。
(官方畢業公告參考 Spring Blog: https://spring.io/blog/2019/07/24/simplifying-the-spring-cloud-release-train)
Spring Cloud Alibaba 畢業後從孵化器倉庫遷移到了 Github Alibaba 倉庫下,新的倉庫地址點選 這裡。 新的 maven 座標如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Spring Cloud Alibaba 各版本相容表:
Spring Cloud Alibaba 介紹
Spring Cloud 是 Spring 社群打造出的一款基於 Spring Boot 用於快速構建分散式系統的框架,主要包括以下特性:
Spring Cloud Alibaba 是阿里巴巴開源中介軟體跟 Spring Cloud 體系的融合:
作為 Spring Cloud 體系下的新實現,Spring Cloud Alibaba 跟官方的元件或其它的第三方實現如 Netflix, Consul,Zookeeper 等對比,具備了更多的功能:
Spring Cloud Alibaba 功能
總體架構
依託 Spring Cloud Alibaba,只需要新增一些註解和少量配置,就可以將 Spring Cloud 應用接入阿里微服務解決方案,透過阿里中介軟體來迅速搭建分散式應用系統。
服務註冊 & 配置管理
服務註冊 & 配置管理是微服務應用中必不可少的兩大基礎功能。
Spring Cloud Alibaba 基於 Nacos 提供 spring-cloud-alibaba-starter-nacos-discovery & spring-cloud-alibaba-starter-nacos-config 實現了服務註冊 & 配置管理功能。
依靠 @EnableDiscoveryClient 進行服務的註冊,相容 RestTemplate & OpenFeign 的客戶端進行服務呼叫。
OpenFeign 客戶端:
@FeignClient(name = "echo-service")
public interface EchoService {
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
String echo(@PathVariable("str") String str);
}
RestTemplate 客戶端:
@LoadBalanced
@Bean
public RestTemplate restTemplate1() {
return new RestTemplate();
}
....
restTemplate.getForObject("
String.class);
配置管理直接以約定俗成的方式構造 dataId & Group 從 Nacos 讀取配置設定到 Spring Environment 中即可。
流控降級
流控降級是微服務穩定性的法寶,用於解決各種不穩定的場景可能會導致的嚴重後果。
在限流層面:我們根據系統的處理能力對流量進行控制,在保證系統吞吐量比較高的同時又不會把系統打垮。
在降級層面:在服務出現不穩定因素的時候暫時切斷服務的呼叫,等待一段時間再進行嘗試。一方面防止給不穩定服務“雪上加霜”,另一方面保護服務的呼叫方不被拖垮。
Spring Cloud Alibaba 基於 Sentinel 提供 spring-cloud-alibaba-starter-sentinel 對 Spring 體系內基本所有的客戶端,閘道器進行了適配,包括了 WebServlet, WebFlux, RestTemplate, OpenFeign, Netflix Zuul, Spring Cloud Gateway。
只需引入 starter,即可對這些元件生效。只需定義規則進行流控降級:
限流規則:
降級規則:
服務呼叫
Spring Cloud 預設的服務呼叫依賴 OpenFeign 或 RestTemplate 使用 REST 進行呼叫。
Spring Cloud Alibaba Dubbo 只需使用 @DubboTransported 註解即可將底層的 Rest 協議無縫切換成 Dubbo RPC 協議,進行 RPC 呼叫。這一舉措讓 Spring Cloud 的客戶端呼叫多了一個新的 RPC 選擇:
@Bean
@LoadBalanced
@DubboTransported
public RestTemplate restTemplate() {
return new RestTemplate();
}
@FeignClient("dubbo-provider")
@DubboTransported(protocol = "dubbo")
public interface DubboFeignRestService {
@GetMapping(value = "/param")
String param(@RequestParam("param") String param);
@PostMapping("/saveB")
String saveB(@RequestParam("a") int a, @RequestParam("b") String b);
}
分散式訊息 & 訊息匯流排
基於 Spring Cloud Stream 提供 Binder 的新實現: Spring Cloud Stream RocketMQ Binder,也新增了 Spring Cloud Bus 訊息匯流排的新實現 Spring Cloud Bus RocketMQ。
Spring Cloud Stream 對訊息的程式設計模型進行了統一封裝,用同一套程式碼進行訊息的傳送/接收,遮蔽底層訊息中介軟體的實現細節,讓我們在關注點放到業務邏輯上。如果想要更換底層訊息中介軟體,直接引入 Binder 的新實現即可,程式碼層面幾乎無需修改。這是一段使用 Spring Cloud Stream RocketMQ & Spring Cloud Function 完成訊息的接收,並轉換成大寫 & 新增 alibaba- 字首的新訊息,再傳送給新的 topic 的過程:
spring.cloud.stream.bindings.input.destination=test-topic
spring.cloud.stream.bindings.input.group=test-group1
spring.cloud.stream.bindings.output.destination=test-topic-uppercase
spring.cloud.stream.function.definition=uppercase|addprefix
@SpringBootApplication
@EnableBinding(Processor.class)
public class FunctionApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(FunctionApplication.class)
.web(WebApplicationType.NONE).run(args);
}
@Bean
public Function<String, String> uppercase() {
return x -> x.toUpperCase();
}
@Bean
public Function<String, String> addprefix() {
return x -> "alibaba-" + x;
}
}
分散式事務
Seata 是 阿里巴巴 開源的 分散式事務中介軟體,以 高效 並且對業務 0 侵入 的方式,解決 微服務 場景下面臨的分散式事務問題。
在 Spring Cloud 這一層面,我們透過在微服務中傳遞事務上下文的方式完成了 Seata 在 Spring Cloud 層面的接入:
- Spring MVC 環境下支援自動還原 Seata 事務上下文
- 支援服務呼叫者透過 RestTemplate 或 FeignClient 呼叫時,自動傳遞 Seata 事務上下文
- 支援 FeignClient 和 Hystrix、Sentinel 同時使用的場景
這是一段使用 Spring Cloud Alibaba Seata 完成 storage 和 order 服務進行資料儲存的分散式事務程式碼:
@GlobalTransactional(timeoutMills = 300000, name = "spring-cloud-demo-tx")
@RequestMapping(value = "/seata/rest", method = RequestMethod.GET, produces = "application/json")
public String rest() {
// 呼叫 storage 服務。涉及資料庫操作
String result = restTemplate.getForObject(
"
String.class);
if (!SUCCESS.equals(result)) {
throw new RuntimeException();
}
String url = "
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("userId", USER_ID);
map.add("commodityCode", COMMODITY_CODE);
map.add("orderCount", ORDER_COUNT + "");
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(
map, headers);
// 呼叫 order 服務。涉及資料庫操作
ResponseEntity<String> response = restTemplate.postForEntity(url, request,
String.class);
result = response.getBody();
if (!SUCCESS.equals(result)) {
throw new RuntimeException();
}
return SUCCESS;
}
Roadmap
Spring Boot Admin 是一個開源社群專案,用於管理和監控 SpringBoot 應用程式。但是它沒有跟 Spring Cloud 做深度的整合。我們希望做一個 Spring Cloud Admin,它能提供如下功能:
- 增加服務治理控制檯,整合微服務控制能力
- 服務查詢、管理
- 配置管理
- 限流降級等
- 專案管理/監控
- 參考 Spring Cloud Azure Playground ,創造 Spring Cloud Alibaba Playground,把一些最佳實踐,影片教程,自動生成專案等功能放上去
- 增加 Spring Cloud Alibaba 最佳實踐專案
- 針對 Spring Cloud Alibaba 各種特性,開發對應的實戰 Demo
- 替換 Spring Cloud 服務呼叫客戶端 OpenFeign & Ribbon。開發更通用的服務呼叫客戶端,替換 Spring Cloud 服務- - 調- 用客戶端 OpenFeign & Ribbon
如果對這些內容敢興趣,歡迎來 github issue 留言。
後續
Spring Cloud Alibaba 畢業並不意味著結束,而是一個新的開始。後續我們還有會一系列動作:
- Spring Initializr 頁面上將會提供 Spring Cloud Alibaba 的 Dependency
- Spring Cloud 官方介紹頁上提供 Spring Cloud Alibaba 的介紹
- 提供 Spring Cloud Alibaba 的國內官網
本文作者:中介軟體小哥
本文為雲棲社群原創內容,未經允許不得轉載。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69947441/viewspace-2656145/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring Cloud Alibaba 開源背後的故事 | 開源中國專訪SpringCloud
- 坑爹專案「spring-cloud-alibaba」,我們也來一個SpringCloud
- spring cloud alibaba 元件版本關係 以及 畢業版本依賴關係SpringCloud元件
- 開源兩個spring api專案SpringAPI
- Spring Cloud Alibaba SentinelSpringCloud
- Spring Cloud Alibaba SeataSpringCloud
- spring cloud 和 阿里微服務spring cloud AlibabaSpringCloud阿里微服務
- 詳細剖析Spring Cloud 和Spring Cloud Alibaba的前世今生SpringCloud
- 看spring cloud開源專案Pig的雲踩坑記SpringCloud
- Spring Cloud Alibaba之NacosSpringCloud
- Spring Cloud Alibaba, 開箱即用SpringCloud
- Spring Cloud Alibaba教程:Sentinel的使用SpringCloud
- 走進Spring Cloud Alibaba的世界SpringCloud
- Spring Cloud (十四):Spring Cloud 開源軟體都有哪些?SpringCloud
- Spring Boot 2.0 版的開源專案雲收藏來了!Spring Boot
- 專案實戰|千鋒Java微服務架構之Alibaba篇_Spring Cloud AlibabaJava微服務架構SpringCloud
- Spring Cloud Alibaba入門篇SpringCloud
- Spring Cloud Alibaba(2)---Nacos概述SpringCloud
- Spring-Cloud-Alibaba之SeataSpringCloud
- Spring-Cloud-Alibaba之SentinelSpringCloud
- Spring Cloud Alibaba(13)---Sleuth概述SpringCloud
- Spring Cloud Alibaba(9)---Sentinel概述SpringCloud
- Spring Cloud Alibaba元件之SentinelSpringCloud元件
- Spring Cloud相關專案SpringCloud
- Spring Cloud Alibaba 開源之夏,最後 7 天倒數計時SpringCloud
- 當Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth會擦出怎樣的火花SpringCloud
- Spring Cloud Alibaba釋出第二個版本,Spring 發來賀電SpringCloud
- 使用Spring Boot開發的10個免費開源專案Spring Boot
- 演示:React + Spring + ArchUnit的開源專案ReactSpring
- Spring Cloud Alibaba與Spring Boot、Spring Cloud之間不得不說的版本關係CloudSpring Boot
- 使用Spring Boot的10多個免費開源專案Spring Boot
- Spring Cloud Alibaba到底坑不坑?SpringCloud
- Spring Cloud Alibaba | Nacos配置管理SpringCloud
- Spring Cloud Alibaba(5)---Nacos(配置中心)SpringCloud
- Spring Cloud Alibaba(1)---入門篇SpringCloud
- Spring Cloud Alibaba(15)---Sleuth+ZipkinSpringCloud
- Spring Cloud Alibaba微服務實戰SpringCloud微服務
- Spring Cloud Alibaba(四)--Gateway與SentinelSpringCloudGateway