使用ShardingSphere需要注意的问题

问题1

在配置文件中 datasource 的数据源名称设置为 yudao_orders_0 时出现如下错误

1
Caused by: org.springframework.boot.context.properties.source.InvalidConfigurationPropertyNameException: Configuration property name 'spring.shardingsphere.datasource.yudao_orders_0' is not valid

原因是配置文件中的 datasource 的命名中不能带下划线,改为 yudao-orders-0 即可

问题2

在 application.yaml 中配置 type 字段,即连接池类型时,如果选择的是 Druid,要注意 maven 依赖
pom.xml 文件中 druid-spring-boot-starter 和 sharding-jdbc-spring-boot-starter 不能同时出现

  1. 因为数据连接池的starter(比如druid)可能会先加载并且其创建一个默认数据源,这将会使得ShardingSphere-JDBC创建数据源时发生冲突。
    解决方法有2种:
  2. 在启动类中排除 Druid 自动配置类@SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class})
  3. 将 druid-spring-boot-starter 依赖替换为纯 Druid,如下
1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>

问题3

读写分离配置时注意配置的名称,其中的 slave-data-source-names最后有个s

1
2
3
4
5
6
spring:
shardingsphere:
masterslave:
name: ms # 名字,任意,需要保证唯一
master-data-source-name: ds-master # 主库数据源
slave-data-source-names: ds-slave-1, ds-slave-2 # 从库数据源

问题4

Shardingsphere 4.1.1 和 Swagger 2.9.2 存在冲突
Swagger 2.9.2 依赖于 Guava 20.0 以上的版本,但是 Shardingsphere 4.1.1 中引入的是 Guava 18.0 版本,所以启动项目时会导致以下错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Caused by: org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.NoSuchMethodError: com.google.common.collect.FluentIterable.concat(Ljava/lang/Iterable;Ljava/lang/Iterable;)Lcom/google/common/collect/FluentIterable;
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:176)
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:50)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:346)
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:149)
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:112)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:880)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:144)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
... 25 more

手动引入 20.0 版本的 Guava 后可以解决该问题

1
2
3
4
5
6
<!-- 主要因为 shardingsphere 中默认的 guava 依赖版本是 18.0 和 swagger 2.9.2 冲突,所以手动引入 20.0 版本的 -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>

参考

FAQ :: ShardingSphere
【ShardingSphere】2. Spring Boot整合Sharding-JDBC实现读写分离 - 贺小康的个人空间 - OSCHINA - 中文开源技术交流社区
SpringBoot 2.x ShardingSphere读写分离实战