eureka server配置_springcloud+eureka整合阿里seata-at模式

今天继续给大家分享一下阿里的分布式事务中间件seata的使用,本文基于微服务下每个服务绑定一个数据源的场景,服务之间依靠eureka客户端feign进行通信。

注:seata有四种模式,AT模式、TCC模式、saga和xa模式,感兴趣的同学可以参考官网进行了解这四种模式:

http://seata.io/zh-cn/docs/overview/what-is-seata.html

环境搭建

还是先说一下本文使用的实验环境:

springboot:2.1.6.RELEASE
orm框架:mybatis
数据库:mysql
数据库连接池:HikariCP
seata server:1.3.0
springcloud:Greenwich.SR2

整个项目的架构如下:

257e2ccd286bbb485c968a0353d64228.png

可以看到,项目中有order-server,account-server,storage-server这3个服务,每个服务绑定自己的数据库。这3个服务都注册到eureka上面,同时也都注册TM到seata-server。seata-server也注册到了eureka上。

首先我们启动eureka,这里监听8889端口,yml文件配置如下:

server

接着我们启动seata server,由于seata server也要注册到eureka上面,我们需要修改seata server,把registry.conf文件修改为如下:

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "eureka"
  #省略无关的代码
  eureka {
    #我本地配置的eureka地址
    serviceUrl = "http://192.168.59.1:8889/eureka"
    application = "seata-server"
    weight = "1"
  }
  #省略其他代码

执行如下命令启动seata server:

./seata-server.sh -p 8091 -h 127.0.0.1 -m file

配置3个微服务,这里我们以order-server为例,先看yml文件,核心配置就是eureka、feign、mybatis和数据源,代码如下:

#配置eureka

用这种方式配置account-server和storage-server,之后把3个服务都起来,启动成功后,访问eureka页面,地址如下:

http://localhost:8889/

这时我们能看到加上seata server一共4个服务都已经启动成功了,见下图:

12e9c5440101283a8ace03d4e4679eed.png

下面我贴一下整个项目的sql语句:

#########################

至此,整个环境就搭建完成了,接着我们进行测试。我们先看下account和storage两张表的数据,其他表都是空,如下图:

4f9e8b1403678e2fe5fae00b2e741611.png

afddf333789bd21b6b37e827871517ff.png

测试

现在我们开始进行测试,有2个场景,正常commit和场景和异常rollback场景。

我们向order-server发一个post请求,content如下:

{
  

url如下:

http://localhost:8180/order/create

这时order-server执行成功,日志如下:

2020-08-15 16:31:53.704  INFO 57868 --- [nio-8181-exec-1] i.s.sample.service.AccountServiceImpl    : ------->扣减账户开始account中
2020-08-15 16:31:54.141  INFO 57868 --- [nio-8181-exec-1] i.s.sample.service.AccountServiceImpl    : ------->扣减账户结束account中
2020-08-15 16:31:54.141  INFO 57868 --- [nio-8181-exec-1] i.s.sample.service.AccountServiceImpl    : 修改订单状态开始
2020-08-15 16:31:54.309  INFO 57868 --- [nio-8181-exec-1] c.netflix.config.ChainedDynamicProperty  : Flipping property: order-server.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2020-08-15 16:31:54.344  INFO 57868 --- [nio-8181-exec-1] c.n.u.concurrent.ShutdownEnabledTimer    : Shutdown hook installed for: NFLoadBalancer-PingTimer-order-server
2020-08-15 16:31:54.345  INFO 57868 --- [nio-8181-exec-1] c.netflix.loadbalancer.BaseLoadBalancer  : Client: order-server instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=order-server,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2020-08-15 16:31:54.352  INFO 57868 --- [nio-8181-exec-1] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater PollingServerListUpdater
2020-08-15 16:31:54.385  INFO 57868 --- [nio-8181-exec-1] c.netflix.config.ChainedDynamicProperty  : Flipping property: order-server.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2020-08-15 16:31:54.386  INFO 57868 --- [nio-8181-exec-1] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client order-server initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=order-server,current list of Servers=[10.192.86.60:8180],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;	Instance count:1;	Active connections count: 0;	Circuit breaker tripped count: 0;	Active connections per server: 0.0;]
},Server stats: [[Server:10.192.86.60:8180;	Zone:defaultZone;	Total Requests:0;	Successive connection failure:0;	Total blackout seconds:0;	Last connection made:Thu Jan 01 08:00:00 CST 1970;	First connection made: Thu Jan 01 08:00:00 CST 1970;	Active Connections:0;	total failure count in last (1000) msecs:0;	average resp time:0.0;	90 percentile resp time:0.0;	95 percentile resp time:0.0;	min resp time:0.0;	max resp time:0.0;	stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@5fa120e1
2020-08-15 16:31:54.562  INFO 57868 --- [nio-8181-exec-1] i.s.sample.service.AccountServiceImpl    : 修改订单状态结束:订单状态修改成功
2020-08-15 16:31:54.578  WARN 57868 --- [nio-8181-exec-1] c.a.c.seata.web.SeataHandlerInterceptor  : xid in change during RPC from 192.168.59.132:8091:37575557075451904 to null
2020-08-15 16:31:55.166  INFO 57868 --- [ch_RMROLE_1_1_8] i.s.c.r.p.c.RmBranchCommitProcessor      : rm client handle branch commit process:xid=192.168.59.132:8091:37575557075451904,branchId=37575566823014400,branchType=AT,resourceId=jdbc:mysql://192.168.59.1:3306/seata_pay,applicationData=null
2020-08-15 16:31:55.169  INFO 57868 --- [ch_RMROLE_1_1_8] io.seata.rm.AbstractRMHandler            : Branch committing: 192.168.59.132:8091:37575557075451904 37575566823014400 jdbc:mysql://192.168.59.1:3306/seata_pay null
2020-08-15 16:31:55.170  INFO 57868 --- [ch_RMROLE_1_1_8] io.seata.rm.AbstractRMHandler            : Branch commit result: PhaseTwo_Committed
2020-08-15 16:31:55.356  INFO 57868 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty  : Flipping property: order-server.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647

这时我们再看下数据库的数据,如下图:

order表:

c54eda7a8d3ab29cb49dcb62b92725b3.png

account表:

840a5792649330fbc63bfc99684dbed7.png

storage表:

9460d7fd914be0fd44c60f96bad38025.png

容易迷惑我们的是,order表的pay_amount值是45.5,而不是50,这时因为account-server执行完成后,又调用了order-server,执行了更新操作,代码如下:

public 

第二个场景的测试,我们把上面的代码模拟超时异常这段放开,用debug模式进行,继续发送前面一样的请求,可以看到seata_order库中的undo_log,如下图:

9d90fab3b95ad4bbd8627698f23e120c.png

等超时后,事务进行了回滚。

总结

可以看到,本篇文章介绍的场景是基于undo_log的交易补偿,这也是AT模式的特点。但是本文的环境稍微复杂一些,这并不是seata本身造成的,而是微服务的拆分带来的系统架构的复杂性。

源码地址:

https://github.com/jinjunzhu/springcloud-eureka-feign-mybatis-seata.git
https://github.com/jinjunzhu/eurekaserver.git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值