螞蟻金服RPC框架SOFA-RPC - 初體驗

weixin_34402408發表於2018-09-14

前言

SOFARPC 最早源於阿里內部的 HSF,是近期螞蟻金服開源的一個高可擴充套件性、高效能、生產級的 Java RPC 框架。SOFA-RPC 在螞蟻金服已經歷了十多年的發展,致力於簡化應用之間的 RPC 呼叫。為應用提供方便透明、穩定高效的點對點遠端服務呼叫方案。

12738336-134452372e94facd.JPG
image

為了使用者和開發者方便的進行功能擴充套件,SOFA-RPC 提供了豐富的模型抽象和可擴充套件介面,包括過濾器、路由、負載均衡等。同時圍繞 SOFA-RPC 框架及其周邊元件提供豐富的微服務治理方案。

正文

1. 功能特性

  • 透明化、高效能的遠端服務呼叫
  • 支援多種服務路由及負載均衡策略
  • 支援多種註冊中心的整合
  • 支援 bolt、rest、dubbo 等多種通訊協議
  • 支援同步、單向、回撥、泛化等多種呼叫方式
  • 支援叢集容錯、服務預熱、自動故障隔離
  • 強大的擴充套件功能,可以按需擴充套件各個功能元件

2. 實現原理

12738336-87219d7d798501ba.png
image

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。


歡迎關注技術公眾號: 零壹技術棧

10548396-035e78bdc34c7525
零壹技術棧

本帳號將持續分享後端技術乾貨,包括虛擬機器基礎,多執行緒程式設計,高效能框架,非同步、快取和訊息中介軟體,分散式和微服務,架構學習和進階等學習資料和文章。

相關文章