2015-12-02 43 views
3

我希望能夠從非結構應用程序或服務調用有狀態的HTTP/WebApi服務。我可以使用發佈的有狀態服務的URL,但希望通過解析分區端點來將故障轉移到另一個主服務器。從Fabric外部使用Service Fabric CommunicationClient和servicePartitionClient?

我首先嚐試在桌面控制檯應用程序中進行測試,但未能在InvokeWithRetryAsync中執行通信Lambda函數。

這是死路一條(非光纖應用程序無法解析有狀態的服務),還是有另一種方法來解析來自非光纖應用程序的端點。否則,我可能會將請求包裝在「中間人」無狀態服務(如Wordcount Webservice)中。

 var result = await servicePartitionClient.InvokeWithRetryAsync(
      client => 
      { 
       //never reaches here. 
       Uri serviceAddress = new Uri(client.BaseAddress, "SetConfiguration"); 

       HttpWebRequest request = WebRequest.CreateHttp(serviceAddress); 
       request.Method = "POST"; 

       //Add the content into the body 
       byte[] byteArray = Encoding.UTF8.GetBytes(_datapacket); 
       request.ContentType = "application/json"; 
       request.ContentLength = byteArray.Length; 
       Stream dataStream = request.GetRequestStream(); 
       dataStream.Write(byteArray, 0, byteArray.Length); 
       dataStream.Close(); 


       request.Timeout = (int)client.OperationTimeout.TotalMilliseconds; 
       request.ReadWriteTimeout = (int)client.ReadWriteTimeout.TotalMilliseconds; 

       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
       //for now, just return ok 
       return Task.FromResult<string>("ok"); 

      }); 

回答

4

這已經有一段時間,因爲我嘗試這樣做,但結果應該是一樣的:建立一個無狀態的服務來充當網關,您的狀態服務。

我遇到的問題首先是連接到集羣 - 如果它是一個安全集羣,那麼您需要加載客戶端證書,以便建立安全連接。

解決此問題後,您可能會遇到命名服務將分區解析爲本地地址的問題,而不是可以從羣集外部解析的地址。

所以最終的結果是我們構建了一個可以作爲典型REST API訪問的無狀態服務,將羣集中的抽象分區移動到此層。

+0

感謝您爲我節省安全凸起。 – MarkD

2

是的,在Service Fabric羣集以外運行的非服務Fabric應用程序可以絕對與Service Fabric應用程序通信。服務結構本身不會施加任何限制,因爲它是您的服務本身打開通信端點(最終,您的服務僅在EXE中運行,並且可以像您之前編寫的任何EXE一樣監聽地址和端口) 。當您使用通信客戶端API(如ServicePartitionClient)時,您只需要命名服務來解析服務的地址和端口,然後您可以像平常那樣連接到該服務。

有兩個潛在的問題,當你有一個客戶端的服務織物羣集之外:

  1. 你的客戶是否有訪問羣集,因此它可以傾訴的命名服務?如果您的集羣使用證書進行安全保護,則需要在客戶端使用該證書連接到命名服務。
  2. 您的服務端點在集羣外部是否可見?通常,對於有狀態服務,您將從端口範圍分配一個端口。如果您的羣集在Azure中運行,則此端口範圍僅限內部使用,不會通過Azure負載平衡器公開。如果您正在託管自己的集羣,您可以設置這個以讓客戶通過您的LB,但是您應該考慮您是否真的希望允許客戶這樣做。

因此,Darran提到的最簡單的解決方案通常是擁有一個無狀態的服務,作爲客戶端請求的入口點。一旦你在集羣「內部」,你不再有這些問題。

+0

我無法理解爲什麼我無法連接。這是一個本地集羣,所以Azure不應阻礙。症狀出現在單步調試器並調用InvokeWithRetryAsync時,匿名函數中的斷點未被命中。對InvokeWithRetryAsync的調用沒有返回。我在無狀態服務中使用完全相同的代碼,並且它正常工作。這可能是很多不同的問題,但一般根據你和Darren的建議將有狀態的svc包裝在無狀態的svc中。謝謝! – MarkD

相關問題