javascript
Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了
阿里妹導(dǎo)讀:一年多前,Java 界最近發(fā)生了一件大事,阿里開(kāi)源 Spring Cloud Alibaba,并推出首個(gè)預(yù)覽版。Spring Cloud 本身是一套微服務(wù)規(guī)范,并不是一個(gè)拿來(lái)即可用的框架,而 Spring Cloud Alibaba 的開(kāi)源為開(kāi)發(fā)者們提供了這套規(guī)范的實(shí)現(xiàn)方式。同時(shí),Spring Cloud Alibaba 提供的完整的微服務(wù)組件、中文文檔和本地化的開(kāi)源服務(wù)提高了開(kāi)發(fā)者們接入微服務(wù)的速率,并降低了后續(xù)的運(yùn)維難度。
經(jīng)過(guò)一年多的孵化,Spring Cloud Alibaba 作為 Spring 社區(qū)的唯一一個(gè)國(guó)產(chǎn)開(kāi)源項(xiàng)目,正式從 Spring Cloud Incubator 孵化器畢業(yè),并發(fā)布了適配 Spring Cloud Edgware、Finchley、Greenwich 三個(gè)版本的新版本。
Spring Cloud Alibaba 是 Spring 社區(qū)第一個(gè)也是唯一一個(gè)國(guó)產(chǎn)開(kāi)源項(xiàng)目。
?
Spring Cloud Alibaba 畢業(yè)后從孵化器倉(cāng)庫(kù)遷移到了 Github Alibaba 倉(cāng)庫(kù)下,新的倉(cāng)庫(kù)地址點(diǎn)擊這里。 新的 maven 坐標(biāo)如下:
<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 社區(qū)打造出的一款基于 Spring Boot 用于快速構(gòu)建分布式系統(tǒng)的框架,主要包括以下特性:
?
Spring Cloud Alibaba 是阿里巴巴開(kāi)源中間件跟 Spring Cloud 體系的融合:
作為 Spring Cloud 體系下的新實(shí)現(xiàn),Spring Cloud Alibaba 跟官方的組件或其它的第三方實(shí)現(xiàn)如 Netflix, Consul,Zookeeper 等對(duì)比,具備了更多的功能:
Spring Cloud Alibaba 功能
總體架構(gòu)
依托 Spring Cloud Alibaba,只需要添加一些注解和少量配置,就可以將 Spring Cloud 應(yīng)用接入阿里微服務(wù)解決方案,通過(guò)阿里中間件來(lái)迅速搭建分布式應(yīng)用系統(tǒng)。
服務(wù)注冊(cè) & 配置管理
服務(wù)注冊(cè) & 配置管理是微服務(wù)應(yīng)用中必不可少的兩大基礎(chǔ)功能。
Spring Cloud Alibaba 基于 Nacos 提供 spring-cloud-alibaba-starter-nacos-discovery & spring-cloud-alibaba-starter-nacos-config 實(shí)現(xiàn)了服務(wù)注冊(cè) & 配置管理功能。
依靠 @EnableDiscoveryClient 進(jìn)行服務(wù)的注冊(cè),兼容 RestTemplate & OpenFeign 的客戶端進(jìn)行服務(wù)調(diào)用。
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("http://echo-service/echo/hello-spring-cloud-alibaba",String.class);配置管理直接以約定俗成的方式構(gòu)造 dataId & Group 從 Nacos 讀取配置設(shè)置到 Spring Environment 中即可。
流控降級(jí)
流控降級(jí)是微服務(wù)穩(wěn)定性的法寶,用于解決各種不穩(wěn)定的場(chǎng)景可能會(huì)導(dǎo)致的嚴(yán)重后果。
在限流層面:我們根據(jù)系統(tǒng)的處理能力對(duì)流量進(jìn)行控制,在保證系統(tǒng)吞吐量比較高的同時(shí)又不會(huì)把系統(tǒng)打垮。
在降級(jí)層面:在服務(wù)出現(xiàn)不穩(wěn)定因素的時(shí)候暫時(shí)切斷服務(wù)的調(diào)用,等待一段時(shí)間再進(jìn)行嘗試。一方面防止給不穩(wěn)定服務(wù)“雪上加霜”,另一方面保護(hù)服務(wù)的調(diào)用方不被拖垮。
Spring Cloud Alibaba 基于 Sentinel 提供 spring-cloud-alibaba-starter-sentinel 對(duì) Spring 體系內(nèi)基本所有的客戶端,網(wǎng)關(guān)進(jìn)行了適配,包括了 WebServlet, WebFlux, RestTemplate, OpenFeign, Netflix Zuul, Spring Cloud Gateway。
只需引入 starter,即可對(duì)這些組件生效。只需定義規(guī)則進(jìn)行流控降級(jí):
限流規(guī)則:
降級(jí)規(guī)則:
服務(wù)調(diào)用
Spring Cloud 默認(rèn)的服務(wù)調(diào)用依賴 OpenFeign 或 RestTemplate 使用 REST 進(jìn)行調(diào)用。
Spring Cloud Alibaba Dubbo 只需使用 @DubboTransported 注解即可將底層的 Rest 協(xié)議無(wú)縫切換成 Dubbo RPC 協(xié)議,進(jìn)行 RPC 調(diào)用。這一舉措讓 Spring Cloud 的客戶端調(diào)用多了一個(gè)新的 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 的新實(shí)現(xiàn): Spring Cloud Stream RocketMQ Binder,也新增了 Spring Cloud Bus 消息總線的新實(shí)現(xiàn) Spring Cloud Bus RocketMQ。
Spring Cloud Stream 對(duì)消息的編程模型進(jìn)行了統(tǒng)一封裝,用同一套代碼進(jìn)行消息的發(fā)送/接收,屏蔽底層消息中間件的實(shí)現(xiàn)細(xì)節(jié),讓我們?cè)陉P(guān)注點(diǎn)放到業(yè)務(wù)邏輯上。如果想要更換底層消息中間件,直接引入 Binder 的新實(shí)現(xiàn)即可,代碼層面幾乎無(wú)需修改。這是一段使用 Spring Cloud Stream RocketMQ & Spring Cloud Function 完成消息的接收,并轉(zhuǎn)換成大寫(xiě) & 添加 alibaba- 前綴的新消息,再發(fā)送給新的 topic 的過(guò)程:
spring.cloud.stream.bindings.input.destination=test-topic spring.cloud.stream.bindings.input.group=test-group1spring.cloud.stream.bindings.output.destination=test-topic-uppercasespring.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);}@Beanpublic Function<String, String> uppercase() {return x -> x.toUpperCase();}@Beanpublic Function<String, String> addprefix() {return x -> "alibaba-" + x;}}分布式事務(wù)
Seata 是 阿里巴巴 開(kāi)源的 分布式事務(wù)中間件,以 高效 并且對(duì)業(yè)務(wù) 0 侵入 的方式,解決 微服務(wù) 場(chǎng)景下面臨的分布式事務(wù)問(wèn)題。
在 Spring Cloud 這一層面,我們通過(guò)在微服務(wù)中傳遞事務(wù)上下文的方式完成了 Seata 在 Spring Cloud 層面的接入:
- Spring MVC 環(huán)境下支持自動(dòng)還原 Seata 事務(wù)上下文
- 支持服務(wù)調(diào)用者通過(guò) RestTemplate 或 FeignClient 調(diào)用時(shí),自動(dòng)傳遞 Seata 事務(wù)上下文
- 支持 FeignClient 和 Hystrix、Sentinel 同時(shí)使用的場(chǎng)景
這是一段使用 Spring Cloud Alibaba Seata 完成 storage 和 order 服務(wù)進(jìn)行數(shù)據(jù)存儲(chǔ)的分布式事務(wù)代碼:
Roadmap
Spring Boot Admin 是一個(gè)開(kāi)源社區(qū)項(xiàng)目,用于管理和監(jiān)控 SpringBoot 應(yīng)用程序。但是它沒(méi)有跟 Spring Cloud 做深度的整合。我們希望做一個(gè) Spring Cloud Admin,它能提供如下功能:
- 增加服務(wù)治理控制臺(tái),整合微服務(wù)控制能力
- 服務(wù)查詢、管理
- 配置管理
- 限流降級(jí)等
- 項(xiàng)目管理/監(jiān)控
- 參考 Spring Cloud Azure Playground?http://azure-spring-cloud.azurewebsites.net/?,創(chuàng)造 Spring Cloud Alibaba Playground,把一些最佳實(shí)踐,視頻教程,自動(dòng)生成項(xiàng)目等功能放上去
- 增加 Spring Cloud Alibaba 最佳實(shí)踐項(xiàng)目
- 針對(duì) Spring Cloud Alibaba 各種特性,開(kāi)發(fā)對(duì)應(yīng)的實(shí)戰(zhàn) Demo
- 替換 Spring Cloud 服務(wù)調(diào)用客戶端 OpenFeign & Ribbon。開(kāi)發(fā)更通用的服務(wù)調(diào)用客戶端,替換 Spring Cloud 服務(wù)- - 調(diào)- 用客戶端 OpenFeign & Ribbon
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 高德在提升定位精度方面的探索和实践
- 下一篇: 来自 Spring Cloud 官方的消