SOFARPC 最先源於阿里內部的 HSF,是近期螞蟻金服開源的一個高可擴展性、高性能、生產級的 Java RPC 框架。SOFA-RPC 在螞蟻金服已經歷了十多年的發展,致力於簡化應用之間的 RPC 調用。爲應用提供方便透明、穩定高效的點對點遠程服務調用方案。html
爲了用戶和開發者方便的進行功能擴展,SOFA-RPC 提供了豐富的模型抽象和可擴展接口,包括過濾器、路由、負載均衡等。同時圍繞 SOFA-RPC 框架及其周邊組件提供豐富的微服務治理方案。java
a. 服務發佈多線程
當一個 SOFARPC 的應用啓動的時候,若是發現當前應用須要發佈 RPC 服務的話,那麼 SOFARPC 會將這些服務註冊到服務註冊中心上。如圖中 Service 指向 Registry。架構
b. 服務訂閱app
當引用這個服務的 SOFARPC 應用啓動時,會從服務註冊中心訂閱到相應服務的元數據信息。服務註冊中心收到訂閱請求後,會將發佈方的元數據列表實時推送給服務引用方。如圖中 Registry 指向 Reference。負載均衡
c. 服務調用
當服務引用方拿到地址之後,就能夠從中選取地址發起調用了。如圖中 Reference 指向 Service。
<dependencies>
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofa-rpc-all</artifactId>
<version>5.3.1</version>
</dependency>
</dependencies>
複製代碼
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 + " !";
}
}
複製代碼
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.
複製代碼
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。
歡迎關注技術公衆號: 零壹技術棧
本賬號將持續分享後端技術乾貨,包括虛擬機基礎,多線程編程,高性能框架,異步、緩存和消息中間件,分佈式和微服務,架構學習和進階等學習資料和文章。