基于Asp.Net Core打造轻量级内部服务治理RPC(一)

      继之前的《Asp.Net Core + Docker 搭建》文章末尾说过的,将陆续编写基于asp.net core 打造一个内部服务治理的rpc框架。不过前端时间较忙,所以搁置了一段时间。闲话不多说,下面就来讲讲为什么需要去做一个该框架,以及想法的来源和设计思路。

一、产生背景

       公司技术栈是以微软栈为主。整个平台的业务并不是特别复杂。因此先前搭建每个子系统的时候都是以最简单的方式入手(时间较紧)。但是随着时间的推移,各个子系统之间的交互也是越来越多,当然,我们的做法也是很简单,就是通过暴露rest api ,然后客户端通过http调用进行交互,以至于现在很多系统都会配置其他系统的调用信息。日积月累,感觉系统越来月凌乱(有洁癖,遇到这种乱,就必须要去重构^_^,当然也是为后面维护减少成本),于是就产生了编写一个内部服务调用的框架。

二、想法来源

      本着遇到问题解决问题的目的,最开始也想直接使用开源的系统,如:sugring,orleans等.net 界非常著名的项目。但考虑到我的需求很简单(以及我的想法也是做一个非常简单,尽量不依赖其他重量级的框架,开发人员都认真阅读代码后,都能轻易维护的东西),且对上述的框架目前应用到生产环境的案例不是很知晓的情况下,于是还是忍痛割爱,最终放弃了。在这里,我想表达我的目标就是我需要像dubbo一样,调用方只需要引用服务提供者定义的相关接口库(.Net 中定义的接口eg:IUserService),就能直接调用。服务的调用方和提供方都注册到一个统一的注册中心(我以consul为注册中心,无需安装其他运行时,非常方便)。这样就不需要关心服务的具体地方。(该实现方式的想法在我今天(2018-12-16)看到的doteasy.rpc中的文章和我的想法几乎一致,但是我的实现还是略有不同,它是基于pb进行传输实现的,我是完全基于asp.net core 中的webapi进行实现)。

三、设计思路

      其实,asp.net core 已经是一个完善且高效的rpc框架,我们在调用每一个实现的web api实际就是一个rpc调用,只是它是基于http协议,大多数情况下,数据是通过json序列化和反序列化而已。(其他开源的优秀框架eg:surgin,oreans,dubbo...实现了自己高效的通信方式以及协议)。所以,基于asp.net core来实现,其实就是基于它来扩展,并且满足大多数公司的业务需求的性能要求应该不是问题(何况我们的spring boot实现微服务也是走rest方式^_^)。下面是我的整个想法构思图。

640?wx_fmt=jpeg

图 1

      场景:比如我有一个Service A的集群,依赖了Service B集群(可运行多个Service B的进程实例)的一个接口(IUserService,当然该接口在Service B中进行了实现UserService)进行数据获取(或操作)。就可以通过启动每个Service B实例时就将Service B要提供的服务发布出来(或叫导出),注册到Consul注册集群中,同样,Service A的实例也需要注册到注册中心(即使不发布供其他服务调用的接口)。此时,Service A要调用Service B的服务,首先,通过HttpServiceProxyFactory服务代理类生成IUserSerivice的代理实现类UserSeriviceImpl(通过Emit进行动态代理),再从注册中心获取到Service B的集群信息,根据一定的负载算法(负载是客户端进行负载实现,目前只实现了简单的循环负载),选择一个Service B的实例进行远程调用。其中UserSeriviceImpl代理实现类中核心的代码就是通过HttpClient进行数据的包装,然后请求到Service B中的UserService(其实就是一个Controller)实现类中。然后在解析UserService处理后返回过来的数据。

      以上就是我整个Rpc调用的总体思路。具体每个模块的详细设计与实现,接下来我会继续写出来,有兴趣的朋友可以留言交流也可以加qq:418237014交流。

 

原文地址: https://www.jianshu.com/p/c45f56d2aa21

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

640?wx_fmt=jpeg


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

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

相关文章

P7046-「MCOI-03」诗韵【SAM,倍增,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P7046 题目大意 给出一个长度为 nnn 的字符串,然后 mmm 次把它的一个子串加入集合。如果一个字符串在这个集合中作为字符串的后缀出现次数大于 kkk 那么这个字符串就会被计入贡献。 每次求计入贡献的字符串数和最…

YBTOJ:前缀询问(trie树)

文章目录题目描述解析代码题目描述 解析 (没有做出来,这个ans的处理方式其实也不难想…qwq) 考虑把T都作为模板串加入trie树 加入每个模板串自然就是按照i顺序的 所以我们在插入t的时候沿途标记一下 新出现的未标记的i的间隔就是当前的i与上…

DP专练1( [NOIP 2003]加分二叉树 + 太空梯 )

我们先慢慢来加分二叉树题目题解简单讲解前序//中序//后序遍历代码实现太空梯题目题解代码实现加分二叉树 题目 题解 简单讲解前序//中序//后序遍历 其实说白了,这个*序就是根root的遍历顺序 先序就是root–>left–>right 中序就是left–>root–>rig…

P1896 [SCOI2005]互不侵犯

P1896 [SCOI2005]互不侵犯 题目: 在NN的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。 题解: 需要知道…

AT2368-[AGC013B]Hamiltonish Path【构造】

正题 题目链接:https://www.luogu.com.cn/problem/AT2368 题目大意 给出 nnn 个点 mmm 条边的一张无向图,然后求一条路径满足 路径长度不小于二。路径无交。对于所有的 xxx 与路径的端点相连,那么 xxx 在路径上。 1≤n,m≤1051\leq n,m\leq 10^51≤n,…

