前言

对于项目的迭代,如何降低复杂性的要求高于性能以及技术细节的

一个易用的项目,才能迭代到比拼性能,最后拼刺刀的阶段

传统单体项目,都是传统三层,直接请求响应的模式,这类称为Rpc模式,易用性上非常好

基于rpc模式,对前一章的代码做调整


代码结构设计

每一个请求之后,同步返回执行结果给上游,最后完成链式调用



实例编写

PayOrderRequest->PayOrderEvent->PayOrderResponse

PayOrderResponse就是外层需要的执行结果PayOrderRequest和PayOrderEvent通过Masstransit通讯,皆是Rpc的模式,等待执行结果,返回给上游调用的API

基于Handler实现Rpc执行链

                            cfg.ReceiveEndpoint("Transaction", config =>
{
config.Handler<PayOrderRequest>(context =>
{
var value = context.Message; var bus = serviceProvider.GetRequiredService<IBusControl>();
var rpcClient = context.Request<PayOrderEvent, PayOrderResponse>(bus,
new PayOrderEvent
{
SourceId = value.SourceId,
TargetId = value.TargetId,
Money = value.Money
}
); var response = rpcClient.Result; return context.RespondAsync(response.Message);
});
}

这样就完成了简单的链式rpc调用,返回结果给上游

基于订阅端的Rpc调用

Handler和订阅端都可以完成链式rpc调用,但是出于项目分层和后续管理,不建议大量业务代码都写在Handler里

        public async Task Consume(ConsumeContext<PayOrderRequest> context)
{
var value = context.Message; //...省略crud部分 var rpcClient = context.Request<PayOrderEvent, PayOrderResponse>(bus,
new PayOrderEvent
{
SourceId = value.SourceId,
TargetId = value.TargetId,
Money = value.Money
}
); var response = rpcClient.Result; await context.RespondAsync(response.Message);
} public async Task Consume(ConsumeContext<PayOrderEvent> context)
{
//... 省略crud部分 await context.RespondAsync(new PayOrderResponse { Success = true });
}

应用层调用

                var response = await busControl.Request<PayOrderRequest, PayOrderResponse>(new PayOrderRequest
{
SourceId = ,
TargetId = ,
Money =
}); await context.Response.WriteAsync($"Hello World! Success:{response.Message.Success}");

这就是很典型的Rpc调用了


后话

基于Masstransit就可以很轻松的完成请求同步等待的过程了,整体都是基于EventBus通讯,所以从单体到分布式,可以很轻松的转变,整体本身就是分布式设计

实例本来想用TransactionContext的,仔细看了一下,这个实现是基于 CommittableTransaction,类似于TransactionScope都是基于MSDTC实现的分布式事务,就不写了~这块不能跨平台的话,就不写在实例中了

打个小广告

如果有技术交流可以加NCC的群 24791014、436035237,我在群里,有任何关于asp.net core/Masstransit的问题或者建议都可以与我交流,非常欢迎

示例代码:

https://github.com/htrlq/Crud.Sample

基于asp.net core 从零搭建自己的业务框架(二)的更多相关文章

  1. 基于asp.net core 从零搭建自己的业务框架(三)

    前言 根据业务处理部分,单体马上就能得知错误与否,快速做出处理,而分布式系统,会因为各种原因,无法如同单体一样立刻处理,所以这个时候需要 处理异常 的,做 补偿.转移.人工干预. 当然也可以直接在消费 ...

  2. 基于asp.net core 从零搭建自己的业务框架(一)

    前言 asp.net core版本选择2.2,只是因为个人习惯了vs2017,代码以及设计皆可移植到vs2019,用asp.net core 3.0以及以上运行起来 项目类似选择web api,基础设 ...

  3. 基于ASP.Net Core开发的一套通用后台框架

    基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...

  4. 基于ASP.NET Core 3.0快速搭建Razor Pages Web应用

    前言 虽然说学习新的开发框架是一项巨大的投资,但是作为一个开发人员,不断学习新的技术并快速上手是我们应该掌握的技能,甚至是一个.NET Framework开发人员,学习.NET Core 新框架可以更 ...

  5. 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)

    最近使用vscode比较多. 学习了一下如何在mac上使用vscode开发asp.netcore项目. 这里是我写的关于vscode的一篇文章: https://www.cnblogs.com/cgz ...

  6. 基于ASP.NET Core 6.0的整洁架构

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 本节将介绍基于ASP.NET Core的整洁架构的设计理念,同时基于理论落地的代码 ...

  7. 如何基于asp.net core的Identity框架在mysql上作身份验证处理

    首先了解这个概念,我一开始也是理解和掌握基本的概念,再去做程序的开发.Identity框架是微软自己提供,基于.net core平台,可拓展.轻量 级.面向多个数据库的身份验证框架.IdentityS ...

  8. 基于Asp.Net Core的简单社区项目源代码开源

    2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0+EF CORE 3.0开发 使用vs2019 +sqlserver 2017(数据库脚本最低支持sql server 20 ...

  9. AServer - 基于Asp.net core Kestrel的超迷你http服务器

    AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器.它可以集成进你的Core程序里,用来快速的响应Http请求,而不需要集成整个ASP.NET Core MVC ...

随机推荐

  1. 通过注入DLL修改API代码实现钩取(一)

    通过注入DLL修改API代码实现钩取(一) Ox00 大致思路 通过CreateRemoteThread函数开辟新线程,并将DLL注入进去 通过GetProcessAddress函数找到需钩取的API ...

  2. 简单了解一下 Swagger

    一.Swagger 1.什么是 Swagger ? Swagger 是一个规范和完整的框架,用于生成.描述.调用以及可视化的 Restful 风格的 Web 服务. 简单的理解:是一款 REST AP ...

  3. 题解:2018级算法第五次上机 C5-图2

    题目描述: 样例: 实现解释: 所有结点对最短路径的板子题 知识点: 寻找所有结点对最短路径,动态规划 坑点: 无坑,注意建边即可 使用的算法为floyd算法 按照程序顺序解释如下: 首先建图,以邻接 ...

  4. 使用Xshell的rz命令上传文件失败的解决方法

    使用Xshell的rz命令上传文件失败的解决方法 第一种:在home目录下rz上传文件失败,如下: 原因:当前用户不具备权限解决:用 sudo rz 上传即可成功 第二种:对于文件大的rz上传失败的话 ...

  5. Python之常用模块学习(二)

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  6. 拦截器(Interceptor)中的invocation.invoke()是什么意思?

    拦截器(Interceptor)中的invocation.invoke()是什么意思? 最佳答案: invocation.invoke() 就是通知struts2接着干下面的事情 比如 调用下一个拦截 ...

  7. 小白从零开始阿里云部署react项目+node服务接口(三:部署到服务器)

    服务器 准备工具 依次安装即可 nginx 安装nginx https://www.runoob.com/linux/nginx-install-setup.html 配置全局nginx命令 http ...

  8. 第十章:Android消息机制

    Android的消息机制主要是指Handler的云心机制,Handler的运行需要底层的MessageQueue和Looper支持. Handler是Android消息机制的上层接口. 通过Handl ...

  9. OSCP Learning Notes - WebApp Exploitation(1)

    Installing XSS&MySQL FILE Download the Pentester Lab: XSS and MySQL FILE from the following webs ...

  10. ​​​​​​​爆力破解Windows操作系统登录密码核心技术

    一.不借助U盘等工具二.已将win7登录账户为test,密码为666666,全套C/C++黑客资料请加:726920220QQ 1.将电脑开机关机几次,进入以下界面