当前位置:  开发笔记 > 运维 > 正文

从群集中的其他应用程序调用服务

如何解决《从群集中的其他应用程序调用服务》经验,为你挑选了1个好方法。

是否可以在Service Fabric Cluster中将服务或参与者从一个应用程序调用到另一个应用程序?当我尝试(使用正确的Uri使用ActorProxy.Create)时,我得到了"没有为界面找到MethodDispatcher"



1> yoape..:

是的,这是可能的.只要您拥有对服务(或ActorService)的正确Uri,并且您可以使用定义服务或参与者的接口访问程序集,那么它与在同一应用程序中调用服务/ Actor不应该有太大的不同.您已启用服务的安全性,然后您还必须为交换设置证书.

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

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

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

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

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

和一个简单的演员:

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

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

    public Task 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(calloutServiceUri);
        var serviceHello = await calloutService.SayHelloAsync();

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

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

唯一棘手的部分是如何从外部服务到您的呼叫服务获得接口?您可以简单地引用要调用的服务的内置.exe,或者您可以将包含该接口的程序集打包为NuGet包并放入私有源.

如果您不这样做而只是在Visual Studio解决方案之间共享代码,Service Fabric会认为这些是两个不同的接口,即使它们共享完全相同的签名.如果您为服务执行此操作,您会得到一个NotImplementedException说法"接口ID'{xxxxxxxx}'未由对象'{service}'"实现,如果您为Actor执行此操作,则会得到一条KeyNotfoundException说法"找不到用于接口ID的MethodDispatcher ' - {XXXXXXXXXX}'".

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


通过已知协议Tcp/fabric与具有已知接口(公开的服务接口)与服务进行通信的方式是与API通信.如果您知道您的客户端是群集中的其他应用程序,那么我认为通过HTTP公开API并没有任何不同,让我们说一下端点的Swagger文档.我会说这取决于您的架构,这些服务可能是内部"核心"服务,提供其他应用程序服务使用的各种常见功能.在这种情况下,我不会说使用面料运输是一个设计问题.
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有