YBTOJ:运动积分(trie树)

文章目录题目描述解析代码题目描述 解析 做了巨长时间… 进行了一次刺激的阅读理解竞赛… 感谢whh dalao! 那么让我们分析一下这道题 首先我们考虑单个求x选手的q值 不难发现 i 在第j天和x的大小关系只与a[x]与a[i]二进制下不同的最高位k有关 j的第k位与x相同时&am…

年终总结,我为什么离开舒适区?

当圣诞夜过去,也意味着这一年即将结束,迎来崭新的开始,一年时间既短暂,又漫长,当离开人生的舒适区,将迎来一个又一个的挑战。如果说一个人的优秀,取决于他天赋,以及他为之付出的额外…

NC16886 炮兵阵地

题目: n*m个网格,有平原,有山地,平原可以放部队,部队攻击范围如图(不受地形影响)(H为山地,P为平原) 题解: 确定状态: 因为每个炮可…

CF891B-Gluttony【构造】

正题 题目链接:https://www.luogu.com.cn/problem/CF891B 题目大意 给出nnn个数字互不相同的一个序列aaa,求它的一个排列bbb,使得选出任意一个1∼n1\sim n1∼n的下标真子集,都有aaa的对应下标和不等于bbb的对应下标和。 1≤n≤22,0≤ai≤10…

DP专练2 (大理石 + [ZJOI 2010]数字计数)

你肯定以为DP专练会有很多题, 但是请考虑一下本仙女的DP码力,一次性能更几个题。。。 来吧,别害怕呀~~ 文章目录大理石题目题解代码实现数字计数题目题解代码实现大理石 题目 林老师是一位大理石收藏家,他在家里收藏了n块各种…

二阶常系数齐次线性递推数列

定义 若数列 \(\{a\}\) 满足 \(a_nc_1a_{n-1}c_2a_{n-2}\) ,\(c_1,c_2\) 为常数,就称这种数列为二阶常系数齐次线性递推数列。 求解 加入能够将递推关系式改写为 \((a_n-ka_{n-1})p(a_{n-1}-ka_{n-1})\) 的形式,就可以求出 \(a_n-ka_{n-1}\) …

YBTOJ:斐波拉契(矩阵快速幂)

文章目录题目描述题目描述代码题目描述 题目描述 关键在于如何转化为本题的题目。。。 设 y(1-根号5)/2$$ 再令: A(n)xn yn 通过尝试可以发现,A其实就是一个1,3为前两项的斐波拉契数列 则 xnA(n)-yn A的值可以用矩阵快速幂来求 而y是在(-1,…

ABP 框架 数据库底层迁移 Mysql 集群

技术交流,请加QQ群:538327407我的各种github 开源项目和代码:https://github.com/linbin524背景笔者 目前架构的IOT 项目是使用abp 框架作为后台,虽然abp的框架适用于中小型项目框架,但由于架构优美,笔者认为还是可以经…

CF280D-k-Maximum Subsequence Sum【模拟费用流,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/CF280D 题目大意 一个长度为nnn的序列,mmm次操作 修改一个数询问一个区间中选出kkk段不交子段使得和最大 1≤n≤105,1≤m≤2105,1≤k≤201\leq n\leq 10^5,1\leq m\leq 2\times 10^5,1\leq k\leq 201≤n≤105,1≤…

数论练习1 ( 曹冲养猪 + [POJ 2891]Strange Way to Express Integers + 乘法逆元【带证明】)

虽然作业还没有做完,但是我还是放不下它,对此,我只想说: 今天你对作业爱理不理,明天它就让你补到飞起 DP先放放,我们要雨露均沾练习上手:乘法逆元题目题解代码实现曹冲养猪?(互质的…

总结:8.9 模拟(枚举搜索)

文章目录前言考场流程T1 fansT2 huarongT3 meetT4 truth复盘T1 fansT2 huarongT3 meetT4 truth总结前言 25分… 主要的原因: 几乎到了考试结束才看到本次是搜索模拟!直接当全盲的模拟做的,T1和T4受到极大影响贪了。几乎已经是老生常谈&…

【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链

luogu 1477 [NOI2008] 假面舞会 容易发现: 如果图中没有环,那么面具种数一定是所有联通块内最长链之和,最少为 \(3\) 。 如果有环,则面具种数一定是所有环的大小的最大公约数。 那么只要求出每一个联通块内的最长链与环即可。 由…

开发.NET Core NuGet包并实现CI/CD

实际开发中我们需要对一些公共类库进行开发,并基于Jenkins进行CI/CD(CI:持续集成,CD:持续部署),其他项目通过NuGet引用。上文讲述了如何搭建本地NuGet服务器并发布NuGet包,这里不再赘述。CI/CD流程如下图:首…

acwing221 龙哥的问题

acwing221 龙哥的问题 文章目录题目&#xff1a;题解&#xff1a;代码&#xff1a;题目&#xff1a; 题解&#xff1a; 代码&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll;int phi(int x) {int ansx;for(int i2;(ll)i*i<x;i)if(x%…

AT2363-[AGC012C]Tautonym Puzzle【构造】

正题 题目链接:https://www.luogu.com.cn/problem/AT2363 题目大意 给出nnn&#xff0c;要求构造一个字符串sss&#xff0c;使得能够找出恰好nnn个子序列使得这个子序列能划分成前后相等的两份。 要求∣s∣≤200|s|\leq 200∣s∣≤200&#xff0c;字符集为[1,100][1,100][1,1…