Explorar o código

加入shareding-jdbc 做分片处理

吴学文 %!s(int64=7) %!d(string=hai) anos
pai
achega
9b1498ba34

+ 20 - 20
CommunityService/src/main/resources/application-dev.yml

@@ -40,26 +40,26 @@ spring:
       max-idle: 100
       min-idle: 0
       timeout: 0
-  datasource:
-    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
-    minIdle: 5
-    validationQuery: SELECT 1 FROM DUAL
-    initialSize: 5
-    maxWait: 60000
-    filters: stat,wall,log4j
-    poolPreparedStatements: true
-    type: com.alibaba.druid.pool.DruidDataSource
-    url: jdbc:mysql://dev.db.java110.com:3306/TT?useUnicode=true&characterEncoding=utf-8
-    maxPoolPreparedStatementPerConnectionSize: 20
-    password: TT@12345678
-    testOnBorrow: false
-    testWhileIdle: true
-    minEvictableIdleTimeMillis: 300000
-    timeBetweenEvictionRunsMillis: 60000
-    testOnReturn: false
-    driverClassName: com.mysql.jdbc.Driver
-    maxActive: 20
-    username: TT
+#  datasource:
+#    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+#    minIdle: 5
+#    validationQuery: SELECT 1 FROM DUAL
+#    initialSize: 5
+#    maxWait: 60000
+#    filters: stat,wall,log4j
+#    poolPreparedStatements: true
+#    type: com.alibaba.druid.pool.DruidDataSource
+#    url: jdbc:mysql://dev.db.java110.com:3306/TT?useUnicode=true&characterEncoding=utf-8
+#    maxPoolPreparedStatementPerConnectionSize: 20
+#    password: TT@12345678
+#    testOnBorrow: false
+#    testWhileIdle: true
+#    minEvictableIdleTimeMillis: 300000
+#    timeBetweenEvictionRunsMillis: 60000
+#    testOnReturn: false
+#    driverClassName: com.mysql.jdbc.Driver
+#    maxActive: 20
+#    username: TT
 
 #============== kafka ===================
 kafka:

+ 80 - 0
CommunityService/src/main/resources/dataSource.yml

@@ -0,0 +1,80 @@
+dataSources:
+  ds0: !!com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.jdbc.Driver
+    url: jdbc:mysql://dev.db.java110.com:3306/hc_community?useUnicode=true&characterEncoding=utf-8
+    username: hc_community
+    password: hc_community@12345678
+    minIdle: 5
+    validationQuery: SELECT 1 FROM DUAL
+    initialSize: 5
+    maxWait: 60000
+    filters: stat,wall,log4j
+    poolPreparedStatements: true
+#  ds0_slave0: !!com.alibaba.druid.pool.DruidDataSource
+#    driverClassName: com.mysql.jdbc.Driver
+#    url: jdbc:mysql://dev.db.java110.com:3306/TT?useUnicode=true&characterEncoding=utf-8
+#    username: TT
+#    password: TT@12345678
+#    connectionTimeoutMilliseconds: 30000
+#    idleTimeoutMilliseconds: 60000
+#    maxPoolSize: 50
+#    minPoolSize: 1
+#    maintenanceIntervalMilliseconds: 30000
+  ds1: !!com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.jdbc.Driver
+    url: jdbc:mysql://dev.db.java110.com:3306/TT?useUnicode=true&characterEncoding=utf-8
+    username: TT
+    password: TT@12345678
+    minIdle: 5
+    validationQuery: SELECT 1 FROM DUAL
+    initialSize: 5
+    maxWait: 60000
+    filters: stat,wall,log4j
+    poolPreparedStatements: true
+#  ds1_slave0: !!com.alibaba.druid.pool.DruidDataSource
+#    driverClassName: com.mysql.jdbc.Driver
+#    url: jdbc:mysql://dev.db.java110.com:3306/TT?useUnicode=true&characterEncoding=utf-8
+#    username: TT
+#    password: TT@12345678
+#    connectionTimeoutMilliseconds: 30000
+#    idleTimeoutMilliseconds: 60000
+#    maxPoolSize: 50
+#    minPoolSize: 1
+#    maintenanceIntervalMilliseconds: 30000
+
+shardingRule:
+  tables:
+    business_community:
+      actualDataNodes: ds${0..1}.business_community
+      tableStrategy:
+        inline:
+          shardingColumn: community_id
+          algorithmExpression: business_community${business_community % 2}
+    community:
+      actualDataNodes: ds${0..1}.community
+      tableStrategy:
+        inline:
+          shardingColumn: community_id
+          algorithmExpression: community${community_id % 2}
+  bindingTables:
+    - business_community,community
+
+  defaultDataSourceName: ds0
+  defaultDatabaseStrategy:
+    none:
+  defaultTableStrategy:
+    none:
+
+#  masterSlaveRules:
+#    ms_ds0:
+#     masterDataSourceName: ds0
+#     slaveDataSourceNames:
+#       - ds0_slave0
+#     loadBalanceAlgorithmType: ROUND_ROBIN
+#   ms_ds1:
+#     masterDataSourceName: ds1
+#     slaveDataSourceNames:
+#       - ds1_slave0
+#     loadBalanceAlgorithmType: ROUND_ROBIN
+#props:
+#  sql.show: true

+ 73 - 0
java110-db/src/main/java/com/java110/db/DataSourceConfig.java

