在多个.NET应用程序之间进行通信的最有效方式

在多个.NET应用程序之间进行通信的最有效方式,.net,rest,azure,architecture,microservices,.net,Rest,Azure,Architecture,Microservices,目前我有一个设置,我的客户端(web应用程序、iOS应用程序等)通过REST调用与我的后端API.NET web应用程序(Nancy)对话。没什么特别的 我现在需要将这个API拆分为微服务,每个服务都可以单独升级/部署 我的主API(public)将只执行身份验证,然后调用我的一个微服务,它将位于我的专用网络中 我的主API和其他微服务API之间的通信方式有哪些不同?每种方法的优缺点? 通信需要实时-例如,请求来自浏览器/设备,主API执行身份验证,然后调用microservice API,然后

目前我有一个设置,我的客户端(web应用程序、iOS应用程序等)通过REST调用与我的后端API.NET web应用程序(Nancy)对话。没什么特别的

我现在需要将这个API拆分为微服务,每个服务都可以单独升级/部署

我的主API(public)将只执行身份验证,然后调用我的一个微服务,它将位于我的专用网络中

我的主API和其他微服务API之间的通信方式有哪些不同?每种方法的优缺点?

通信需要实时-例如,请求来自浏览器/设备,主API执行身份验证,然后调用microservice API,然后返回响应。所以我不能使用队列或发布/订阅之类的东西。它不一定需要使用HTTP,但需要实时通信(请求/响应)。我还有其他服务(WebJobs、云服务等)需要与这些微服务进行对话(它们也在专用网络中)

想到的唯一方法是简单的基于REST的调用。完全可以,但是延迟是这里的主要问题

有人能推荐其他解决这个问题的方法吗?Azure中有适合这个的东西吗

非常感谢

旨在高效沟通。它是由Facebook(现在是开源的)开发的,现在正在开发一个实现


高效的序列化机制。协议缓冲区不包括RPC(远程过程调用),但可用于通过各种传输机制发送数据。这也是(SO自己的Marc Gravel的项目)。

首先-澄清“实时”、“同步/异步”和“单向/双向”之间的区别。您排除的东西(队列和发布/订阅)当然可以用于双向请求/响应,但它们是异步的

第二,澄清“效率”——效率的衡量标准是什么?带宽?延迟开发时间?客户支持

第三,认识到微服务的成本之一是延迟。如果这是您第一次集成时遇到的一个问题,那么您很可能要走很长的路

我的主API和其他微服务API之间的通信方式有哪些不同?每种方法的利弊

不经意间:

  • 单节点和IPC上的主机:优点:性能;缺点:与部署拓扑紧密耦合;对其他节点的可达性;客户支持;失效模式
  • REST/SOAP/等。端点:优点:广泛的客户端和服务器支持;调试;网络缓存,缺点:性能;失效模式
  • 二进制协议:优点:性能;缺点:版本控制;客户端和服务器支持;调试;失效模式
  • 消息队列:优点:异步性;缺点:复杂性
  • ESB:优点:异步性;客户支持;缺点:复杂性
  • 平面文件:优点:带宽;简单客户支持;缺点:延迟,通用PITA
您会注意到,当我们将多个应用程序绑定在一起时,这是相同的列表……因为这就是您正在做的。仅仅因为你把应用程序变小了,除了让你的系统更加分散之外,实际上没有什么变化。希望能够解决“正常”分布式系统所面临的所有问题,然后解决一些与部署和版本控制相关的额外问题

考虑来自用户的幂等GET请求,如“GetMeQuestion1”。该客户机需要问题1的JSON响应。简单。在我预期的体系结构中,客户端会点击api.myapp.com,然后它会通过REST代理调用question-api.myapp.com(microservice)来获取数据,然后返回给用户。我们怎么能在这里使用酒吧/酒吧?谁是出版商,谁是订阅者?这里没有什么值得一提的事情。我对队列的理解:一个发布者,一个消费者。发布/订阅主题:一个出版商,多个消费者。谁是谁

好的,首先,如果我们谈论微服务和延迟,我们需要一个更具代表性的例子。假设我们的客户是Netflix移动应用程序,要显示打开的屏幕,它需要以下信息:

  • 趋势电影ID列表
  • 最近观看的电影ID列表
  • 帐户状态
  • 对于引用的每个电影id:名称、明星、摘要文本
  • 您所在地区不可用的电影ID列表(从趋势/最近观看的电影中筛选)
  • 其中每一个都由不同的微服务提供(我们称之为M1-M5)。来自客户端->数据中心的每次呼叫的预期延迟为100ms;服务之间的呼叫有20毫秒的延迟

    让我们比较一些方法:

    1:单一服务
  • T0+100ms:客户端发送/API//StartScreen请求;收到响应
  • 正如预期的那样,这是最低的延迟选项,但需要一个单一服务中的所有内容,由于运营方面的考虑,我们决定不使用这个服务

    2:微服务
  • T0+100ms:客户端向M1/API/Trending发送请求
  • T1+100ms:客户端向M2/API//最近发送请求
  • T2+100ms:客户端向M3/API//帐户发送请求
  • T3+100ms:客户端向M4/API/Summary发送请求?movieids=[]
  • T4+100ms:客户端向M5/API发送请求//不可用
  • 那是500米。使用一个代理,这不会有什么帮助-它只会给每个请求增加20毫秒的延迟(使其达到600毫秒)。我们的依赖关系介于1+2和4之间,3和5之间,但可以进行一些异步操作。让我们看看这有什么帮助

    3:微服务-异步
  • T0:客户端向M1/API/Trending发送请求
  • T0:客户端向M2/API//最近发送请求
  • T0:客户端向M3/API//帐户发送请求
  • T0+200ms:(来自1+2的响应)客户端向M4/API/Summary发送请求?movieids=[]
  • T0+200ms:(来自3的响应)客户端向M5/API发送请求//不可用
  • 我们下降到200米;不错-但我们的客户需要