更新时间:2024-11-28 GMT+08:00
分享

运行MAS-DB-SDK问题参考

根据上述步骤配置MAS-DB-SDK后,确认相关配置信息都已包含且有效,运行项目可能会遇到一些问题,主要的问题及其相关解决过程如下:

  1. Logback-classic及log4j-to-slf4j的包冲突问题。

    关键错误信息如下所示:

    出现原因:

    对接SDK需要引入依赖包spring-cloud-starter-huawei-devspore-datasource,而本项目自带依赖包spring-boot-starter-actuator与其在Logback-classic及log4j-to-slf4j上存在冲突。

    解决方案:

    将对应的冲突包进行exclusion排除,排除方法如下,直接logback-classic和log4j-to-slf4j这两个包在spring-boot-starter-actuator下进行排除。排除后POM.XML显示如下:

  2. 缺少组件mybatis-spring-boot-starter。

    报错信息及截图如下:

    关键错误信息:

    nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required。

    出现原因:

    缺少相关依赖组件:mybatis-spring-boot-starter。

    解决方案:

    导入对应的依赖包,依赖包信息如下:

    <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
    </dependency>
  3. 未匹配到正确的数据源信息。

    报错信息截图如下:

    关键错误信息:

    Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.报错信息显示未匹配到正确的数据源信息,程序无法启动。

    出现原因:

    SpringBoot自带原生数据源,相关数据源的查找是由SpringBoot自动查找并注入,但是YAML件中将SDK提供的数据源替换SpringBoot提供的spring-dataSource后,相关依赖包无法找到数据源配置。

    解决方案:

    • 去除SpringBoot的spring-boot-starter-jdbc依赖包。

    • 配置数据SDK数据源,重启项目,将问题解决。

  4. 依赖包调用错误。

    关键错误信息:Correct the classpath of your application so that it contains a single, compatible version of org.springframework.plugin.core.PluginRegistry,如报错信息所示,是由于调用spring-plugin-core-2.0.0.RELEASE.jar内的一个方法时未找到,而报错。

    出现原因

    spring-plugin-core-2.0.0.RELEASE.jar对应的swagger2的版本较低。

    解决方案:

    当前swagger2的版本为2.9.2,要求将swagger2版本升级为3.0.0,重新加载即可。

    Pom文件修改如下:

  5. io.netty版本错误。

    关键错误信息:

    并且每一段时间会跳出报错信息:

    根因信息:java.lang.NoSuchMethodError:io.netty.buffer.PooledByteBufAllocator.<init>(ZIIIIIIZ)V。

    出现原因

    SDK的使用的io.netty版本较新,而项目本身的io.netty包的版本为4.1.49相对旧,不能满足SDK的需求,故而报错。

    解决方案:

    对io.netty等相关的依赖包进行升级为4.1.69.Final。主要为netty-buffer,netty-common,netty-transport等包的升级,可先将原先导入的包进行排除,再重新引入较高版本的对应包。相关pom文件操作如下:

  6. 容器刚启动时,etcd、mysql连接错误,后面自动恢复正常。

    关键错误信息

    load data from etcd failed:

    java.util.concurrent.ExecutionException: io.etcd.jetcd.common.exception.EtcdException: io exception

    at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)

    at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1915)

    at com.huawei.devspore.mas.etcd.v3impl.V3ClientImpl.get(V3ClientImpl.java:119)

    at com.huawei.devspore.datasource.config.loader.RemoteConfigurationLoader.getConfiguration(RemoteConfigurationLoader.java:102)

    at com.huawei.devspore.datasource.config.IntegrationClusterConfiguration.createIntegrationConfiguration(IntegrationClusterConfiguration.java:90)

    at com.huawei.devspore.datasource.jdbc.core.datasource.ClusterDataSource.init(ClusterDataSource.java:120)

    at com.huawei.devspore.datasource.jdbc.core.datasource.ClusterDataSource.init(ClusterDataSource.java:115)

    at com.huawei.devspore.datasource.jdbc.core.datasource.ClusterDataSource.<init>(ClusterDataSource.java:104)

    at com.huawei.devspore.datasource.jdbc.core.datasource.ClusterDataSourceFactory.createDataSource(ClusterDataSourceFactory.java:26)

    at com.huawei.devspore.datasource.spring.boot.ClusterSpringBootAutoConfiguration.clusterDataSource(ClusterSpringBootAutoConfiguration.java:60)

    at com.huawei.devspore.datasource.spring.boot.ClusterSpringBootAutoConfiguration$$EnhancerBySpringCGLIB$$e947fb9e.CGLIB$clusterDataSource$2(<generated>)

    at com.huawei.devspore.datasource.spring.boot.ClusterSpringBootAutoConfiguration$$EnhancerBySpringCGLIB$$e947fb9e$$FastClassBySpringCGLIB$$bfd0a96a.invoke(<generated>)

    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)

    ......

    Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: /10.211.171.180:2379

    Caused by: java.net.ConnectException: Connection refused

    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)

    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)

    at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330)

    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334)

    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:707)

    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)

    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)

    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)

    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)

    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)

    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)

    at java.lang.Thread.run(Thread.java:748)

    .......

    com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

    at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)

    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)

    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)

    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)

    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)

    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)

    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1657)

    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1723)

    at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2801)

    出现原因

    容器刚启动时,网络尚未正常初始化,导致连接etcd、mysql被拒绝。

    解决方案

    容器启动中增加时延。

  7. jackson版本冲突。

    关键错误信息

    nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/PropertyNamingStrategies$KebabCaseStrategy

    出现原因

    jackson版本冲突,低版本jackson中没有这个类。

    解决方案

    排除低版本jackson依赖,jackson-core使用2.13.2,jackson-databind使用2.13.2.2,jackson-annotation使用2.13.2版本。

  8. jdk版本较低,连etcd异常。

    关键错误信息

    Caused by: io.netty.channel.ChannelPopelineException: io.grpc.netty.ProtocolNegotiators$ClientTlsHandler.handlerAdded() has thrown an exception;

    at io.grpc.netty.ProtocolNegotiators$ProtocolNegotiationHandler.fireProtocolNegotiationEvent(ProtocolNegotiators.java:1089)

    ... 1 more

    Caused by: java.lang.RuntimeException: ALPN unsupported. Is your classpath configured correctly? For Conscrypt, add the appropriate Conscrypt JAR

    at io.grpc.netty.ProtocolNegotiators$ClientTlsHandler.handlerAdded0(ProtocolNegotiators.java:599)

    at io.grpc.netty.ProtocolNegotiators$ProtocolNegotiationHandler.handlerAdder(ProtocolNegotiators.java:1048)

    ... 21 more

    出现原因

    jdk版本较低,出问题的jdk版本为1.8.0_212,需要引入netty-tcnative-boringssl-static依赖。

    解决方案

    增加netty-tcnative-boringssl-static依赖,版本为2.0.46.Final;推荐使用1.8.0_272以上版本jdk。

相关文档