@@ -0,0 +1,73 @@
+package com.java110.db;
+
+import com.alibaba.druid.filter.Filter;
+import com.alibaba.druid.pool.DruidDataSource;
+import com.google.common.collect.Lists;
+import io.shardingsphere.core.api.ShardingDataSourceFactory;
+import io.shardingsphere.core.yaml.sharding.YamlShardingConfiguration;
+import io.shardingsphere.core.yaml.sharding.YamlShardingRuleConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+
+import javax.sql.DataSource;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.sql.SQLException;
+
+/**
+ * 数据源配置
+ */
+@Configuration
+public class DataSourceConfig {
+
+    @Autowired
+    private Filter statFilter;
+
+    private static final String SHARDING_YML_PATH = "dataSource.yml";
+
+    /**
+     * 构建dataSource
+     * 这里没有使用ShardingDataSourceFactory
+     * 因为要为durid数据源配置监听Filter
+     *
+     * @return 数据源对象
+     * @throws SQLException sql异常
+     * @throws IOException  IO 异常
+     * @since 1.8
+     */
+    @Bean
+    public DataSource dataSource() throws SQLException, IOException {
+        YamlShardingConfiguration config = parse();
+        YamlShardingRuleConfiguration rule = config.getShardingRule();
+        for (String key : config.getDataSources().keySet()) {
+            DruidDataSource d = (DruidDataSource) config.getDataSources().get(key);
+            d.setProxyFilters(Lists.newArrayList(statFilter));
+        }
+        return ShardingDataSourceFactory.createDataSource(config.getDataSources(),
+                rule.getShardingRuleConfiguration(), rule.getConfigMap(), rule.getProps());
+    }
+
+    /**
+     * 解析yml
+     *
+     * @return yaml 配置文件
+     * @throws IOException                  IO 异常
+     * @throws FileNotFoundException        文件未发现异常
+     * @throws UnsupportedEncodingException 不支持编码异常
+     */
+    private YamlShardingConfiguration parse() throws IOException, FileNotFoundException, UnsupportedEncodingException {
+        Resource certResource = new ClassPathResource(SHARDING_YML_PATH);
+        try (
+                InputStreamReader inputStreamReader = new InputStreamReader(certResource.getInputStream(), "UTF-8")
+        ) {
+            return new Yaml(new Constructor(YamlShardingConfiguration.class)).loadAs(inputStreamReader, YamlShardingConfiguration.class);
+        }
+    }
+}

+ 7 - 7
java110-db/src/main/java/com/java110/db/MyBatisConfig.java

@@ -29,13 +29,13 @@ public class MyBatisConfig implements TransactionManagementConfigurer {
 
     @Autowired
     DataSource dataSource;
-
-    @Bean(name = "dataSource")
-    @ConfigurationProperties(prefix = "spring.datasource")
-    public DataSource dataSource() {
-        DruidDataSource druidDataSource = new DruidDataSource();
-        return druidDataSource;
-    }
+//
+//    @Bean(name = "dataSource")
+//    @ConfigurationProperties(prefix = "spring.datasource")
+//    public DataSource dataSource() {
+//        DruidDataSource druidDataSource = new DruidDataSource();
+//        return druidDataSource;
+//    }
 
 
     @Bean(name = "sqlSessionFactory")

+ 3 - 4
java110-db/src/main/java/com/java110/db/druid/DruidConfiguration.java

@@ -6,7 +6,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.boot.web.servlet.ServletRegistrationBean;
-import org.springframework.context.annotation.Bean;
 
 /**
  * druid 配置.
@@ -20,9 +19,9 @@ public class DruidConfiguration {
     /**
      * 注册一个StatViewServlet
      *
-     * @return
+     * @return ServletRegistrationBean
      */
-    @Bean
+    //@Bean
     public ServletRegistrationBean DruidStatViewServle2() {
         //org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.
         ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid2/*");
@@ -46,7 +45,7 @@ public class DruidConfiguration {
      *
      * @return
      */
-    @Bean
+    //@Bean
     public FilterRegistrationBean druidStatFilter2() {
 
         FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());

+ 56 - 0
java110-db/src/main/java/com/java110/db/druid/DuridConfig.java

@@ -0,0 +1,56 @@
+package com.java110.db.druid;
+
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.alibaba.druid.filter.Filter;
+import com.alibaba.druid.filter.stat.StatFilter;
+import com.alibaba.druid.support.http.StatViewServlet;
+
+/**
+ * durid 配置类
+ */
+@Configuration
+public class DuridConfig {
+
+
+    //sql 显示
+    private static final int DEFAULT_SHOW_SQL_MILLIS = 5000;
+
+
+    /**
+     * 新建Filter
+     * @return Filter
+     */
+    @Bean
+    public Filter statFilter() {
+        StatFilter filter = new StatFilter();
+        filter.setSlowSqlMillis(DEFAULT_SHOW_SQL_MILLIS);
+        filter.setLogSlowSql(true);
+        filter.setMergeSql(true);
+        return filter;
+    }
+
+
+    /**
+     *  servlet注册
+     * @return ServletRegistrationBean
+     */
+    @Bean
+    public ServletRegistrationBean statViewServlet() {
+        //创建servlet注册实体
+        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
+        //设置ip白名单
+        servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
+        //设置ip黑名单,如果allow与deny共同存在时,deny优先于allow
+        //servletRegistrationBean.addInitParameter("deny","192.168.0.19");
+        //设置控制台管理用户
+        servletRegistrationBean.addInitParameter("loginUsername", "admin");
+        servletRegistrationBean.addInitParameter("loginPassword", "123456");
+        //是否可以重置数据
+        servletRegistrationBean.addInitParameter("resetEnable", "false");
+        return servletRegistrationBean;
+    }
+
+}