SOFAhtml
Scalable Open Financial Architecturegit
是螞蟻金服自主研發的金融級分佈式中間件,包含了構建金融級雲原生架構所需的各個組件,是在金融場景裏錘鍊出來的最佳實踐。github
SOFA 文檔: http://www.sofastack.tech/spring
SOFA: https://github.com/alipayjson
最新的SOFARPC 5.5.1 已經發布啦,本文給你們介紹下 SOFARPC v5.5.x 系列主要提供的特性以及使用方式。安全
SOFARPC 做爲成熟的 RPC 框架,一直致力於給用戶提供穩定可靠的 RPC 框架 以及最自主的選擇權。SOFARPC 的插件擴展機制能夠支持各種實現的可插拔實現。bash
SOFARPC 5.5 主要給開發者們帶來了服務發現的新選擇:Nacos 的集成 與 服務容錯對 Hystrix 的集成。架構
Nacos 是阿里巴巴開源的一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。根據 Nacos 的 Roadmap,0.8.0 已具有生產使用的能力,截止筆者撰稿時間,Nacos 已發佈 0.9.0,距離 1.0.0 愈來愈近了。app
SOFARPC 5.5.0 開始提供對 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的服務端,能夠經過這個地址訪問)
啓動 RPC 客戶端調用工程:
run com.alipay.sofa.rpc.samples.invoke.InvokeClientApplication複製代碼
能夠看到調用成功結果,分別表明同步、異步、回調調用成功:
sync
future
callback client process:callback複製代碼
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 是 Netflix 開源的容錯組件,提供如下功能以解決該問題:
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());複製代碼
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,能夠得到一個開箱即用的可視化面板將這些指標展現出來,以下圖所示。
與 Spring Cloud 集成的 Example 能夠在 github.com/ScienJus/so… 中查看。
最後回答一個你們最關心的話題:「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 的能力,能夠經過 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)