Service Fabric多个通信监听器

时间:2016-01-17 07:31:08

标签: azure-service-fabric

基本思想 - 我有一个无状态服务,通过http实现Owin通信监听器,为基于WebApi的公共客户端提供服务。我想添加第二个侦听器,它将使用内置的ServiceRemotingListener()通过Rpc在集群内接收请求。原因是我不希望这个监听器公开,因为它为无状态服务实现了非公共管理接口。这是设置......:

        protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        return new[]
        {
            new ServiceInstanceListener(initParams => new OwinCommunicationListener("MyWebService", new Startup(_options, this), initParams),"MyServiceHttp"),
            new ServiceInstanceListener(initParams => new ServiceRemotingListener<Interfaces.IConfig>(initParams, this),"MyServiceRpc")           
        };
    }

当我添加第二个监听器时,我得到启动应用程序的异常......

                 this.serverHandle = WebApp.Start(this.listeningAddress, appBuilder => this.startup.Configuration(appBuilder));
  

抛出异常:&#39; System.Net.Sockets.SocketException&#39;在System.dll中   抛出异常:&#39; System.ServiceModel.CommunicationException&#39;在System.ServiceModel.dll中   抛出异常:&#39; System.ServiceModel.CommunicationException&#39;在System.ServiceModel.dll中   抛出异常:&#39; System.ServiceModel.CommunicationException&#39;在System.ServiceModel.Internals.dll中    - 多次重复---   抛出异常:&#39; System.ServiceModel.CommunicationException&#39;在System.Fabric.dll

(不知道如何获取异常详情。我的&#34;尝试{}&#34;周围  没有捕获异常。)

一旦处于此状态,我会在服务尝试自动重启时获得后续异常 - 错误与端口共享有关。

我能做些什么来使WebApi通信监听器与ServiceRemotingListener一起工作?我现在假设在引擎盖下,ServiceRemotingListener也在使用http,而且他们不能很好地一起玩。

1 个答案:

答案 0 :(得分:7)

好吧,解决方案结果是直截了当但不明显。即使TCP / RPC和HTTP不能一起玩,文档也似乎鼓励端口共享方法。

基本上,我在服务清单中添加了第二个端点,即使文档说每个服务只能在一个端口上侦听。

我离开ServiceRemotingListener的默认/第一个端点进行注册,并添加了一个专门侦听端口8083的端点。

<Endpoint Name="ServiceEndpoint" Protocol="http" Type ="Input"/>
<Endpoint Name="ServiceEndpoint2" Protocol="http" Port="8083" Type ="Input"/>

然后在IOwinCommunicationsListener中的,我指定了第二个端点,它选择了备用端口号(我假设ServiceInstanceListener将使用默认/第一个端点)。

var codePackageActivationContext = this.serviceInitializationParameters.CodePackageActivationContext;
var port = codePackageActivationContext.GetEndpoint("ServiceEndpoint2").Port;

CreateServiceInstanceListeners没有任何额外的配置。如上所述,我想知道是否可以使用ServiceRemoteListenerSettings强制ServiceRemotinglistener使用替代端口而不是上面的IOwinCommunicationsListener)

        return new[]
        {
            new ServiceInstanceListener(initParams => new ServiceRemotingListener<Interfaces.IConfig>(initParams, this),"MyRpc"),
            new ServiceInstanceListener(initParams => new OwinCommunicationListener("ShopifyWebService", new Startup(_options, this), initParams),"MyOwin")
               };

希望这有助于为其他人节省大量时间。