一、REST or RPC ?

1.1 REST & RPC

  微服务之间的接口调用通常包含两个部分,序列化和通信协议。常见的序列化协议包括json、xml、hession、protobuf、thrift、text、bytes等;通信比较流行的是http、soap、websockect,RPC通常基于TCP实现,常用框架例如dubbo,netty、mina、thrift。

  REST:严格意义上说接口很规范,操作对象即为资源,对资源的四种操作(post、get、put、delete),并且参数都放在URL上,但是不严格的说Http+json、Http+xml,常见的http api都可以称为Rest接口。

  RPC:即我们常说的远程过程调用,就是像调用本地方法一样调用远程方法,通信协议大多采用二进制方式。

1.2 HTTP vs 高性能二进制协议

  HTTP相对更规范,更标准,更通用,无论哪种语言都支持HTTP协议。如果你是对外开放API,例如开放平台,外部的编程语言多种多样,你无法拒绝对每种语言的支持,相应的,如果采用HTTP,无疑在你实现SDK之前,支持了所有语言,所以,现在开源中间件,基本最先支持的几个协议都包含RESTful。

  RPC协议性能要高的多,例如Protobuf、Thrift、Kyro等,(如果算上序列化)吞吐量大概能达到http的二倍。响应时间也更为出色。千万不要小看这点性能损耗,公认的,微服务做的比较好的,例如,netflix、阿里,曾经都传出过为了提升性能而合并服务。如果是交付型的项目,性能更为重要,因为你卖给客户往往靠的就是性能上微弱的优势。

  所以,最佳实践一般是对外REST,对内RPC,但是追求极致的性能会消耗很多额外的成本,所以一般情况下对内一般也REST,但对于个别性能要求较高的接口使用RPC。

二、案例结构

  这里假设有两个服务,一个ClinetService和一个PaymentService,其中PaymentService有两部分,一部分是基于REST风格的WebApi部分,它主要是负责一些对性能没有要求的查询服务,另一部分是基于TCP的RPC Server,它主要是负责一些对性能要求高的服务,比如支付和支出等涉及到钱的接口。假设User在消费ClientService时需要调用PaymentService根据客户账户获取Payment History(走REST)以及进行交易事务操作(走RPC)。

三、REST调用

3.1 一个好用的REST Client : WebApiClient

  使用过Java Feign Client的人都知道,一个好的声明式REST客户端可以帮我们省不少力。在.NET下,园子里的大大老九就写了一款类似于Feign Client的REST Client:WebApiClient。WebApiClient是开源在github上的一个httpClient客户端库,内部基于HttpClient开发,是一个只需要定义C#接口(interface),并打上相关特性,即可异步调用http-api的框架 ,支持.net framework4.5+、netcoreapp2.0和netstandard2.0。它的GitHub地址是:https://github.com/dotnetcore/WebApiClient

  如何安装?

NuGet>Install-Package WebApiClient-JIT  

3.2 使用实例:走API Gateway

  Step1.定义HTTP接口

  这里需要注意的是,由于我们要走API网关,所以这里定义的HttpHost地址是一个假的,后面具体调用时会覆盖掉,但是这里必须写上一个,不然无法使用。

  Step2.在Controller中即可异步调用

  这里PaymentService的实现很简单,就是返回了一个String集合:

 最终调用结果如下:

  

3.3 使用实例:直接访问具体服务

  在服务众多,且单个服务就部署了多个实例的情况下,我们可以通过API网关进行中转,但是当部分场景我们不需要通过API网关进行中转的时候,比如:性能要求较高,负载压力较小单个实例足够等,我们可以直接与要通信的服务进行联接,也就不用从API网关绕一圈。

  Step1.改一下HTTP接口:

  同理,这里的HttpHost也是后面需要被覆盖的,原因是我们将其配置到了配置文件中。

  Step2.改一下调用代码:

 最终调用结果如下:

  

四、RPC调用

4.1 Thrift简介

  

  Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

  当然,还有gRPC也可以选择,不过从网上的性能测试来看,Thrift性能应该优于gRPC 2倍以上,但是gRPC的文档方面要比Thrift友好很多。

4.2 Thrift的使用

  (1)下载Thrift (这里选择Windows版)

  

  下载完成后解压,这里我将其改名为thrift.exe(去掉了版本号),一会在命令行敲起来更方便一点。

  (2)编写一个PaymentService.thrift,这是一个IDL中间语言

 (3)根据thrift语法规则生成C#代码

cmd>thrift.exe -gen csharp PaymentService.thrift

  

  (4)创建一个Contracts类库项目,将生成的C#代码放进去

  

4.3 增加RPC Server

  (1)新增一个控制台项目,作为我们的Payment Service RPC Server,并引用Contracts类库项目

  

  (2)引入thrift-netcore包:

NuGet>Install-Package apache-thrift-netcore

  (3)加入一个新增的PaymentService实现类

  这里输出日志仅仅是为了测试。

  (4)编写启动RPC Server的主程序

  (5)如果是多个服务实现的话,也可以如下这样启动:

4.4 调用RPC

  在ClientService中也引入apache-thrift-netcore包,然后在调用的地方修改如下:

  最终测试结果如下:

  

