.NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯

 最近一段时间有些事情耽搁了更新,抱歉各位了。

  上一篇我们简单的介绍了DotNetty通信框架,并简单的介绍了基于DotNetty实现了回路(Echo)通信过程。

  我们来回忆一下上一个项目的整个流程:

  1. 当服务端启动后,绑定并监听(READ)设定的端口,比如1889。

  2. 当客户端启动后,绑定指定端口,等待用户输入。

  3. 当用户输入任意字符串数据后,客户端将这组数据进行转码为byte格式进行传输到服务端。

  4. 当服务端收到客户端传来的数据,进行转码后输出控制台,并将这组数据再次回传到客户端。

  5. 客户端收到数据,也打印出来。

640?wx_fmt=png

 

  很简单的实现了一个点对点的通信例子。接下来我们将对这个DEMO进行简单的修改,模拟最简单的gRPC通信的一个构造过程。

 

  本篇很简单,只要实现了上一个demo,稍作修改,就能实现gRPC了(当然实际构建gRPC根本不会这么简单),本篇也是顺带一下这几天搞出来的一个轻量级RPC框架,先接上一个例子。

 

服务端

增加两个静态方法SayHello和SayByebye,用于提供远程调用,超级简单,不解释。

640?wx_fmt=png

在我们原来的ChannelRead函数中,将原有的Echo回路传输,直接替换成如下内容。

640?wx_fmt=png

(1):有这样一句话Replace(")", ""),笔者不知为何每次传送过来从buffer里转义出来的字符串,始终会有一个左括号在里面,也许是消息头,也许是protobuf-net的标记头,因为都是byte格式,在服务端偷懒就没有再进行一次protobuf的反序列化了。

为何要用Dictionary来作为中间对象转换,因为序列化需要实体对象作为类型,为了简单的介绍RPC,目前也就这么干了,例如上面代码所示。

(2):通过判断“func”字段中的内容进行方法调用,并将调用过程的返回结果转为BYTE格式。

(3):设置本次传输中的Buffer大小。

(4):将消息(数据)写入到DotNetty的Buffer。

(5):最终将Buffer写入到当前上下文(包含通道,传输对象,连接对象等等)。 

客户端

我们将上一个demo中的EchoClientHandler做如下修改,以完成一个简单的请求

640?wx_fmt=png

(1):建立与服务端相关的通信数据。

(2):将数据序列化为二进制流。

(3):将数据写入到ByteBuffer中。

 

启动一下

由于在客户端明文标注了使用sayHello这个方法,客户端会收到服务端返回的"hello stevelee"。

640?wx_fmt=png

  这样一个最简单的RPC远程调用就完成了(其实上一篇就也属于RPC,只是这里用方法和过滤来指定调用)。

 

 问题

  1. 服务端不可能都通过这样笨拙的过滤方式来调用方法吧?是的,这只是DEMO,为了演示和理解基础概念而已,而是要动过动态代理来实现方法Invoke。

  2. 这个DEMO只是一个点对点的远程调用,不会涉及到任何服务路由和转发等高级特性。

  3. 有新的接口的时候时候,需要重新编译和暴露,如果有上万个新的接口,这样的重复工作岂不是疯了。

  4. ...etc

  这里推荐一下最近构建的一个小框架:Easy.Rpc(连接点我),实现了路由,转发,代理,动态编译的特性。这里也帮朋友们推荐一个同样基于DotNetty的RPC框架(连接点我)张队推荐我加入他们,可我不知道怎么加入他们的团队,悲催啊...

 

  简单介绍一下使用方法,本篇不详细介绍这个框架是如何实现的,估计会好几十万字,单独拧出来做个系列会更好,框架设计需要哪些原则,需要考虑到的问题,包含设计模式、依赖注入、动态代理、动态编译、路由转发等等特性。

 

Esay.Rpc

  正如上面提到问题,需要解决这些问题,就需要修改诸多内容,

 

  例如把函数改为接口,把接口的定义放置服务端并对外开放相应端口,把接口的实现同样放置服务端,提供接口的调用,客户端通过类似API的方式进行远程接口调用,因此这个接口的定义必须单列的一个项目;

如何将接口自动部署(暴露)出来,可以通过中间协调器(也叫服务注册中心,如ETCD,consul,zookeeper),如何将这些接口自动注册到服务中心呢,需要实现反射自动扫描并添加到注册中心。

 

  我们添加一个Rpc.Common的中间通用库,当然Easy.Rpc的框架源码也在这个里面(框架目前不探讨),添加IUserService接口,UserModel实体类,UserServiceImpl实现类。其实通用类库只需要接口和实体就行,接口实现完全放置服务端,这样这个库也能完全分离出来。(不过笔者偷懒都写到Rpc.Common库中去了,实际生产决不能这么膜,分离,分离,分离,这也是微服务的主要概念之一)

 

  DEMO结构如下(Easy.Rpc源码目前也包含在这个里面,过两天单独拎出来做成框架,方便调用)

 640?wx_fmt=png

 

