admin管理员组文章数量:1794759
sharding
一、在最开始提到了GroupIDAndCollectTimeDBShardingAlgorithm分库策略和CollectTimeYYYYMMDDTBShardingAlgorithm分表策略
这两个分别实现的是MultipleKeysDatabaseShardingAlgorithm实现了dosharding方法
CollectTimeYYYYMMDDTBShardingAlgorithm实现了SingleKeyTableShardingAlgorithm中的
doEqualSharding ,doInSharding , doBetweenSharding三个方法分别匹配sql语句中的 = , in , between
具体的实现就不写了,因为分片策略不同的场景有着不同的策略,理解了自然就通了。
综合以上讲解:实现sharding-jdbc数据源可以分为以下流程
一、写好配置文件
①包括制定数据源的类,有可能是自己实现的数据源
public class SwitchableDruidDataSource extends DruidDataSource {private static final Logger log = LoggerFactory.getLogger(SwitchableDruidDataSource.class);private static int maxRetryTimes = 20;private static int retryInterval = 10 * 1000;@Overridepublic Connection createPhysicalConnection() throws SQLException {if (!Boolean.valueOf(EmpfLocalConfigure.getValue("jdbc.ssl.switchable"))) {return super.createPhysicalConnection();}int retryCounter = 0;while (retryCounter < maxRetryTimes) {try {return super.createPhysicalConnection();} catch (Exception ex) {log.error("createPhysicalConnection error, ", ex);try {Thread.sleep(retryInterval);} catch (InterruptedException e1) {e1.printStackTrace();LoggerFactory.getLogger(DruidDataSource.class).info("retry with url[{}] => ", retryCounter, this.getUrl());}retryCounter++;switchSSL();if (retryCounter >= maxRetryTimes) {return super.createPhysicalConnection();}}}return null;}private void switchSSL() {if (StringUtils.indexOf(getUrl(), "useSSL=true") != -1) {this.setUrl(StringUtils.replace(getUrl(), "useSSL=true", "useSSL=false"));this.setUrl(StringUtils.replace(getUrl(), "verifyServerCertificate=true", "verifyServerCertificate=false"));} else if (StringUtils.indexOf(getUrl(), "useSSL=false") != -1) {this.setUrl(StringUtils.replace(getUrl(), "useSSL=false", "useSSL=true"));this.setUrl(StringUtils.replace(getUrl(), "verifyServerCertificate=false", "verifyServerCertificate=true"));}}}
②写好数据源和逻辑表的分库分表策略:这个可参考前两篇文章
二,写sharding 数据源,这个数据源要继承dangdang的shardingdatasource
public class YamlShardingDataSource extends com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource {private YamlConfig yamlConfig = null;public YamlShardingDataSource(final File yamlFile) throws IOException {// C_387386 NULL_RETURNSsuper(new ShardingRuleBuilder(yamlFile.getName(), unmarshal(yamlFile)).build(), null != unmarshal(yamlFile) ? unmarshal(yamlFile).getProps() : null);yamlConfig = unmarshal(yamlFile);LoggerFactory.getLogger(YamlShardingDataSource.class).debug("debug ==> " + yamlFile.getCanonicalPath());}private static YamlConfig unmarshal(final File yamlFile) throws IOException {try (FileInputStream fileInputStream = new FileInputStream(yamlFile);InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8")) {return new Yaml(new YamlShardingConstructor()).loadAs(inputStreamReader, YamlConfig.class);}}public YamlConfig getYamlConfig() {return yamlConfig;}
}
其中YamlShardingConstructor:
package com.pinnet.sharding.datasource;import com.pinnet.platformmon.configure.EmpfLocalConfigure;
import org.apachemons.lang.StringUtils;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.NodeId;
import org.yaml.snakeyaml.nodes.ScalarNode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class YamlShardingConstructor extends Constructor {//yaml规范已有${},此处使用${{}}做标记private static final Pattern placeHolderPattern = Patternpile("\\$\\{\\{([^}}]+)\\}\\}");public YamlShardingConstructor() {super(YamlConfig.class);yamlClassConstructors.put(NodeId.scalar, new EncryptedConstructScalar());}/*** YAML解析插入自定义逻辑*/private class EncryptedConstructScalar extends ConstructScalar {public Object construct(Node node) {if (node instanceof ScalarNode) {String val = (String) constructScalar((ScalarNode) node);//【安全特性简述】如果yaml中有${{}},则用EmpfLocalConfigure中的值替换Matcher matcher = placeHolderPattern.matcher(val);boolean replace = false;while (matcher.find()) {replace = true;val = StringUtils.replace(val, matcher.group(0), EmpfLocalConfigure.getValue(matcher.group(1)));}if (replace) {return val;}}return super.construct(node);}}}
yamlconifg
public class YamlConfig extends ShardingRuleConfig {private Properties props = new Properties();public Properties getProps() {return props;}public void setProps(Properties props) {this.props = props;}
}
分片策略详解可以查看:
本文标签: sharding
版权声明:本文标题:sharding 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1695236850a299573.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论