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

一、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。

二、案例结构

640?wx_fmt=png

  这里假设有两个服务,一个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接口

640?wx_fmt=png

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

  Step2.在Controller中即可异步调用

640?wx_fmt=png

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

640?wx_fmt=png

 最终调用结果如下:

  640?wx_fmt=jpeg

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

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

  Step1.改一下HTTP接口:

640?wx_fmt=png

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

  Step2.改一下调用代码:

640?wx_fmt=png

 最终调用结果如下:

  640?wx_fmt=jpeg

四、RPC调用

4.1 Thrift简介

  640?wx_fmt=png

  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版)

  640?wx_fmt=png

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

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

640?wx_fmt=png

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

cmd>thrift.exe -gen csharp PaymentService.thrift

  640?wx_fmt=png

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

  640?wx_fmt=png

4.3 增加RPC Server

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

  640?wx_fmt=png

  (2)引入thrift-netcore包:

NuGet>Install-Package apache-thrift-netcore

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

640?wx_fmt=png

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

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

640?wx_fmt=png

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

640?wx_fmt=png

4.4 调用RPC

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

640?wx_fmt=png

  最终测试结果如下:

  640?wx_fmt=png

五、小结

  本篇简单的介绍了下微服务架构下服务之间调用的两种常用方式: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

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【记忆化搜索】【dfs】【递归】Chocolate

Chocolate 题目大意: 有一块巧克力(每一个单位有一定的美味值),判断是否可以把他分为k块美味值相等的小巧克力 原题: 题目描述 Charlie 有一块巧克力。 这块巧克力是矩形的,有 n 行 m 列一共 n m 个大…

YbtOJ#20063-[NOIP2020模拟赛B组Day4]古老谜题【统计】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/1 题目大意 给出一个010101序列&#xff0c;求有多少对(l,p,r)(l,p,r)(l,p,r)使得l<p<rl<p<rl<p<r且sp1s_p1sp​1且s(l,p)s(p,r)s(l,p)s(p,r)s(l,p)s(p,r)&#xff08;s(l,r)s(l,r)s(l,r)表示l…

Nuget 多平台多目标快速自动打包

构建现代的 .Net 应用离不开 Nuget 的支持&#xff0c;而快速打包 Nuget 成了提高生产率的有效方法。1. 前置条件为了实现 Nuget 的快速打包&#xff0c;我们需要先解决一些前置依赖&#xff0c;无论是 .Net Framework、Mono 或者 .Net Standard&#xff08;.Net Core&#xff…

P4495-[HAOI2018]奇怪的背包【数论,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4495 题目大意 nnn个物品大小为viv_ivi​&#xff0c;每个物品有无数个&#xff0c;背包的重量定义为大小和%P\%P%P。 qqq次询问&#xff0c;问一个www表示有多少种取法使得背包重量为www&#xff08;两种方案不同仅当有一种…

初一模拟赛(5.4)

成绩&#xff1a; 注&#xff1a;rank是有算其他dalaodalaodalao的 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4222lyflyflyf250250250100100100100100100303030202020333fyfyfy240240240100100100100100100404040000444tjhtjhtjh230230230100100100100…

Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源

这个系列文章介绍的是Identity Server 4 实施 OpenID Connect 的 Hybrid Flow. 保护MVC客户端: Identity Server 4 - Hybrid Flow - MVC客户端身份验证, Identity Server 4 - Hybrid Flow - Claims保护API资源(这里用到了RBAC: Role-based Access Control 基于角色的访问权限控…

P3599-Koishi Loves Construction【构造,数论】

正题 题目链接:https://www.luogu.com.cn/problem/P3599 题目大意 构造一个nnn的排列&#xff0c;要求满足其中一个给定的要求 对于每个前缀和在模nnn意义下不同对于每个前缀积在模nnn意义下不同 解题思路 对于加法&#xff0c;显然nnn要填在第一位&#xff0c;那么这一位的…

【图论】【并查集】矩形(ssl 1222)

矩形 ssl 1222 题目大意&#xff1a; 有n个矩阵&#xff0c;现在将有重叠部分的两个矩阵合并成一个图形&#xff0c;问有多少个图形 原题&#xff1a; 题目描述 在一个平面上有n个矩形。每个矩形的边都平行于坐标轴并且都具有值为整数的顶点。我们用如下的方式来定义块。…

Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一)

图片或者文件上传相信大家在开发中应该都会用到吧&#xff0c;有的时候还要对图片生成缩略图。那么如何在Asp.Net Core Web Api实现图片上传存储以及生成缩略图呢&#xff1f;今天我就使用MongoDB作为图片存储&#xff0c;然后使用SixLabors作为图片处理&#xff0c;通过一个As…

