我擁有的目標是運行多個應用程序並將一些元數據嵌入到應用程序/服務中,以便我可以使用元數據查詢應用程序/服務。這可能嗎?使用Service Fabric應用程序/服務嵌入自定義元數據
我在看以下post和答案暗示這種可能性,但沒有具體細節如何實現結果。
我擁有的目標是運行多個應用程序並將一些元數據嵌入到應用程序/服務中,以便我可以使用元數據查詢應用程序/服務。這可能嗎?使用Service Fabric應用程序/服務嵌入自定義元數據
我在看以下post和答案暗示這種可能性,但沒有具體細節如何實現結果。
你得到的主要「元數據」是服務/應用程序實例名稱。這就是我在其他post中談到的。工作方式是創建每個服務/應用程序實例,其名稱包含客戶端解析時可以使用的一些信息。然後,客戶端可以向服務結構查詢命名的應用程序/服務實例並連接到特定的應用程序/服務/應用程序實例名稱是URI,因此您可以使用路徑層次來對信息進行分類。
繼續使用音頻/視頻示例:讓我們擴展該示例,以便我們有一個應用程序可以針對音頻或視頻的特定媒體格式執行特定任務。任務+媒體格式的每個組合是一個獨特的命名服務實例,導致部署,看起來是這樣的:
Application:
fabric:/avapp
Services:
fabric:/avapp/video/encoding/mp4
fabric:/avapp/video/encoding/h264
fabric:/avapp/video/captioning/english
fabric:/avapp/video/captioning/czech
fabric:/avapp/audio/encoding/aac
fabric:/avapp/audio/encoding/mp3
etc.
現在,客戶可以查詢服務織物來發現哪些服務:
FabricClient fabricClient = new FabricClient();
System.Fabric.Query.ServiceList services = await fabricClient.QueryManager.GetServiceListAsync(new Uri("fabric:/avapp"));
然後,您可以簡單地使用LINQ查詢服務列表。例如,如果我想看到的是做視頻編碼的所有服務:
services.Where(x => x.ServiceName.AbsolutePath.Contains("video/encoding"));
然後你就可以解析地址爲特定服務連接到它:
ServicePartitionResolver resolver = ServicePartitionResolver.GetDefault();
ResolvedServicePartition servicePartition = await resolver.ResolveAsync(new Uri("fabric:/avapp/video/encoding/h264"), new ServicePartitionKey(1), cancellationToken);
ResolvedServiceEndpoint endpoint = servicePartition.GetEndpoint();
還有更多一點地址解析部分(see here),但這是一般的想法。
應用程序實例還允許您設置可在創建時爲每個實例設置的自定義應用程序參數(鍵值對)。它們不會顯示在應用程序名稱中,但當您向服務結構請求正在運行的應用程序實例列表時,會將該信息返回。當客戶需要決定要連接的應用程序時,它可能也會被用作元數據。
更新:應用實例參數更多信息:
當你create a new application instance可以在application description提供一組鍵 - 值對。然後,當您query Service Fabric for application instances時,您將返回具有上述參數的Application結果對象的列表。這也在Visual Studio中顯示,在您的應用程序項目中,您具有特定於環境的應用程序參數文件。 Visual Studio會從XML文件中提取這些鍵值對,並在創建應用程序實例時將它們用於應用程序描述中。
了不起的信息,非常感謝。您能否指出哪裏可以找到關於鍵/值對和查詢的信息?那種情況正是我可能最終要做的。 –
沒問題,更新我的答案,更多關於應用程序參數的信息。 –
令人驚歎!感謝您的詳細信息。尤其是提到代碼和清單方法。 –
當你使用元數據查詢說應用/服務,你的意思是讓客戶來搜索基於元數據提供特定服務?你有沒有一個你想要做什麼的具體例子? –
正確。在我引用的文章中,您提到了fabric:// app/service/property uri,我不確定如何獲得這個結果以及什麼是「屬性」值。例如:可能有多個屬於邏輯「環境」的應用程序。如果需要查詢所有這些服務,我將如何處理它並不明確。這就是爲什麼我在考慮自定義元數據。 –
@VaclavTurecek是你想澄清的嗎? –