先看看接口定义了些什么:

640?wx_fmt=png

8个接口,几乎囊括了目前RPC调用测试的所有方法场景。接口实现就不贴了,你完全可以自定义接口的任何实现,或者就一句Console.Write("哇凉哇凉完啦")都可以。

接口参数中有个UserModel的实体对象,这里也贴上来。

640?wx_fmt=png

上面有两个不一样的标记,也是protobuf-net中独有的特性。

ProtoContract标记:该类是参与序列化内容的数据类。

ProtoMember标题:该类需要序列化的字段和顺序。 

protobuf-net的坑

  1. 默认例子中该类没有任何继承,因此不会存在一个妖孽问题,但如果UserModel是一个子类,他继承于一个父类,而这个父类也同样拥有多个子类,直接ProtoContract参与序列化将会报错,需要在特性上增加DataMemberOffset = x,此处的x不是字母,而是这个子类的一个序列化顺序。比如有3个子类继承同一个父类,前面两个子类的偏移量分别是1和2,那么这个类的偏移量将设置为3,以此类推。

  2. 默认的数据类型中,系统定义的标准类型没问题,但有个妖孽的int[]这样的数组类型,那也将是个噩梦,官网团队没有解释为何不支持数组的序列化,我猜测估计是因为数组的不规则性(比如多维数组、甚至不规则的多维数组)而放弃了这个类型的序列化,毕竟序列化是不能影响性能的。

接下来继续服务端的代码

640?wx_fmt=png

640?wx_fmt=png

全程基于serviceCollection实现自动装配和构造,相信用过Ioc容器都能明白这上面几条依赖注入和自动构建服务的含义。

再添加客户端代码:

640?wx_fmt=png

我想看到这里,明白上面代码的作用,也就明白了这个框架的作用,客户端能像调用本地方法一样去调用远程方法,并且中间过程是完全透明的,分离,分离,分离。

  微服务的作用不再介绍,呵呵。

原文地址:https://www.cnblogs.com/SteveLee/p/Simple_Rpc_Demo.html


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

640?wx_fmt=jpeg

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

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

相关文章

洛谷:P1831 杠杆数(数位dp)

文章目录描述解析代码thanks for reading!传送门描述 如果把一个数的某一位当成支点,且左边的数字到这个点的力矩和等于右边的数字到这个点的力矩和,那么这个数就可以被叫成杠杆数。 比如4139就是杠杆数,把3当成支点&#xff0c…

2021“MINIEYE杯”中国大学生算法设计超级联赛(7)部分题解

前言 找大佬嫖到个号来划水打比赛了,有的题没写或者不是我写的就不放了。 目前只有:1004,1005,1007,1008,1011 正题 题目链接:https://acm.hdu.edu.cn/contests/contest_show.php?cid990 1004 Link with Balls 题目大意 两种盒子各有nnn个&#xff…

Visual Studio 2019 首个预览版本抢先看,有啥新功能?

微软在 Connect 2018 大会上发布Visual Studio 2019 第 1 个预览版本。该预览版本中展示了许多变更,从 IDE 的启动行为,到代码重构功能;从搜索功能的更多用法,到更好的大型项目导航。这个预览版本展现了微软希望尽全力帮助开发人员…

模板:网络流(Dinic算法)

文章目录1.网络最大流题目描述解析反悔边分层(避免环流)时间优化代码2.费用流描述解析代码1.网络最大流 洛谷P3376 题目描述 给出一个网络图,以及其源点和汇点,求出其网络最大流。 解析 网络流的思想就是在原有的基础上不断进…

NC51272 棋盘覆盖

题目: 给出一张nn(n≤100) 的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米 诺骨牌进行掩盖。 题解: 先进行黑白染色,相邻的两个黑白就是一个骨牌,又因为一个格子不能放多个骨牌,…

P5494-[模板]线段树分裂

正题 题目链接:https://www.luogu.com.cn/problem/P5494 题目大意 给出一个可重集合要求支持 将集合ppp中在[l,r][l,r][l,r]的数放到一个新的集合中将集合ttt的所有数放入集合ppp中在集合ppp中放入xxx个ppp查询集合ppp中在[l,r][l,r][l,r]区间的数查询集合ppp中第kkk小的数 …

暑期训练待补

2021牛客暑期多校训练营5 C-Cheating and Stealing 繁琐 F-Finding Points 计算几何 I-Interval Queries 回滚莫队链表 2021牛客暑期多校训练营6 D-Gambling Monster FWT G-Hasse Diagram min25筛 2021牛客暑期多校训练营7 A-xay loves connected graphs多项式&#xff1f…

微软推出 VS Code 新特性,为 TypeScript 和 JavaScript 用户提供 AI 辅助开发功能