FFT算法学习笔记

写在前边 1.辣鸡RRRR_wys之前csdn的博客&#xff0c;千年不更。。。还很水。。。于是开了这个Blog。。。妄图拯救一下自己 2.最近接触了一些多项式理论。于是翘掉了愉快的高频自控&#xff0c;通过《算导》稍稍学习了一下 3.算法竞赛中&#xff0c;FFT主要解决多项式的乘法等问…

YbtOJ#20060-[NOIP2020模拟赛B组Day3]字串修改【模拟】

正题 题目链接:http://noip.ybtoj.com.cn/contest/86/problem/2 题目大意 给两个字符串&#xff0c;第一个中的∗*∗号可以替换为若干个&#xff08;可以为0个&#xff09;相同的它的前一个字符。求能否构成第二个字符串。 解题思路 把所有的∗*∗号去掉然后在有的∗*∗号的…

【并查集】家谱(luogu 2814/ssl 2343)

家谱 luogu 2814 ssl 2343 题目大意&#xff1a; 给一堆父子关系&#xff0c;求出一些人的最大的祖先 原题&#xff1a; 题目背景 现代的人对于本家族血统越来越感兴趣。 题目描述 给出充足的父子关系&#xff0c;请你编写程序找到某个人的最早的祖先。 输入输出格式…

System.IO.Pipelines: .NET高性能IO

本文翻译自dotnet团队博客文章&#xff1a;https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/ System.IO.Pipelines是一个新的库&#xff0c;旨在简化在.NET中执行高性能IO的过程。它是一个依赖.NET Standard的库&#xff…

Full_of_Boys训练1总结

题目来源&#xff1a; 2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17) A. Archery Tournament 每次查询&#xff0c;找这个位置前面的15个圆&#xff0c;后边15个圆来更新答案。set维护一下圆就行。为什么对&#xff0c;官方题解&a…

CF311B-Cats Transport【斜率优化dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF311B 题目大意 nnn座山在一条线上&#xff0c;有mmm只猫&#xff0c;第iii只从tit_iti​开始在第xix_ixi​座山上游玩结束。 派ppp个人在不同时间从111走到nnn接走所有游玩结束的猫&#xff0c;求所有猫的最小等待时间。 解…

【并查集】黑魔法师之门(codevs 1995/joyoi-codevs 1995)

黑魔法师之门 codevs 1995 joyoi-codevs 1995 题目大意&#xff1a; 有一堆点&#xff0c;每一次操作添加一条边&#xff0c;并要输出每个点的度数都大于1并为偶数的子图的个数 原题&#xff1a; 题目描述 经过了16个工作日的紧张忙碌&#xff0c;未来的人类终于收集到了…

.NET+PostgreSQL实践与避坑指南

简介.NETPostgreSQL(简称PG)这个组合我已经用了蛮长的一段时间&#xff0c;感觉还是挺不错的。不过大多数人说起.NET平台&#xff0c;还是会想起跟它“原汁原味”配套的Microsoft SQL Server(简称MSSQL)&#xff0c;其实没有MSSQL也没有任何问题&#xff0c;甚至没有Windows Se…

Full_of_Boys训练2总结

题目来源:&#xff1a;西安电子科技大学第16届程序设计竞赛网络同步赛 A, B, C: easy problem D. 另一个另一个简单题 做法是加起来&#xff0c;除n。希望会推导的聚聚指点。 #include <bits/stdc.h> const int inf 0x3f3f3f3f; using namespace std; int T; int ans; in…

P2714-四元组统计【数论,容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P2714 题目大意 给出nnn个数&#xff0c;求有多少个(i,j,k,l)(i,j,k,l)(i,j,k,l)使得gcd(ai,aj,ak,al)1gcd(a_i,a_j,a_k,a_l)1gcd(ai​,aj​,ak​,al​)1。 解题思路 我们设fif_ifi​表示gcdgcdgcd和为iii的方案数。FiF_iFi…

【并查集】Supermarket(poj 1456/luogu-UVA1316)

Supermarket poj 1456 luogu-UVA1316 题目大意&#xff1a; 有一堆物品&#xff0c;每一件物品都有自己的价值和保质期&#xff0c;每天只能卖出一件物品&#xff0c;问最大价值是多少 原题&#xff1a; 题目描述 有一个商店有许多批货&#xff0c;每一批货又有N(0<N…