zoukankan      html  css  js  c++  java
  • # 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);
        }
    
    }
    
    
    代码使世界更精彩
  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/lgx123/p/14875455.html
Copyright © 2011-2022 走看看