Share via


使用 Reliable Services 在 Java 中進行服務遠端處理

對於未繫結至特定通訊協定或堆疊 (例如 WebAPI、Windows Communication Foundation (WCF) 或其他項目) 的服務,Reliable Services 架構會提供遠端機制,以便快速且輕鬆設定服務遠端程序呼叫。 本文會討論如何為以 Java 撰寫的服務設定遠端程序呼叫。

設定在服務上的遠端處理

只要兩個簡單步驟,就能設定服務的遠端處理:

  1. 建立服務實作的介面。 這個介面會定義可在您的服務上用於遠端程序呼叫的方法。 方法也必須是傳回工作的非同步方法。 此介面必須實作 microsoft.serviceFabric.services.remoting.Service ,表示服務具有遠端處理介面。
  2. 在您的服務中使用遠端接聽程式。 這是提供遠端功能的 CommunicationListener 實作。 FabricTransportServiceRemotingListener 可以用來使用預設遠端傳輸通訊協定建立遠端接聽程式。

例如,下列無狀態服務服務會公開單一方法,透過遠端程序呼叫取得 "Hello World"。

import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import java.util.List;
import microsoft.servicefabric.services.communication.runtime.ServiceInstanceListener;
import microsoft.servicefabric.services.remoting.Service;
import microsoft.servicefabric.services.runtime.StatelessService;

public interface MyService extends Service {
    CompletableFuture<String> helloWorldAsync();
}

class MyServiceImpl extends StatelessService implements MyService {
    public MyServiceImpl(StatelessServiceContext context) {
       super(context);
    }

    public CompletableFuture<String> helloWorldAsync() {
        return CompletableFuture.completedFuture("Hello!");
    }

    @Override
    protected List<ServiceInstanceListener> createServiceInstanceListeners() {
        ArrayList<ServiceInstanceListener> listeners = new ArrayList<>();
        listeners.add(new ServiceInstanceListener((context) -> {
            return new FabricTransportServiceRemotingListener(context,this);
        }));
        return listeners;
    }
}

注意

服務介面中的引數和傳回類型可以是任何簡單、複雜或自訂的類型,但它們必須可以序列化。

呼叫遠端服務方法

透過 microsoft.serviceFabric.services.remoting.client.ServiceProxyBase 類別使用連至服務的本機 Proxy,可以在服務上使用遠端堆疊呼叫方法。 ServiceProxyBase 方法會使用該服務所實作的相同介面,建立本機 Proxy。 您可以使用該 Proxy 直接在介面上遠端呼叫方法。


MyService helloWorldClient = ServiceProxyBase.create(MyService.class, new URI("fabric:/MyApplication/MyHelloWorldService"));

CompletableFuture<String> message = helloWorldClient.helloWorldAsync();

遠端架構會將在服務擲回的例外狀況傳播給用戶端。 因此在用戶端使用 ServiceProxyBase 的例外狀況處理邏輯,可以直接處理服務擲回的例外狀況。

服務 Proxy 存留期

建立 ServiceProxy 是輕量型作業,因此您可以建立的數目沒有限制。 只要有需要,可以重複使用服務 Proxy 執行個體。 如果遠端程序呼叫擲回例外狀況,您仍然可以重複使用相同的 Proxy 執行個體。 每個 ServiceProxy 都包含用來透過網路傳送訊息的通訊用戶端。 叫用遠端呼叫時,系統會執行內部檢查來判斷通訊用戶端是否有效。 根據這些檢查的結果,系統會在必要情況下重建通訊用戶端。 因此,如果發生例外狀況,您無須重建 ServiceProxy

ServiceProxyFactory 存留期

FabricServiceProxyFactory 是一個為不同的遠端處理介面建立 Proxy 的處理站。 如果您使用 API ServiceProxyBase.create 來建立 Proxy,則架構會建立 FabricServiceProxyFactory。 當您需要覆寫 ServiceRemotingClientFactory 屬性時,手動建立一個會相當有用。 處理站是一項昂貴的作業。 FabricServiceProxyFactory 會維護通訊用戶端的快取。 最佳做法是快取 FabricServiceProxyFactory 的時間愈長愈好。

遠端例外狀況處理

服務 API 擲出的所有遠端例外狀況會以 RuntimeException 或 FabricException 的形式傳送回用戶端。

ServiceProxy 會處理服務分割區 (ServiceProxy 即是為其建立) 的所有容錯移轉列外狀況。 發生容錯移轉例外狀況 (非暫時性例外狀況) 時,ServiceProxy 會重新解析端點,然後以正確的端點再次嘗試呼叫。 容錯移轉例外狀況的重試次數並無限制。 若是發生 TransientExceptions,ServiceProxy 僅會重試呼叫。

預設的重試參數是由 OperationRetrySettings \(英文\) 提供。 您可以將 OperationRetrySettings 物件傳遞至 ServiceProxyFactory 建構函式,來設定這些值。

下一步