Spring 社群的唯一一個國產開源專案 - Spring Cloud Alibaba 畢業了

大濤學長發表於2019-09-05
阿里妹導讀:一年多前,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("http://echo-service/echo/hello-spring-cloud-alibaba",
        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(
      "http://127.0.0.1:18082/storage/" + COMMODITY_CODE + "/" + ORDER_COUNT,
      String.class);
  if (!SUCCESS.equals(result)) {
    throw new RuntimeException();
  }
  String url = "http://127.0.0.1:18083/order";
  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  http://azure-spring-cloud.azurewebsites.net/ ,創造 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章