除了开发人员非常喜欢的IntelliSense和代码完成之外,今年早些时候,微软还发布了IntelliCode,提供了一组 AI 辅助开发功能。VS Code 团队现在宣布了一项新的实验性扩展,将 IntelliCode 带给了 TypeScript 和 JavaScript 用户。VS C…

NC107617 poj3020 Antenna Placement

问题: n * m的矩阵,有一些障碍点,用12的骨牌覆盖所有非障碍点 (12骨牌可重叠,骨牌可越界,骨牌可延伸到障碍点) 问最少需要 多少个。 题解: • 尽量用一个骨牌覆盖两个格子,覆盖不了了再重叠使…

P7737-[NOI2021]庆典【tarjan,虚树】

正题 题目链接:https://www.luogu.com.cn/problem/P7737 题目大意 给出一张无向图满足若x⇒z,y⇒zx\Rightarrow z,y\Rightarrow zx⇒z,y⇒z那么有x⇒yx\Rightarrow yx⇒y或y⇒xy\Rightarrow xy⇒x。 qqq次询问给出起点和终点和kkk条临时的边,求可能经过点的数量 1…

货车运输(洛谷P1967)(倍增)

传送门 文章目录题目描述题目解析代码题目描述 题目解析 本题如果告诉你,城市形成了一棵树,是不是就迎刃而解了呢? 本题的关键就是把稠密图转化为一片森林(就是可能有很多棵树啦) 怎么转化呢? 考虑哪些边是没用的 如果AB已经可…

.NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发

上篇给大家从零开始搭建了一个我们的ASP.NET Core CMS系统的开发框架,具体为什么那样设计我也已经在第十篇文章中进行了说明。不过文章发布后很多人都说了这样的分层不是很合理,什么数据库实体应该跟仓储放在一起形成领域对象,什么ViewModel应…

P7736-[NOI2021]路径交点【LGV引理】

正题 题目链接:https://www.luogu.com.cn/problem/P7736 题目大意 有kkk层的图,第iii层有nin_ini​个点,每层的点从上到下排列,层从左到右排列。再给出连接相邻层的一些有向边(从iii层连向i1i1i1层)。 对于n1n_1n1​…

第1节 连通性强连通、割点和桥(一)

文章目录无向图割点、桥、双连通分量Tarjan算法求割点和桥(割边)代码:边双连通分量 和 点双连通分量代码边双连通分量 和 点双连通分量 的缩点有向图的弱连通与强连通强连通分量Kosaraju算法Tarjan算法代码:无向图割点、桥、双连通…

暗黑破坏神(背包)(内部模拟)

不开longlong见祖宗!!! scanf要打成lld!!!! 解析 分层背包的类板子题,更新dp过程中记录路径,最后递归输出即可 然而—— 一开始被卡成了27分!!…

UOJ#454-[UER #8]打雪仗【通信题】

正题 题目链接:https://uoj.ac/problem/454 题目大意 AliceAliceAlice有一个长度为2n2n2n的010101串,BobBobBob有nnn个在[1,2n][1,2n][1,2n]位置的下标表示它想要得到010101串中这些位置的值,现在两个人可以向对方传输不超过mmm个0/10/10/1字符&#xf…

第1节 连通性强连通、割点和桥 例题

NC15707 可达性 题目: 给出一个 0 ≤ N ≤ 105 点数、0 ≤ M ≤ 105 边数的有向图, 输出一个尽可能小的点集,使得从这些点出发能够到达任意一点,如果有多个这样的集合, 输出这些集合升序排序后字典序最小的。 题解:…

最大乘积(记忆化搜索)

题目描述 给一段数列&#xff0c;用k个乘号分开&#xff0c;求所得最大值 n<10! 解析 这样就不用写高精啦 枚举第一个乘号的位置递归记忆化搜索即可 问题&#xff01; 一开始边界条件写了一个这个&#xff1a; if(n-st<k) return -2e15;这样使这样的情况强制非法 但…

Loj#6503-「雅礼集训 2018 Day4」Magic【分治NTT】

正题 题目链接:https://loj.ac/p/6503 题目大意 nnn张卡mmm种&#xff0c;第iii种卡有aia_iai​张&#xff0c;求所有排列中有kkk对相邻且相同的卡牌。 1≤n≤105,0≤k≤105,1≤m≤20000,∑i1main1\leq n\leq 10^5,0\leq k\leq 10^5,1\leq m\leq 20000,\sum_{i1}^ma_in1≤n≤1…

连通性(相关练习)

文章目录NC20603 [ZJOI2007]最大半连通子图题目&#xff1a;题解&#xff1a;代码&#xff1a;NC50403 嗅探器题目&#xff1a;题解&#xff1a;代码&#xff1a;NC51269 Network of Schools题目&#xff1a;题解&#xff1a;代码&#xff1a;NC106972 Cow Ski Area题目&#x…