SpringBoot2.0.6+Eureka整合Seata0.8.0升级到1.3.0踩坑指南

我们这一节主要讲的是seata升级后的主要修改,至于seata的基本部署可以参考我之前的随笔。

一开始我在升级SpringBoot版本之后,seata就突然启动不起来了,报了下面的错:

no available service 'null' found, please make sure registry config correct
这个报错其实就是你的客户端找不到你的seata服务器,因为升级之后配置参数有变化,所以我也对seata进行了改造升级。

Seata服务器配置:

file.conf:

## transaction log store, only used in seata-server
  service{
  #"./my_test_tx_group"这个可以自定义,value对应你eureka注册的application-name
  vgroup_mapping.my_test_tx_group = "seata-server"
  default.grouplist = "127.0.0.1:8091"
  disableGlobalTransaction = false
}

registry.conf:

  eureka {
  serviceUrl = "http://192.168.1.186:8000/eureka/"
  application = "seata-server"
  weight = "1"
}

客户端配置:

Datasource代理

Caused by: io.seata.common.exception.ShouldNeverHappenException: Auto proxy of DataSource can't be enabled as you've created a DataSourceProxy bean.Please consider removing DataSourceProxy bean or disabling auto proxy of DataSource.
at io.seata.spring.annotation.datasource.SeataDataSourceBeanPostProcessor.postProcessBeforeInitialization(SeataDataSourceBeanPostProcessor.java:60) ~[seata-all-1.1.0.jar:1.1.0]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:416) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1686) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE]
... 66 common frames omitted

在1.1.0版本升级之后,seata不支持手动代理,所以只需创建普通的数据源bean就行:

@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource(){
    DruidDataSource druidDataSource = new DruidDataSource();
    return druidDataSource;
}

pom依赖

<!--seata-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.3.0</version>
</dependency>

yml配置

我们可以删掉file.conf和registry.conf这两个配置文件了,直接用yml就可以配置seata:

#seata配置
seata:
  enabled: true
  # 你的服务名称
  application-id: ${spring.application.name}
  #这里的名字与seata服务端的file.conf中vgroup_mapping.my_test_tx_group = "seata-server"相同
  tx-service-group: my_test_tx_group
  # 开启数据源自动代理
  enable-auto-data-source-proxy: true
  #  可以指定动态代理
  #  use-jdk-proxy: false
  service:
    vgroup-mapping:
    #这里对应端的file.conf中vgroup_mapping.my_test_tx_group = "seata-server"
      my_test_tx_group: seata-server
    grouplist:
      default: 127.0.0.1:8091
  config:
    type: file
    file:
      name: file.conf
  # Eureka配置
  registry:
    type: eureka
    eureka:
      application: default
      serviceUrl: http://192.168.1.186:8000/eureka/
      weight: 1

这里再补充一点,如果出现以下异常:

Caused by: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='createTime', mode=IN, javaType=class java.lang.Object, jdbcType=TIMESTAMP, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType TIMESTAMP . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType TIMESTAMP . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Error
	at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:89)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.parameterize(PreparedStatementHandler.java:93)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize(RoutingStatementHandler.java:64)
	at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
	at com.sun.proxy.$Proxy385.query(Unknown Source)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
	... 171 more
Caused by: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType TIMESTAMP . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType TIMESTAMP . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Error
	at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:55)
	at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:87)
	... 188 more
Caused by: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType TIMESTAMP . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Error
	at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:55)
	at org.apache.ibatis.type.UnknownTypeHandler.setNonNullParameter(UnknownTypeHandler.java:45)
	at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:53)
	... 189 more
Caused by: java.sql.SQLException: Error
	at com.alibaba.druid.pool.DruidDataSource.handleConnectionException(DruidDataSource.java:1569)
	at com.alibaba.druid.pool.DruidPooledConnection.handleException(DruidPooledConnection.java:133)
	at com.alibaba.druid.pool.DruidPooledStatement.checkException(DruidPooledStatement.java:77)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.setTimestamp(DruidPooledPreparedStatement.java:416)
	at io.seata.rm.datasource.AbstractPreparedStatementProxy.setTimestamp(AbstractPreparedStatementProxy.java:201)
	at org.apache.ibatis.type.DateTypeHandler.setNonNullParameter(DateTypeHandler.java:33)
	at org.apache.ibatis.type.DateTypeHandler.setNonNullParameter(DateTypeHandler.java:28)
	at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:53)
	... 191 more
Caused by: java.lang.NullPointerException
	at com.mysql.jdbc.PreparedStatement.setTimestamp(PreparedStatement.java:4241)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.setTimestamp(DruidPooledPreparedStatement.java:414)
	... 195 more

这是因为seata代理数据源的原因,只有操作Date类型的时候会出现这个错误,这跟mysql-connection的版本有关系,只需把版本换到5.1.39即可。

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.39</version>
        </dependency>

以上就是升级后的主要修改,如有问题可留言,大家一起学习。

posted @ 2020-11-21 15:47  Conwie  阅读(1279)  评论(0编辑  收藏  举报