如何设置可靠的服务以在 Azure 远程集群上工作
How to set up reliable services to work on Azure remote cluster
我制作了一个可靠的服务应用程序,可以在本地集群上完美运行。
它有 1 个无状态服务和 1 个参与者服务,并且都使用服务远程处理。
没有在这些服务上定义端点(只有端点名称)并且两个服务都使用默认侦听器(没有 CreateServicesListeners 覆盖)
客户端应用程序是一个控制台应用程序,它使用远程服务与应用程序(ActorProxy 和 ServiceProxy)进行通信。
现在我想将它部署到 Azure 集群上。
我应该怎么做才能使客户端与集群上的应用程序正确通信?
我知道我必须:
- 在设置中配置 TCP 端点xml
- 配置 Azure 负载均衡器
但是我应该这样做吗?在那种情况下如何?
- 覆盖 CreateServiceListeners
- 在客户端使用 FabricClient
- 在客户端上使用 ServicePartitionClient
我的主要问题是如何创建ActorProxy和ServiceProxy
您不应在集群外使用 ActorProxy 和 ServiceProxy 类。而是使用面向 public 的服务,例如使用 https 作为服务网关的 Web Api。然后在Azure Load Balancer上打开https端口。
请阅读 the docs,因为它们列出了您需要执行的每个步骤。
这是一个使用 https 的服务示例(取自文档):
class HttpCommunicationListener : ICommunicationListener
{
...
public Task<string> OpenAsync(CancellationToken cancellationToken)
{
EndpointResourceDescription endpoint =
serviceContext.CodePackageActivationContext.GetEndpoint("WebEndpoint");
string uriPrefix = $"{endpoint.Protocol}://+:{endpoint.Port}/myapp/";
this.httpListener = new HttpListener();
this.httpListener.Prefixes.Add(uriPrefix);
this.httpListener.Start();
string publishUri = uriPrefix.Replace("+", FabricRuntime.GetNodeContext().IPAddressOrFQDN);
return Task.FromResult(publishUri);
}
...
}
class WebService : StatelessService
{
...
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[] { new ServiceInstanceListener(context => new HttpCommunicationListener(context))};
}
...
}
像上面那样的 public 服务应该使用 ActorProxy 和 ServiceProxy 类 将工作委托给底层服务和参与者。
总结一下:
But should I so some of these things? And in that case how?
Override CreateServiceListeners Yes
Use FabricClient on client No
Use ServicePartitionClient on client No
My main problem is how to create ActorProxy and ServiceProxy This only applies for communication between services in the cluster
我制作了一个可靠的服务应用程序,可以在本地集群上完美运行。
它有 1 个无状态服务和 1 个参与者服务,并且都使用服务远程处理。 没有在这些服务上定义端点(只有端点名称)并且两个服务都使用默认侦听器(没有 CreateServicesListeners 覆盖) 客户端应用程序是一个控制台应用程序,它使用远程服务与应用程序(ActorProxy 和 ServiceProxy)进行通信。
现在我想将它部署到 Azure 集群上。
我应该怎么做才能使客户端与集群上的应用程序正确通信?
我知道我必须:
- 在设置中配置 TCP 端点xml
- 配置 Azure 负载均衡器
但是我应该这样做吗?在那种情况下如何?
- 覆盖 CreateServiceListeners
- 在客户端使用 FabricClient
- 在客户端上使用 ServicePartitionClient
我的主要问题是如何创建ActorProxy和ServiceProxy
您不应在集群外使用 ActorProxy 和 ServiceProxy 类。而是使用面向 public 的服务,例如使用 https 作为服务网关的 Web Api。然后在Azure Load Balancer上打开https端口。
请阅读 the docs,因为它们列出了您需要执行的每个步骤。
这是一个使用 https 的服务示例(取自文档):
class HttpCommunicationListener : ICommunicationListener
{
...
public Task<string> OpenAsync(CancellationToken cancellationToken)
{
EndpointResourceDescription endpoint =
serviceContext.CodePackageActivationContext.GetEndpoint("WebEndpoint");
string uriPrefix = $"{endpoint.Protocol}://+:{endpoint.Port}/myapp/";
this.httpListener = new HttpListener();
this.httpListener.Prefixes.Add(uriPrefix);
this.httpListener.Start();
string publishUri = uriPrefix.Replace("+", FabricRuntime.GetNodeContext().IPAddressOrFQDN);
return Task.FromResult(publishUri);
}
...
}
class WebService : StatelessService
{
...
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[] { new ServiceInstanceListener(context => new HttpCommunicationListener(context))};
}
...
}
像上面那样的 public 服务应该使用 ActorProxy 和 ServiceProxy 类 将工作委托给底层服务和参与者。
总结一下:
But should I so some of these things? And in that case how?
Override CreateServiceListeners Yes
Use FabricClient on client No
Use ServicePartitionClient on client No
My main problem is how to create ActorProxy and ServiceProxy This only applies for communication between services in the cluster