天天看點

SOFARPC 5.5.X 新版釋出 | 內建 Nacos 與 Hystrix

SOFA

Scalable Open Financial Architecture

是螞蟻金服自主研發的金融級分布式中間件,包含了建構金融級雲原生架構所需的各個元件,是在金融場景裡錘煉出來的最佳實踐。

SOFA 文檔:

http://www.sofastack.tech/ SOFA: https://github.com/alipay
SOFARPC 5.5.X 新版釋出 | 內建 Nacos 與 Hystrix

最新的SOFARPC 5.5.1 已經釋出啦,本文給大家介紹下 SOFARPC v5.5.x 系列主要提供的特性以及使用方式。

SOFARPC 作為成熟的 RPC 架構,一直緻力于給使用者提供穩定可靠的 RPC 架構 以及最自主的選擇權。SOFARPC 的插件擴充機制可以支援各類實作的可插拔實作。

SOFARPC 5.5 主要給開發者們帶來了服務發現的新選擇:Nacos 的內建 與 服務容錯對 Hystrix 的內建。

服務注冊 Nacos 新選擇

Nacos 是阿裡巴巴開源的一個更易于建構雲原生應用的動态服務發現、配置管理和服務管理平台。根據 Nacos 的 Roadmap,0.8.0 已具備生産使用的能力,截止筆者撰稿時間,Nacos 已釋出 0.9.0,距離 1.0.0 越來越近了。

SOFARPC 5.5.0 開始提供對 Nacos 的內建,以下介紹兩種使用方式:

1、SOFABoot 內建 Nacos

SOFABoot 從 2.5.3 開始已內建 SOFARPC 對 Nacos 的配置支援,假如開發者本機已經根據 

Nacos 快速開始

安裝并啟動 Nacos Server。

根據 RPC 的

示例工程

建立一個 SOFABoot 工程,SOFABoot 工程使用 2.5.3。

$ git clone [email protected]:alipay/sofa-rpc-boot-projects.git
$ git checkout 5.x           

在 application.properties 中配置服務注冊中心位址資訊,就能夠使用 Nacos 作為注冊中心。

$ vi sofa-boot-samples/src/main/resources/application.properties
com.alipay.sofa.rpc.registry.address=nacos://127.0.0.1:8848           

啟動 RPC 服務端執行個體工程:

run com.alipay.sofa.rpc.samples.invoke.InvokeServerApplication           

啟動成功後即可在 Nacos 服務端看到服務注冊資訊:

Nacos 服務清單

 (注:如果使用者自己部署了nacos的服務端,可以通過這個位址通路)

SOFARPC 5.5.X 新版釋出 | 內建 Nacos 與 Hystrix

啟動 RPC 用戶端調用工程:

run com.alipay.sofa.rpc.samples.invoke.InvokeClientApplication           

可以看到調用成功結果,分别代表同步、異步、回調調用成功:

sync
future
callback client process:callback           

2、SOFARPC 獨立內建 Nacos

SOFARPC 獨立使用內建 Nacos 也很簡單,隻需要将注冊中心位址設定為 Nacos 服務位址即可。

引入 SOFARPC:

<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>sofa-rpc-all</artifactId>
    <version>5.5.1</version>
</dependency>           

API 方式釋出服務:

# 構造服務注冊中心配置
RegistryConfig registryConfig = new RegistryConfig()
    .setProtocol("nacos")
    .setSubscribe(true)
    .setAddress("127.0.0.1:8848")
    .setRegister(true);

# 構造服務端口配置
ServerConfig serverConfig = new ServerConfig()
    .setProtocol("bolt")
    .setHost("0.0.0.0")
    .setPort(12200);

# 構造服務釋出者
ProviderConfig<HelloService> providerConfig = new ProviderConfig<HelloService>()
    .setInterfaceId(HelloService.class.getName())
    .setRef(new HelloServiceImpl())
    .setServer(serverConfig)
      .setRegister(true)
    .setRegistry(Lists.newArrayList(registryConfig));
providerConfig.export();           

即可釋出服務至 Nacos Server。

服務容錯支援 Hystrix

在大規模的分布式系統中,一個完整的請求鍊路會跨越多個服務,其中每一個節點出現故障都将放大到全局,輕則造成執行邏輯崩潰,重則消耗掉所有資源拖垮整個系統。

Hystrix 是 Netflix 開源的容錯元件,提供以下功能以解決該問題:

  1. 通過線程池或是信号量對資源進行隔離,避免依賴服務在故障時使用大量資源拖垮整個應用
  2. 使用熔斷器模式(Circuit Breaker pattern)實作請求故障服務的快速失敗(fail-fast),避免故障服務所造成的延時影響整體請求的延時
  3. 提供故障降級(Fallback)使使用者可以編寫優雅降級的政策,防止故障傳遞到上層
  4. 提供準實時的監控名額,使每一個依賴服務的請求結果和延時可觀測

在 SOFARPC 中使用 Hystrix

Hystrix 本身使用指令模式(Command pattern)實作了 API,我們在 SOFARPC 中對其進行了封裝,隻需要簡單配置即可開啟相關功能。

Hystrix 作為 SOFARPC 的可選子產品預設不會進行加載,是以首先需要顯式在項目中添加 Hystrix 依賴:

<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
    <version>1.5.12</version>
</dependency>           

然後通過開關選擇開啟全局的 Hystrix 支援,或是隻對一部分 Consumer 開啟:

