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

前言

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

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

其餘文章

正文

1. 功能特性

  • 透明化、高性能的遠程服務調用
  • 支持多種服務路由及負載均衡策略
  • 支持多種註冊中心的集成
  • 支持 bolt、rest、dubbo 等多種通訊協議
  • 支持同步、單向、回調、泛化等多種調用方式
  • 支持集羣容錯、服務預熱、自動故障隔離
  • 強大的擴展功能,能夠按需擴展各個功能組件

2. 實現原理

a. 服務發佈多線程

當一個 SOFARPC 的應用啓動的時候,若是發現當前應用須要發佈 RPC 服務的話,那麼 SOFARPC 會將這些服務註冊到服務註冊中心上。如圖中 Service 指向 Registry。架構

b. 服務訂閱app

當引用這個服務的 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。


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

零壹技術棧

本賬號將持續分享後端技術乾貨,包括虛擬機基礎,多線程編程,高性能框架,異步、緩存和消息中間件,分佈式和微服務,架構學習和進階等學習資料和文章。

相關文章
相關標籤/搜索