事务的统一性是微服务的一个重点问题,简洁有效的控制事务,更是程序员所须要的。JMS的诞生,就是为了更简单、更有效的控制事务。html
先看一段调用微服务的代码: git
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包裹,在这中间,任意一个代码发生异常,总体事务都会被回滚。github
这样的代码风格,比较简洁,也符合一向的编程习惯。数据库
咱们再看一下微服务端的代码:编程
UserInfoService:
public int CreateUser(TransactionDelegate tranDelegate) { var dbContext = new UserInfoDBContext(); //编写新增用户的业务代码 ......... //把数据库的事务提交和回滚,放到委托当中 tranDelegate.CommitAction = () => dbContext.CommitTransaction(); tranDelegate.RollbackAction = () => dbContext.RollbackTransaction(); return newUserId; }
BankService:
public int CreateBankAccount(TransactionDelegate tranDelegate,int userid) { var dbContext = new BankDBContext(); //...编写建立银行帐户的业务代码 //把数据库的事务提交和回滚,放到委托当中 tranDelegate.CommitAction = () => dbContext.CommitTransaction(); tranDelegate.RollbackAction = () => dbContext.RollbackTransaction(); return userBankId; }
微服务写完业务逻辑,最后,把事务的提交和回滚放到委托当中,由框架自动调用。安全
JMS会在全部微服务执行完毕后,统一调用微服务挂起的委托,提交事务。若是有任意一个微服务执行出错、宕机或者离线,其余微服务的操做会被回滚,而离线的微服务,它所挂起的事务,也会在10秒以内回滚。服务器
而分布式事务,有一种状况是没法避免的,就是最终统一提交事务时,虽然确认了各个微服务器响应正常,能够正常提交事务,这时候,全部服务器响应号召,提交了事务,可是,最后发现,有一台服务器宕机了。这种状况,是分布式系统没法避免的,可是,经过执行日志所提供的数据,能够把宕机的服务,手动再执行一次。网络
应用层架构
应用层调用微服务,微服务返回调用结果,并告知应用层,微服务端是否有事务放在委托当中。
当应用层继续调用其余微服务的时候,若是发生异常,那么,通知全部微服务的委托回滚事务;
若是没有发生异常,所有微服务调用完毕,先确认一下全部调用的微服务器是否还正常响应,任何一个服务器响应不正常,也通知全部服务器的远程委托回滚事务;
若是全部服务器响应正常,那么通知远程委托提交事务;
提交事务过程当中,若是某个服务器出现网络异常,继续尝试几回与服务器通信,完成提交事务的通知工做;
微服务端
接到应用层指令,执行完函数,返回结果给应用层,而后继续和应用层保持长链接,保持心跳。
若是一切正常,最后,会响应应用层的指令,提交/回滚事务;
若是链接意外断开,把事务委托交到委托中心,而委托中心,在10秒内,若是收不到应用层的指令,那么,本身回滚委托的事务。
一、支持分布式事务控制(强一致性和非强一致性);
二、支持分布式事务锁;
三、网关支持双机热备;
四、支持配置文件统一在网关部署、更新;
五、支持SSL双向校验;
六、可自定义定时任务;
七、负载均衡根据微服务的CPU使用率和当前请求数进行平均分配,也可本身编写负载均衡规则;
八、支持小巧的双重加密token(长度为68字符),实现用户无状态登陆;
这是应用服务器和微服务沟通,效率最高的方案,也是咱们使用最多的。若是咱们的服务器不是要部署在全国各地,那么能够多台服务器使用同一个局域网,只暴露应用服务器做为惟一的访问入口。
服务器须要分布在不一样的地域,为了安全起见,能够经过一个代理服务器,访问网关和微服务。
服务器须要分布在不一样的地域,为了更高的效率和更低的成本,能够把全部服务器暴露在互联网上,与服务器之间的通信,通过SSL双向加密机制保证安全。
以上3个方案即是JMS所支持的网络架构,根据实际状况,自由配置适合本身的方案。
这里给出JMS的源码库地址:
https://github.com/simpleway2016/JMS
qq交流群:1030042218