// 全局開啟
RpcConfigs.putValue(HystrixConstants.SOFA_HYSTRIX_ENABLED, true);

// 對特定 Consumer 開啟
ConsumerConfig<HelloService> consumerConfig = new ConsumerConfig<HelloService>()
        .setInterfaceId(HelloService.class.getName())
        .setParameter(HystrixConstants.SOFA_HYSTRIX_ENABLED, String.valueOf(true));           

開啟後, Consumer 發起的所有請求都将在 Hystrix 的包裹下運作,可以通過 Hystrix 的配置對這些請求設定逾時、隔離、熔斷、降級等政策。

配置降級政策

Hystrix 支援在出現執行失敗、逾時、熔斷和請求拒絕等場景時進行降級政策,如果要在 SOFARPC 中啟動降級,隻需要設定一個對應接口的實作類即可。

public class HelloServiceFallback implements HelloService {
    @Override
    public String sayHello(String name, int age) {
        return "fallback " + name + " from server! age: " + age;
    }
}

SofaHystrixConfig.registerFallback(consumerConfig, new HelloServiceFallback());           

如果需要更複雜的降級政策,例如通過執行的異常,或是 SofaRequest 中的資訊進行降級邏輯,也可以使用 FallbackFactory 在運作時動态建立一個 Fallback 對象。

public class HelloServiceFallbackFactory implements FallbackFactory<HelloService> {
    @Override
    public HelloService create(FallbackContext context) {
        return new HelloServiceFallback(context.getException(), context.getRequest());
    }
}

SofaHystrixConfig.registerFallbackFactory(consumerConfig, new HelloServiceFallbackFactory());           

和 Spring Cloud 內建

SOFARPC Hystrix 可以很好的與 Spring Cloud Netflix 中預設的 Hystrix 相關元件結合,為 SOFARPC Hystrix 提供額外的配置管理和監控功能。

Hystrix 預設使用 Archaius 作為配置管理,當 Spring Cloud Netflix 也存在時,Archaius 便可以通過 Spring Boot 的配置檔案讀取 Hystrix 的配置,這樣使用者可以很輕松的使用 Spring Boot 強大的配置管理方式(多 Profile 次元、多資料源)以及內建豐富的第三方配置中心支援(Spring Cloud Config、Apollo)。

此外如果項目中使用了 Spring Boot Actuator,Hystrix 就可以通過 Actuator 内置的 /metrics Endpoint 暴露出 RPC 調用的相關名額,包括請求數、成功率和延時等資訊,可以非常友善的內建于現有的監控系統中。

如果使用了 Hystrix Dashboard 或是 Turbine,可以獲得一個開箱即用的可視化面闆将這些名額展示出來,如下圖所示。

SOFARPC 5.5.X 新版釋出 | 內建 Nacos 與 Hystrix

與 Spring Cloud 內建的 Example 可以在 

https://github.com/ScienJus/sofa-rpc-hystrix-with-spring-cloud-example

 中檢視。

和 Fault Tolerance 元件的差別

最後回答一個大家最關心的話題:「SOFARPC 中已經有了一個容錯元件 Fault Tolerance,為什麼還要引入 Hystrix?這兩個元件之間有什麼差別?」

Fault Tolerance 和 Hystrix 最大的差別在于它們所解決的問題不同, Fault Tolerance 提供的是一個負載均衡級别的容錯政策,而 Hystrix 提供的是接口級别的容錯政策。

舉個例子,如果一個接口有三個 Provider 執行個體,其中一個執行個體出現了故障,Fault Tolerance 的容錯會在 Consumer 側将出現故障的 Provider 進行降級,讓 Consumer 盡量通路健康的節點。而 Hystrix 則會計算整個接口的調用成功率,如果錯誤率超出了熔斷的标準,所有請求都會快速失敗并降級。

在一個複雜的分布式系統中,執行個體級别的容錯和接口級别的容錯都是有必要的,是以同時使用 Hystrix 和 Fault Tolerance 并不會有什麼沖突。

更多的序列化和代理方式

本次釋出支援了 bytebuddy 作為動态代理生成的方式,如果有特殊需求的同學,可以通過 API 的方式來使用。

ConsumerConfig<HelloService> consumerConfig = new ConsumerConfig<HelloService>()
        .setInterfaceId(HelloService.class.getName())
        .setProxy("bytebuddy");           

同時支援 jackson 作為序列化方式,對于一些簡單的場景或者測試的場景,可以使用。注意:限制入參隻能是一個對象。

可以通過在 SOFABoot 的服務引用和釋出配置中,設定

serialize-type="json"           

來進行啟用。

Zookeeper 支援 Auth

對于對 Zookeeper 有安全訴求的同學, 我們在這個版本中支援了 Auth 的能力,可以通過 SOFABoot 的配置來開啟。

com.alipay.sofa.rpc.registry.address=zookeeper://xxx:2181?file=/home/admin/registry&scheme=digest&addAuth=sofazk:rpc1           

更多特性

更多特性和增強可以檢視:

Release Note:

https://github.com/alipay/sofa-rpc/releases

緻謝

感謝下列同學對本版本釋出代碼的貢獻,排名不分先後。

@ScienJus

@jewin

 ,

@huangyunbin @zhaojigang @leyou240 @tiansxx @liangyuanpeng @Moriadry @OrezzerO @315157973 @hqq2023623 @wudidapaopao

特别感謝 

 對本文的貢獻。

文中涉及到的相關連結