ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.net core 自带分布式事务的微服务开源框架JMS

2021-12-29 19:33:39  阅读:175  来源: 互联网

标签:core 回滚 服务 JMS 事务 服务器 net 应用层


事务的统一性是微服务的一个重点问题,简洁有效的控制事务,更是程序员所需要的。JMS的诞生,就是为了更简单、更有效的控制事务。

先看一段调用微服务的代码: 

复制代码
            using (var ms = new JMSClient())
            {
                //调用用户信息微服务,创建新用户
                var uis = ms.GetMicroService<UserInfoService>();
                var userid = uis.CreateUser();

                //调用银行微服务,创建用户的银行账号
                var bks = tran.GetMicroService<BankService>();
                bks.CreateBankAccount( userid );

                //统一提交事务
                ms.Commit();
            }    
复制代码

 代码中,分别调用了两个不同的微服务,做了一些业务操作,最后,通过Commit方法,统一提交这两个微服务的事务。

由于tran对象被using包裹,在这中间,任意一个代码发生异常,整体事务都会被回滚。

这样的代码风格,比较简洁,也符合一贯的编程习惯。

 

我们再看一下微服务端的代码:

复制代码
UserInfoService:
public int CreateUser(TransactionDelegate tranDelegate) { var dbContext = new UserInfoDBContext(); dbContext.BeginTransaction(); //编写新增用户的业务代码 ......... //把数据库的事务提交和回滚,放到委托当中 tranDelegate.CommitAction = () => dbContext.CommitTransaction(); tranDelegate.RollbackAction = () => dbContext.RollbackTransaction(); return newUserId; }
复制代码 复制代码
BankService:
public int CreateBankAccount(TransactionDelegate tranDelegate,int userid) { var dbContext = new BankDBContext(); dbContext.BeginTransaction(); //...编写创建银行账户的业务代码 //把数据库的事务提交和回滚,放到委托当中 tranDelegate.CommitAction = () => dbContext.CommitTransaction(); tranDelegate.RollbackAction = () => dbContext.RollbackTransaction(); return userBankId; }
复制代码

微服务写完业务逻辑,最后,把事务的提交和回滚放到委托当中,由框架自动调用。

 

JMS会在所有微服务执行完毕后,统一调用微服务挂起的委托,提交事务。如果有任意一个微服务执行出错、宕机或者离线,其他微服务的操作会被回滚,而离线的微服务,它所挂起的事务,也会在10秒之内回滚。

而分布式事务,有一种情况是无法避免的,就是最终统一提交事务时,虽然确认了各个微服务器响应正常,可以正常提交事务,这时候,所有服务器响应号召,提交了事务,但是,最后发现,有一台服务器宕机了。这种情况,是分布式系统无法避免的,但是,通过执行日志所提供的数据,可以把宕机的服务,手动再执行一次。

 事务实现原理

应用层

应用层调用微服务,微服务返回调用结果,并告知应用层,微服务端是否有事务放在委托当中。

当应用层继续调用其他微服务的时候,如果发生异常,那么,通知所有微服务的委托回滚事务;

如果没有发生异常,全部微服务调用完毕,先确认一下所有调用的微服务器是否还正常响应,任何一个服务器响应不正常,也通知所有服务器的远程委托回滚事务;

如果所有服务器响应正常,那么通知远程委托提交事务;

提交事务过程中,如果某个服务器出现网络异常,继续尝试几次与服务器通讯,完成提交事务的通知工作;

微服务端

接到应用层指令,执行完函数,返回结果给应用层,然后继续和应用层保持长连接,保持心跳。

如果一切正常,最后,会响应应用层的指令,提交/回滚事务;

如果连接意外断开,把事务委托交到委托中心,而委托中心,在10秒内,如果收不到应用层的指令,那么,自己回滚委托的事务。

JMS特性

1、支持分布式事务控制(强一致性和非强一致性);

2、支持分布式事务锁;

3、网关支持双机热备;

4、支持配置文件统一在网关部署、更新;

5、支持SSL双向校验;

6、可自定义定时任务;

7、负载均衡根据微服务的CPU使用率和当前请求数进行平均分配,也可自己编写负载均衡规则;

8、支持小巧的双重加密token(长度仅有几十个字符),实现用户无状态登录,同时支持广播通报 token作废;

 

JMS支持的网络架构方案

方案1:只暴露应用服务器

 这是应用服务器和微服务沟通,效率最高的方案,也是我们使用最多的。如果我们的服务器不是要部署在全国各地,那么可以多台服务器使用同一个局域网,只暴露应用服务器作为唯一的访问入口。

方案2:暴露应用服务器和代理服务器

 服务器需要分布在不同的地域,为了安全起见,可以通过一个代理服务器,访问网关和微服务。

方案3:暴露所有服务器

服务器需要分布在不同的地域,为了更高的效率和更低的成本,可以把所有服务器暴露在互联网上,与服务器之间的通讯,经过SSL双向加密机制保证安全。

 以上3个方案便是JMS所支持的网络架构,根据实际情况,自由配置适合自己的方案。

 

下一篇,JMS开发示例(一)

这里给出JMS的源码库地址:

https://github.com/simpleway2016/JMS

qq交流群:1030042218

  分类: .Net CoreJMS

标签:core,回滚,服务,JMS,事务,服务器,net,应用层
来源: https://www.cnblogs.com/lhxsoft/p/15746213.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有