前言
SOFARPC 最早源於阿里內部的 HSF,是近期螞蟻金服開源的一個高可擴充套件性、高效能、生產級的 Java RPC 框架。SOFA-RPC 在螞蟻金服已經歷了十多年的發展,致力於簡化應用之間的 RPC 呼叫。為應用提供方便透明、穩定高效的點對點遠端服務呼叫方案。
為了使用者和開發者方便的進行功能擴充套件,SOFA-RPC 提供了豐富的模型抽象和可擴充套件介面,包括過濾器、路由、負載均衡等。同時圍繞 SOFA-RPC 框架及其周邊元件提供豐富的微服務治理方案。
其他文章
正文
1. 功能特性
- 透明化、高效能的遠端服務呼叫
- 支援多種服務路由及負載均衡策略
- 支援多種註冊中心的整合
- 支援 bolt、rest、dubbo 等多種通訊協議
- 支援同步、單向、回撥、泛化等多種呼叫方式
- 支援叢集容錯、服務預熱、自動故障隔離
- 強大的擴充套件功能,可以按需擴充套件各個功能元件
2. 實現原理
a. 服務釋出
當一個 SOFARPC 的應用啟動的時候,如果發現當前應用需要釋出 RPC 服務的話,那麼 SOFARPC 會將這些服務註冊到服務註冊中心上。如圖中 Service 指向 Registry。
b. 服務訂閱
當引用這個服務的 SOFARPC 應用啟動時,會從服務註冊中心訂閱到相應服務的後設資料資訊。服務註冊中心收到訂閱請求後,會將釋出方的後設資料列表實時推送給服務引用方。如圖中 Registry 指向 Reference。
c. 服務呼叫
當服務引用方拿到地址以後,就可以從中選取地址發起呼叫了。如圖中 Reference 指向 Service。
3. 快速開始
3.1. 引入sofa-rpc依賴
<dependencies>
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofa-rpc-all</artifactId>
<version>5.3.1</version>
</dependency>
</dependencies>
複製程式碼
3.2. 編寫服務介面和服務實現類
HelloService.java
public interface HelloService {
String sayHello(String string);
}
複製程式碼
HelloServiceImpl.java
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String string) {
System.out.println("Server receive: " + string);
return "hello " + string + " !";
}
}
複製程式碼
3.3. 編寫服務提供者啟動類
QuickStartServer.java
public class QuickStartServer {
public static void main(String[] args) {
ServerConfig serverConfig = new ServerConfig()
.setProtocol("bolt") // 設定一個協議,預設bolt
.setPort(9696) // 設定一個埠,預設12200
.setDaemon(false); // 非守護執行緒
ProviderConfig<HelloService> providerConfig = new ProviderConfig<HelloService>()
.setInterfaceId(HelloService.class.getName()) // 指定介面
.setRef(new HelloServiceImpl()) // 指定實現
.setServer(serverConfig); // 指定服務端
providerConfig.export(); // 釋出服務
}
}
複製程式碼
執行服務端提供方,日誌輸出如下:
Sofa-Middleware-Log SLF4J Warn : No log util is usable, Default app logger will be used.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Sofa-Middleware-Log SLF4J Warn : No log util is usable, Default app logger will be used.
複製程式碼
3.4. 編寫服務消費者啟動類
QuickStartClient.java
public class QuickStartClient {
public static void main(String[] args) {
ConsumerConfig<HelloService> consumerConfig = new ConsumerConfig<HelloService>()
.setInterfaceId(HelloService.class.getName()) // 指定介面
.setProtocol("bolt") // 指定協議
.setDirectUrl("bolt://127.0.0.1:9696"); // 指定直連地址
HelloService helloService = consumerConfig.refer();
while (true) {
System.out.println(helloService.sayHello("world"));
try {
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
複製程式碼
執行服務端消費方,呼叫服務提供方:
- 服務提供方日誌輸出如下:
Server receive: world
Server receive: world
Server receive: world
Server receive: world
複製程式碼
- 服務消費方日誌輸出如下:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Sofa-Middleware-Log SLF4J Warn : No log util is usable, Default app logger will be used.
Sofa-Middleware-Log SLF4J Warn : No log util is usable, Default app logger will be used.
hello world !
hello world !
hello world !
hello world !
複製程式碼
小結
這是一個快速入門的例子!
可以發現,在使用上,SOFA-RPC 與淘寶的 Dubbo,微博的 Motan 並無太大的區別。Dubbo 作為整套服務治理而存在,而 SOFA-RPC 只是一款輕量級的 RPC 框架,基於 HSF 框架改造,提供更加完善、強大的、多樣化 RPC 程式設計 API。
歡迎關注技術公眾號: 零壹技術棧
本帳號將持續分享後端技術乾貨,包括虛擬機器基礎,多執行緒程式設計,高效能框架,非同步、快取和訊息中介軟體,分散式和微服務,架構學習和進階等學習資料和文章。