• # springcloud-eureka-feign-mybatis-seata ### 整合步奏


    springcloud-eureka-feign-mybatis-seata

    整合步奏

    • 1.下载seata-server,修改seate-server配置
    • 2.client端(你自己的项目)拷贝seate-server中的file.conf, registry.conf 加入自己项目
    • 3.数据源代理设置
    • 4.创建数据库表
    • 5.启动注册中心,启动seate-server,启动client

    技术选型及版本

    注册中心:eureka

    服务间调用:feign

    持久层:mybatis

    数据库:mysql 5.7.20

    Springboot:2.1.8.RELEASE

    Springcloud:Greenwich.SR2

    jdk:1.8

    seata:0.8

    file.conf

    ## transaction log store
    store {
      ## store mode: file、db
      mode = "db"   修改这里,表明事务信息用db存储
    
      ## file store 当mode=db时,此部分配置就不生效了,这是mode=file的配置
      file {
        dir = "sessionStore"
    
        # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
        max-branch-session-size = 16384
        # globe session size , if exceeded throws exceptions
        max-global-session-size = 512
        # file buffer size , if exceeded allocate new buffer
        file-write-buffer-cache-size = 16384
        # when recover batch read size
        session.reload.read_size = 100
        # async, sync
        flush-disk-mode = async
      }
    
      ## database store  mode=db时,事务日志存储会存储在这个配置的数据库里
      db {
        ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.
        datasource = "dbcp"
        ## mysql/oracle/h2/oceanbase etc.
        db-type = "mysql"
        driver-class-name = "com.mysql.jdbc.Driver"
        url = "jdbc:mysql://116.62.62.26/seat-server"  修改这里
        user = "root"  修改这里
        password = "root"  修改这里
        min-conn = 1
        max-conn = 3
        global.table = "global_table"
        branch.table = "branch_table"
        lock-table = "lock_table"
        query-limit = 100
      }
    }
    

    由于此demo我们使用db模式存储事务日志,所以,我们要创建三张表:global_table,branch_table,lock_table 数据表在下载的seat-server/conf中

    由于存储undo_log是在业务库中,所以在每个业务库中,还要创建undo_log表 数据表在下载的seat-server/conf中

    由于我自定义了事务组名称,所以这里也做了修改:

    service {
      #vgroup->rgroup
      # seata版本1.0.0后客户端file.conf文件中vgroup_mapping要改成vgroupMapping
      vgroup_mapping.fsp_tx_group = "default"  修改这里,fsp_tx_group这个事务组名称是我自定义的,一定要与client端的这个配置一致!否则会报错!
      #only support single node
      default.grouplist = "127.0.0.1:8091"
      #degrade current not support
      enableDegrade = false
      #disable
      disable = false
      #unit ms,s,m,h,d represents milliseconds, seconds, minutes, hours, days, default permanent
      max.commit.retry.timeout = "-1"
      max.rollback.retry.timeout = "-1"
    }
    

    registry.conf

    registry {
      # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
      type = "eureka"  修改这里,指明注册中心使用什么
    
      nacos {
        serverAddr = "localhost"
        namespace = ""
        cluster = "default"
      }
      eureka {
        serviceUrl = "http://localhost:10086/eureka"  修改这里
        application = "default"  
        weight = "1"
      }
      redis {
        serverAddr = "localhost:6379"
        db = "0"
      }
      zk {
        cluster = "default"
        serverAddr = "127.0.0.1:2181"
        session.timeout = 6000
        connect.timeout = 2000
      }
      consul {
        cluster = "default"
        serverAddr = "127.0.0.1:8500"
      }
      etcd3 {
        cluster = "default"
        serverAddr = "http://localhost:2379"
      }
      sofa {
        serverAddr = "127.0.0.1:9603"
        application = "default"
        region = "DEFAULT_ZONE"
        datacenter = "DefaultDataCenter"
        cluster = "default"
        group = "SEATA_GROUP"
        addressWaitTime = "3000"
      }
      file {
        name = "file.conf"
      }
    }
    

    如果是在windows下启动seata-server,现在已经完成配置修改了,等eureka启动后,就可以启动seata-server了:执行/bin/seata-server.bat即可。默认端口8091

    application.yml

    所有项目的application.yml大致相同

    eureka:
      instance:
        hostname: localhost
        prefer-ip-address: true
      client:
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:10086/eureka/
    feign:
      hystrix:
        enabled: false
      client:
        config:
          default:
            connectTimeout: 5000
            readTimeout: 10000
    logging:
      level:
        io:
          seata: info
    mybatis:
      mapperLocations: classpath:mapper/*.xml #配置mapper.xml地址
      typeAliasesPackage: com.order.pojo #别名
    server:
      port: 8080
    spring:
      application:
        name: order-server
      cloud:
        alibaba:
          seata:
            tx-service-group: fsp_tx_group
            #这个fsp_tx_group自定义命名很重要,server,client都要保持一致
            # vgroupMapping.fsp_tx_group = "default" 在这里有使用
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/order?useUnicode=ture&characterEncoding=UTF-8&serverTimezone=GMT%2B8
        username: root
        password: root
    
    
    

    配置数据源代理

    import com.alibaba.druid.pool.DruidDataSource;
    import io.seata.rm.datasource.DataSourceProxy;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.transaction.SpringManagedTransactionFactory;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    
    import javax.sql.DataSource;
    
    /**
     * 数据源代理
     * @author Admin
     */
    @Configuration
    public class DataSourceConfiguration {
    
        @Bean
        @ConfigurationProperties(prefix = "spring.datasource")
        public DataSource druidDataSource(){
            DruidDataSource druidDataSource = new DruidDataSource();
            return druidDataSource;
        }
    
        @Primary
        @Bean("dataSource")
        public DataSourceProxy dataSource(DataSource druidDataSource){
            return new DataSourceProxy(druidDataSource);
        }
    
        @Bean
        public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy)throws Exception{
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSourceProxy);
            sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
            .getResources("classpath*:/mapper/*.xml"));
            sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
            return sqlSessionFactoryBean.getObject();
        }
    
    }
    
     @Override
        @GlobalTransactional //开启seate事务控制
        public void create(Order order) {
            
            //本地方法
            orderDao.create(order);
    
            //远程方法 
            accountClient.decrease(new BigDecimal(10));
           
    
        }
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.account.mapper.AccountDao" ><!-- 关联的dao接口-->
      <resultMap id="BaseResultMap" type="com.account.pojo.Account" ><!--关联的实体类-->
        <id column="id" property="id" jdbcType="BIGINT" />
        <result column="user_id" property="userId" jdbcType="BIGINT" />
        <result column="total" property="total" jdbcType="DECIMAL" />
        <result column="used" property="used" jdbcType="DECIMAL" />
        <result column="residue" property="residue" jdbcType="DECIMAL" />
      </resultMap>
      <update id="decrease">
        UPDATE account SET residue = residue - #{money},used = used + #{money} where user_id = #{userId};
      </update>
    </mapper>
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
    @MapperScan("com.account.mapper")
    @EnableDiscoveryClient
    @EnableFeignClients
    public class AccountServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(AccountServerApplication.class, args);
        }
    
    }
    
    
    代码使世界更精彩
  • 相关阅读:
    MySQL主从复制
    MySQL索引
    MySQL视图(view)
    MySQL表类型和存储引擎
    MySQL事务(三)
    MySQL事务(二)
    MySQL事务(一)
    MySQL事件调度器
    协同过滤推荐算法
    SVD奇异值分解
  • 原文地址:https://www.cnblogs.com/lgx123/p/14875455.html
Copyright © 2020-2023  润新知