使用 WCF 通信部署的 Service Fabric 服务
Posted
技术标签:
【中文标题】使用 WCF 通信部署的 Service Fabric 服务【英文标题】:Service Fabric service with WCF communication deployment 【发布时间】:2018-03-13 11:34:58 【问题描述】:这是一个带有 WCF 通信的简单 Service Fabric 无状态服务及其客户端 - 一个控制台应用。它在本地集群上运行良好,客户端从服务中获得响应。但是如果我将它部署在云中,我不知道如何与服务通信。我应该怎么做才能从控制台应用程序访问它?
带有 WCF 通信的 SF 无状态服务:
合同:
[ServiceContract]
public interface IPresidentialService
[OperationContract]
Task<string> GetInfo();
服务:
internal sealed class PresidentialService : StatelessService, IPresidentialService
public PresidentialService(StatelessServiceContext context) : base(context)
public Task<string> GetInfo() => Task.FromResult($"Node Context.NodeContext.NodeName operating");
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
return new[]
new ServiceInstanceListener(context =>
new WcfCommunicationListener<IPresidentialService>(wcfServiceObject: this, serviceContext: context,
endpointResourceName: "WcfServiceEndpoint",
listenerBinding: WcfUtility.CreateTcpListenerBinding()))
;
客户端控制台应用:
WCF 客户端:
public class PresidentialServiceClient : ServicePartitionClient<WcfCommunicationClient<IPresidentialService>>
public PresidentialServiceClient(
ICommunicationClientFactory<WcfCommunicationClient<IPresidentialService>> communicationClientFactory,
Uri serviceUri, ServicePartitionKey partitionKey = null,
TargetReplicaSelector targetReplicaSelector = TargetReplicaSelector.Default, string listenerName = null,
OperationRetrySettings retrySettings = null) : base(communicationClientFactory, serviceUri, partitionKey,
targetReplicaSelector, listenerName, retrySettings)
public Task<string> GetInfo() => InvokeWithRetryAsync(client => client.Channel.GetInfo());
客户端应用:
private static void Main(string[] args)
var binding = WcfUtility.CreateTcpClientBinding();
var partitionResolver = ServicePartitionResolver.GetDefault();
var wcfClientFactory =
new WcfCommunicationClientFactory<IPresidentialService>(binding,
servicePartitionResolver: partitionResolver);
var serviceUri = new Uri("fabric:/Application5/PresidentialService");
var client = new PresidentialServiceClient(wcfClientFactory, serviceUri, ServicePartitionKey.Singleton);
do
Console.WriteLine(client.GetInfo().Result);
Console.ReadKey();
while (true);
添加到ServiceManifest.xml
:
<Endpoints>
<Endpoint Name="WcfServiceEndpoint" />
</Endpoints>
更新
已更改ServicePartitionResolver
:
var partitionResolver = new ServicePartitionResolver("sfapp.westeurope.cloudapp.azure.com:19000");
还是不行。
更新
为 TCP 端口 777 添加了负载均衡器规则。
【问题讨论】:
【参考方案1】:服务在云端运行时,不能使用默认解析器。
默认的 ServicePartitionResolver 假定客户端是 与服务在同一个集群中运行。如果不是这样, 创建一个ServicePartitionResolver对象并传入集群 连接端点。
试试something点赞
ServicePartitionResolver resolver = new ServicePartitionResolver("mycluster.cloudapp.azure.com:19000");
https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-communication-wcf
【讨论】:
请举例说明如何使用另一个解析器。 您使用的是安全集群吗?如果是这样,您需要提供凭据。 不,集群不安全。 服务在哪个端口运行,你在负载均衡器中打开了吗? 是的,TCP 端口 777。我是否应该像这样更改ServiceManifest.xls
中的端点:<Endpoint Name="WcfServiceEndpoint" Protocol="tcp" Port="777" />
?以上是关于使用 WCF 通信部署的 Service Fabric 服务的主要内容,如果未能解决你的问题,请参考以下文章
在 Linux 中创建 Azure Service Fabric 本地集群