SOFARPC 5.5.X 新版釋出 | 整合 Nacos 與 Hystrix

螞蟻金服分散式架構發表於2019-03-06

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 git@github.com: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 可以在 github.com/ScienJus/so… 中檢視。

和 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:github.com/alipay/sofa…


致謝

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

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

特別感謝 @ScienJus 對本文的貢獻。


文中涉及到的相關連結

公眾號:金融級分散式架構(Antfin_SOFA)


相關文章