五、小结

  本篇简单的介绍了下微服务架构下服务之间调用的两种常用方式:REST与RPC,另外前面介绍的基于消息队列的发布/订阅模式也是服务通信的方式之一。本篇基于WebApiClient这个开源库介绍了如何进行声明式的REST调用,以及Thrift这个RPC框架介绍了如何进行RPC的通信,最后通过一个小例子来结尾。最后,服务调用的最佳实践一般是对外REST,对内RPC,但是追求极致的性能会消耗很多额外的成本,所以一般情况下对内一般也REST,但对于个别性能要求较高的接口使用RPC。

参考资料

远方的行者,《微服务 RPC和REST》

杨中科,《.NET Core微服务课程:Thrift高效通讯》

醉眼识朦胧,《Thrift入门初探--thrift安装及java入门实例》

focus-lei,《.net core下使用Thrift》

宝哥在路上,《Thrift性能测试与分析》

原文地址:

https://www.cnblogs.com/edisonchou/p/microservice_communication_rest_and_rpc_foundation.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

.NET Core微服务之服务间的调用方式(REST and RPC)相关推荐

  1. 面试官:微服务之间的几种调用方式哪种最佳?

    点击关注公众号,Java干货及时送达

  2. .NET Core 微服务学习与实践系列文章目录索引(2019版)

    Photo :.NET Core 文 | Edison Zhou 2018年,我开始学习和实践.NET Core,并开始了微服务的学习,以及通过各种开源组件搭建服务治理技术方案,并在学习过程中总结了一 ...

  3. 微服务之间的最佳调用方式

    上一篇:3600万中国人在抖音"上清华" 0.2T架构师学习资料干货分享 茉莉花,别名:茉莉,拉丁文名:Jasminum sambac (L.) Ait,木犀科.素馨属直立或攀援灌 ...

  4. .NET Core微服务开发服务间调用篇-GRPC

    在单体应用中,相互调用都是在一个进程内部调用,也就是说调用发生在本机内部,因此也被叫做本地方法调用:在微服务中,服务之间调用就变得比较复杂,需要跨网络调用,他们之间的调用相对于与本地方法调用,可称为远 ...

  5. .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.预备知识:数据一致性 关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认 ...

  6. .NET Core微服务之路:不断更新中的目录 (v0.42)

    原文:.NET Core微服务之路:不断更新中的目录 (v0.42) 微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑, ...

  7. .NET Core微服务系列基础文章索引(目录导航Final版)

    一.为啥要总结和收集这个系列? 今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有 ...

  8. .Net Core with 微服务 - Polly 服务降级熔断

    在我们实施微服务之后,服务间的调用变的异常频繁.多个服务之间可能是互相依赖的关系.某个服务出现故障或者是服务间的网络出现故障都会造成服务调用的失败,进而影响到某个业务服务处理失败.某一个服务调用失败轻 ...

  9. .Net Core微服务架构技术栈的那些事

    一.前言 大家一直都在谈论微服务架构,园子里面也有很多关于微服务的文章,前几天也有一些园子的朋友问我微服务架构的一些技术,我这里就整理了微服务架构的技术栈路线图,这里就分享出来和大家一起探讨学习,同时 ...

最新文章

  1. 为了用户体验,不要做浏览器兼容
  2. 简单的C++程序求圆的周长和面积
  3. Stacktraces告诉了事实。 但事实并非如此。
  4. Java Hashtable rehash()方法与示例
  5. 展望2015把C++版本的掼蛋程序写好
  6. JUnit5 @RepeatedTest注解示例
  7. 解析Esri WebScene
  8. Typora中插入分页符
  9. 如何在WordPress中添加免费实时聊天(简便方法)
  10. 小成开发日记----物联网项目LoveTv实现web网页传输数据到单片机-表白女朋友(技术栈涉及web前端,php后端,c/c++ socket,嵌入式前后端)
  11. 32位计算机多少位寻址,32位的cpu的寻址能力到底是多少?
  12. 蓝桥杯第四届C/C++ B省赛题目及题解
  13. 达人评测 小米笔记本pro14和联想yoga14s 选哪个好
  14. AI记者上岗,百度数字人度晓晓云上采访全国五一劳动奖获得者
  15. 单页面SPA(如react,vue)网站的服务器渲染SSR之SEO大杀器rendertron(超详细配置+避坑)
  16. 11月区块链行业大事件盘点:政策利好与监管趋严并举,你想了解的都在这
  17. linux如何连接手机传文件,Ubuntu和手机通过蓝牙互传文件
  18. 关于ARM芯片中的大小端模式
  19. 【大数据入门核心技术-Tez】(四)Tez与Hdfs整合
  20. i3-10110U和i5 1035g7 哪个好

热门文章

  1. web布局固定宽度+变化宽度实现思路
  2. 利用Xshell实现非对称秘钥对安全登陆linux服务器(Centos、Ubuntu)
  3. MFC的Button和Static控件
  4. MFC,QT与WinForm,WPF简介
  5. SQLServer事务的隔离级别
  6. WPF 基础控件之 GroupBox样式
  7. 微信重磅更新!这个功能等了 7 年
  8. 如何排查 StackOverflow 异常
  9. BenchmarkDotNet v0.12x新增功能
  10. 64岁Python之父加入微软 | 谁说大龄程序员无出路