精选项目工作生活spring boot

springboot集成分布式事物fescar

2019-07-01  本文已影响84人  为梦想前进

一直以来,分布式事物一直是一个痛点,一直没有一个特别好的解决办法,直到今年一月份,阿里开源了分布式事物框架fescar,今天就让我们一起来学习下.

至于介绍,我就在这里不啰嗦了,官网上介绍的很清楚,不清楚的同学先去官网查看wiki,今天,我们就从diamante角度介入fescar,实现分布式事物框架。

先看下我的工程目录

parent                             父工程

service-discovery           注册中心使用的是eureka注册中心

service-product              服务提供者

service-consumer          服务消费者

fescar-config                  分布式事物的autoconfig:也就是需要传递的xid的所涉及到的类

服务提供者和服务消费者使用feign实现rpc调用

这是初步工作,你先搭建好这样一个工程,接下来我们进行fescar接入

第一步:先去官网下载fescar-server,我下载的0.4.2版本

第二步:创建fescar-config项目,

第三步:引入依赖

第四步:在fescar-config中创建配置类,拦截器类,过滤器三个类。具体代码官网都有现成的例子

配置类

拦截器类

过滤器类

第五步:改造service-product项目

在配置文件中加入fescar事物组的名称

spring.cloud.alibaba.fescar.tx-service-group=test_group

编辑file.conf文件,标记为深色的为需要修改的地方

transport {

  # tcp udt unix-domain-socket

  type ="TCP"

  #NIO NATIVE

  server ="NIO"

  #enable heartbeat

  heartbeat =true

  #thread factory for netty

  thread-factory {

    boss-thread-prefix ="NettyBoss"

    worker-thread-prefix ="NettyServerNIOWorker"

    server-executor-thread-prefix ="NettyServerBizHandler"

    share-boss-worker =false

    client-selector-thread-prefix ="NettyClientSelector"

    client-selector-thread-size =1

    client-worker-thread-prefix ="NettyClientWorkerThread"

    # netty boss thread size,will not be used for UDT

    boss-thread-size =1

    #auto default pin or 8

    worker-thread-size =8

  }

}

service {

  #vgroup->rgroup

#vgroup_mapping.business-service-fescar-service-group = "localRgroup"

  vgroup_mapping.test_group ="default"

  #only support single node

  localRgroup.grouplist ="127.0.0.1:8091"

  #degrade current not support

  enableDegrade =false

  #disable

  disable =false

}

client {

  async.commit.buffer.limit =10000

  lock {

    retry.internal =10

    retry.times =30

  }

}

编辑register.conf文件

registry {

  # file 、nacos 、eureka、redis、zk

  type ="eureka"

  nacos {

    serverAddr ="192.169.250.177"

    namespace ="public"

    cluster ="default"

  }

  eureka {

    serviceUrl ="http://localhost:8260/eureka"

    application ="default"

    weight ="1"

  }

  redis {

    serverAddr ="localhost:6381"

    db ="0"

  }

  zk {

    cluster ="default"

    serverAddr ="127.0.0.1:2181"

    session.timeout =6000

    connect.timeout =2000

  }

  file {

    name ="file.conf"

  }

}

config {

  # file、nacos 、apollo、zk

  type ="file"

  nacos {

    serverAddr ="192.169.250.177"

    namespace ="public"

    cluster ="default"

  }

  apollo {

    app.id ="fescar-server"

    apollo.meta ="http://192.168.1.204:8801"

  }

  zk {

    serverAddr ="127.0.0.1:2181"

    session.timeout =6000

    connect.timeout =2000

  }

  file {

    name ="file.conf"

  }

}

第六步:在项目中引入fescart-config依赖

第七步:在service-consumer中重复上述步骤

第八步:我们开始测试,我准备了两个数据库,

@Override

@GlobalTransactional

public void globalTransactionAdd(String name,Integer price) {

  //先往商品列表新增,之后再往另一个数据库新增

  this.productService.insertPro(name,price);(A数据库插如记录)

  SuccessProduct successProduct =new SuccessProduct();

  successProduct.setName(name);

  successProduct.setId(new Random().nextInt(100));

  //不同的数据源

  int i =1/0;(模拟异常)

  this.successProductMapper.insert(successProduct);(在B数据库插如一条记录)

}

测试的时候,先启动fescar-server

然后当没有异常的时候,会正常执行,当出现异常的时候,A和B都不会生成新的记录,达到目标!

上一篇 下一篇

猜你喜欢

热点阅读