c# - Service Fabric Web Api 具有外部和内部端点

标签 c# azure asp.net-web-api azure-service-fabric

一些背景:

我们有一个 Service Fabric 应用程序,其中包含2 个 WebApi 服务(以及其他服务)。第一个是我们实际的前端 API,第二个是针对某些特定客户端的第一个 API 的代理。两个 WebApi 都通过不同的端口向公众公开。对于通信,我们使用了服务模板附带的 OwinCommunicationListener(我们只是将其调整为允许使用 https )。当客户端调用代理API时,我们当前使用的是HttpClient,它正在调用实际API的公共(public)IP地址。

这显然没有意义,因为两个 WebApi 都托管在同一台计算机上,因此我们希望通信在本地进行,而不是通过互联网。对于从 API 到其他微服务的通信,我们使用内置的 ServiceProxy(强类型 RPC)。目前我们的前端 API 有两个监听器(http、https)。

为了实现我们的目标(API 具有 2 个公共(public) http(s) 端点和一个内部端点),我们想到了将 RPC 监听器与 http 监听器一起添加到监听器列表中。因此,在这种情况下,API 将有 2 个用于公共(public)流量的 http 监听器和 1 个用于内部流量的 RPC。在这种情况下,我们将主要 API 重构为继承自

IService

,然后我们调整了 CreateServiceInstanceListeners 函数,使其看起来像这样:

enter image description here

现在,当我运行应用程序时,主 Web API(现在从 IService 继承的 API)永远不会启动 - 在诊断窗口中我可以看到创建监听器的无限循环。这是否意味着不能同时使用 http 监听器和内部强类型 RPC 或者我遗漏了一些东西?

我已阅读有关使用命名服务进行服务解析的信息,但是我找不到任何适合我的情况的文档或示例。

我真正需要做的是获取其他服务的本地地址,以便我可以通过 http 在本地调用它 - 这是我可以通过查询命名服务来实现的吗?或者也许我可以只使用本地主机地址?(无论如何,负载在前面是平衡的,所以我想此时不需要它,所以我可以在同一节点上调用服务)

最佳答案

创建多个通信监听器时,请确保按如下方式命名它们:

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
        {
            yield return new ServiceInstanceListener(p => new SubscriberCommunicationListener(this, p), "StatelessSubscriberCommunicationListener");
            yield return new ServiceInstanceListener(context => new FabricTransportServiceRemotingListener(context, this), "StatelessFabricTransportServiceRemotingListener");
        }

以下是使用名称创建代理的代码:

var subStateless = ServiceProxy.Create<ISubscribingStatelessService>(new    
    Uri("fabric:/MyServiceFabricApp/SubscribingStatelessService"),
    listenerName: "StatelessFabricTransportServiceRemotingListener");

Here's示例实现。

关于c# - Service Fabric Web Api 具有外部和内部端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43407747/

相关文章:

c# - odata 深层次扩展不起作用

c# - 可以相信 Page_Unload 将始终运行并且是放置 Dispose() 代码的好地方吗?

c# - 性能计数器 - 每分钟速率类型?

c# - 选择投影中的索引

c# - 如何将消息放入死信并在azure函数中经过一段时间后处理它

java - 适用于 Android 的 Azure 通知中心 : How do I handle Data-Messages with a Background-Service?

asp.net-web-api - 如何在 Kubernetes 的 pod 中限制 .net core 应用程序的内存大小?

c# - "Only catch exceptions you can handle"到底是什么意思?

用于获取 VM 价格的 Azure Ratecard Api

c# - 带有 Swagger 文档的可选 Web API 路由参数