gpt4 book ai didi

azure-service-fabric - 从集群中的其他应用程序调用服务

转载 作者:行者123 更新时间:2023-12-02 08:16:17 25 4
gpt4 key购买 nike

是否可以在 Service Fabric 集群中将服务或参与者从一个应用程序调用到另一个应用程序?当我尝试(使用 ActorProxy.Create 和正确的 Uri)时,我得到了一个“没有找到接口(interface)的 MethodDispatcher”

最佳答案

是的,这是可能的。只要您拥有服务(或 ActorService)的正确 Uri,并且您可以访问具有定义您的服务或参与者的接口(interface)的程序集,它与调用服务/参与者应该没有太大区别从同一个应用程序中。你有enabled security for your service然后您还必须为交易所设置证书。

如果我有一个简单的服务定义为:

public interface ICalloutService : IService
{
Task<string> SayHelloAsync();
}

internal sealed class CalloutService : StatelessService, ICalloutService
{
public CalloutService(StatelessServiceContext context)
: base(context) { }

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
yield return new ServiceInstanceListener(this.CreateServiceRemotingListener);
}

public Task<string> SayHelloAsync()
{
return Task.FromResult("hello");
}
}

和一个简单的 Actor :

public interface ICalloutActor : IActor
{
Task<string> SayHelloAsync();
}

[StatePersistence(StatePersistence.None)]
internal class CalloutActor : Actor, ICalloutActor
{
public CalloutActor(ActorService actorService, ActorId actorId)
: base(actorService, actorId) {}

public Task<string> SayHelloAsync()
{
return Task.FromResult("hello");
}
}

在这样的应用程序中运行:

Service Fabric Explorer

然后您可以从同一集群中的另一个应用程序调用它:

        // Call the service
var calloutServiceUri = new Uri(@"fabric:/ServiceFabric.SO.Answer._41655575/CalloutService");
var calloutService = ServiceProxy.Create<ICalloutService>(calloutServiceUri);
var serviceHello = await calloutService.SayHelloAsync();

// Call the actor
var calloutActorServiceUri = new Uri(@"fabric:/ServiceFabric.SO.Answer._41655575/CalloutActorService");
var calloutActor = ActorProxy.Create<ICalloutActor>(new ActorId(DateTime.Now.Millisecond), calloutActorServiceUri);
var actorHello = await calloutActor.SayHelloAsync();

如果您单击服务并查看名称,您可以在 Service Fabric Explorer 中找到正确的 URI。默认情况下,服务的 URI 是:fabric:/{applicationName}/{serviceName}

唯一棘手的部分是如何获得从外部服务到调用服务的接口(interface)?您可以简单地为您希望调用的服务引用构建的 .exe,或者您可以将包含接口(interface)的程序集打包为 NuGet 包并放在私有(private)源上。

如果您不这样做,而只是在 Visual Studio 解决方案之间共享代码,Service Fabric 会认为这是两个不同的接口(interface),即使它们共享完全相同的签名。如果你为服务做这件事,你会得到一个 NotImplementedException 说“接口(interface) id '{xxxxxxxx}' 没有被对象 '{service}' 实现”,如果你为一个 Actor 做这件事,你会得到一个 KeyNotfoundException 说“没有找到接口(interface) ID '-{xxxxxxxxxx}' 的 MethodDispatcher”。

因此,要解决您的问题,请确保您在调用的外部应用程序中引用了您要调用的应用程序中的同一程序集。

关于azure-service-fabric - 从集群中的其他应用程序调用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41655575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com