前言

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

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

传统单体项目,都是传统三层,直接请求响应的模式,这类称为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

最新文章

  1. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
  2. 14. Reverse Linked List II
  3. ios app打ipa包
  4. java获取指定时间的年月日
  5. oracle 闪回技术
  6. Java API ——Collection集合类 &amp; Iterator接口
  7. HTML快速入门5——不规则表格、表格背景、边框颜色
  8. 【jQuery】用jQuery给文本框添加只读属性【readOnly】
  9. Xcode6 viewDidLoad 中View的subviews 为空
  10. 读取中兴3G告警log告警文件到集合
  11. Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)
  12. An explicit value for the identity column in table can only be specified when a column list is used and IDENTITY_INSERT is ON
  13. Oracle获取表字段名,字段类型,字段长度,注释
  14. SSM文件下载
  15. 极客无极限 一行HTML5代码引发的创意大爆炸
  16. day 29 socket 初级版
  17. JS获取填报扩展单元格控件的值
  18. 使用tmpfs的好处
  19. 20145227鄢曼君《网络对抗》MSF基础应用
  20. Java Web入门学习(四)Eclipse与Maven、Tomcat整合配置 (重整版并解决问题)

热门文章

  1. 线下---复习day04---作业
  2. MySQL后记
  3. Windows配置Delve的测试环境
  4. 【Linux】Linux常用命令及操作 (一)
  5. Scala 基础(五):Scala变量 (二) 数据类型
  6. python 并发专题(九):基础部分补充(一)进程
  7. 空间金字塔池化 ssp-net
  8. python爬虫学习01--电子书爬取
  9. nginx反向代理导致session失效的问题处理
  10. ajax配合art-template模板引擎的使用