当前位置: 首页 > news >正文

网站建设 鼠标tag 网站备案

网站建设 鼠标,tag 网站备案,网站建站行业新闻,佛山市建设局网站Sharding JDBC自动配置的原理 与所有starter一样#xff0c;shardingsphere-jdbc-core-spring-boot-starter也是通过SPI自动配置的原理实现分库分表配置加载#xff0c;spring.factories文件中的自动配置类shardingsphere-jdbc-core-spring-boot-starter功不可没#xff0c…Sharding JDBC自动配置的原理 与所有starter一样shardingsphere-jdbc-core-spring-boot-starter也是通过SPI自动配置的原理实现分库分表配置加载spring.factories文件中的自动配置类shardingsphere-jdbc-core-spring-boot-starter功不可没他主要是自动创建了模式bean、事务类型bean和数据源bean配置加载的过程可以归纳如下 #mermaid-svg-CRcQ7ODjQS7bHtwt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CRcQ7ODjQS7bHtwt .error-icon{fill:#552222;}#mermaid-svg-CRcQ7ODjQS7bHtwt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CRcQ7ODjQS7bHtwt .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-CRcQ7ODjQS7bHtwt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CRcQ7ODjQS7bHtwt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CRcQ7ODjQS7bHtwt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CRcQ7ODjQS7bHtwt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CRcQ7ODjQS7bHtwt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CRcQ7ODjQS7bHtwt .marker.cross{stroke:#333333;}#mermaid-svg-CRcQ7ODjQS7bHtwt svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CRcQ7ODjQS7bHtwt .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CRcQ7ODjQS7bHtwt .cluster-label text{fill:#333;}#mermaid-svg-CRcQ7ODjQS7bHtwt .cluster-label span{color:#333;}#mermaid-svg-CRcQ7ODjQS7bHtwt .label text,#mermaid-svg-CRcQ7ODjQS7bHtwt span{fill:#333;color:#333;}#mermaid-svg-CRcQ7ODjQS7bHtwt .node rect,#mermaid-svg-CRcQ7ODjQS7bHtwt .node circle,#mermaid-svg-CRcQ7ODjQS7bHtwt .node ellipse,#mermaid-svg-CRcQ7ODjQS7bHtwt .node polygon,#mermaid-svg-CRcQ7ODjQS7bHtwt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CRcQ7ODjQS7bHtwt .node .label{text-align:center;}#mermaid-svg-CRcQ7ODjQS7bHtwt .node.clickable{cursor:pointer;}#mermaid-svg-CRcQ7ODjQS7bHtwt .arrowheadPath{fill:#333333;}#mermaid-svg-CRcQ7ODjQS7bHtwt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CRcQ7ODjQS7bHtwt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CRcQ7ODjQS7bHtwt .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-CRcQ7ODjQS7bHtwt .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-CRcQ7ODjQS7bHtwt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CRcQ7ODjQS7bHtwt .cluster text{fill:#333;}#mermaid-svg-CRcQ7ODjQS7bHtwt .cluster span{color:#333;}#mermaid-svg-CRcQ7ODjQS7bHtwt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CRcQ7ODjQS7bHtwt :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 创建模式bean 创建数据源bean 创建事务类型扫描bean ShardingSphereAutoConfiguration ModeConfiguration ShardingSphereDataSource TransactionTypeScanner 其中创建数据源bean时会根据不同的模式创建不同的bean本地模式直接从配置文件中加载配置中心模式就从配置中心加载。ShardingSphereAutoConfiguration的实现如下 Configuration ComponentScan(org.apache.shardingsphere.spring.boot.converter) EnableConfigurationProperties(SpringBootPropertiesConfiguration.class) AutoConfigureBefore(DataSourceAutoConfiguration.class) RequiredArgsConstructor public class ShardingSphereAutoConfiguration implements EnvironmentAware {private String databaseName;private final SpringBootPropertiesConfiguration props;private final MapString, DataSource dataSourceMap new LinkedHashMap();/*** 模式配置** return mode configuration*/Beanpublic ModeConfiguration modeConfiguration() {return null props.getMode() ? null : new YamlModeConfigurationSwapper().swapToObject(props.getMode());}/*** 单机模式从本地配置中加载DataSource** param rules rules configuration* param modeConfig mode configuration* return data source bean* throws SQLException SQL exception*/BeanConditional(LocalRulesCondition.class)Autowired(required false)public DataSource shardingSphereDataSource(final ObjectProviderListRuleConfiguration rules, final ObjectProviderModeConfiguration modeConfig) throws SQLException {CollectionRuleConfiguration ruleConfigs Optional.ofNullable(rules.getIfAvailable()).orElseGet(Collections::emptyList);return ShardingSphereDataSourceFactory.createDataSource(databaseName, modeConfig.getIfAvailable(), dataSourceMap, ruleConfigs, props.getProps());}/*** 集群模式从配置中心中加载DataSource** param modeConfig mode configuration* return data source bean* throws SQLException SQL exception*/BeanConditionalOnMissingBean(DataSource.class)public DataSource dataSource(final ModeConfiguration modeConfig) throws SQLException {return !dataSourceMap.isEmpty() ? ShardingSphereDataSourceFactory.createDataSource(databaseName, modeConfig, dataSourceMap, Collections.emptyList(), props.getProps()): ShardingSphereDataSourceFactory.createDataSource(databaseName, modeConfig);}/*** 事务类型扫描bean** return transaction type scanner*/Beanpublic TransactionTypeScanner transactionTypeScanner() {return new TransactionTypeScanner();}Overridepublic final void setEnvironment(final Environment environment) {dataSourceMap.putAll(DataSourceMapSetter.getDataSourceMap(environment));databaseName DatabaseNameSetter.getDatabaseName(environment);} }下面以单机模式出发点理一下加载的过程。 Bean Conditional(LocalRulesCondition.class) Autowired(required false) public DataSource shardingSphereDataSource(final ObjectProviderListRuleConfiguration rules, final ObjectProviderModeConfiguration modeConfig) throws SQLException {CollectionRuleConfiguration ruleConfigs Optional.ofNullable(rules.getIfAvailable()).orElseGet(Collections::emptyList);// 通过ShardingSphereDataSourceFactory工厂创建数据源return ShardingSphereDataSourceFactory.createDataSource(databaseName, modeConfig.getIfAvailable(), dataSourceMap, ruleConfigs, props.getProps()); }通过对源码的跟踪可以发现ShardingSphereDataSourceFactory.createDataSource创建数据源经历了如下的过程 #mermaid-svg-AQbyFbXnvcCzw2xV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AQbyFbXnvcCzw2xV .error-icon{fill:#552222;}#mermaid-svg-AQbyFbXnvcCzw2xV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AQbyFbXnvcCzw2xV .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-AQbyFbXnvcCzw2xV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AQbyFbXnvcCzw2xV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AQbyFbXnvcCzw2xV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AQbyFbXnvcCzw2xV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AQbyFbXnvcCzw2xV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AQbyFbXnvcCzw2xV .marker.cross{stroke:#333333;}#mermaid-svg-AQbyFbXnvcCzw2xV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AQbyFbXnvcCzw2xV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AQbyFbXnvcCzw2xV .cluster-label text{fill:#333;}#mermaid-svg-AQbyFbXnvcCzw2xV .cluster-label span{color:#333;}#mermaid-svg-AQbyFbXnvcCzw2xV .label text,#mermaid-svg-AQbyFbXnvcCzw2xV span{fill:#333;color:#333;}#mermaid-svg-AQbyFbXnvcCzw2xV .node rect,#mermaid-svg-AQbyFbXnvcCzw2xV .node circle,#mermaid-svg-AQbyFbXnvcCzw2xV .node ellipse,#mermaid-svg-AQbyFbXnvcCzw2xV .node polygon,#mermaid-svg-AQbyFbXnvcCzw2xV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AQbyFbXnvcCzw2xV .node .label{text-align:center;}#mermaid-svg-AQbyFbXnvcCzw2xV .node.clickable{cursor:pointer;}#mermaid-svg-AQbyFbXnvcCzw2xV .arrowheadPath{fill:#333333;}#mermaid-svg-AQbyFbXnvcCzw2xV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AQbyFbXnvcCzw2xV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AQbyFbXnvcCzw2xV .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-AQbyFbXnvcCzw2xV .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-AQbyFbXnvcCzw2xV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AQbyFbXnvcCzw2xV .cluster text{fill:#333;}#mermaid-svg-AQbyFbXnvcCzw2xV .cluster span{color:#333;}#mermaid-svg-AQbyFbXnvcCzw2xV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AQbyFbXnvcCzw2xV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 创建数据源bean new 创建上下文管理器 创建JDBC上下文 创建InstanceMetaData 根据mode调用 创建元数据上下文 创建数据库连接元数据 调用 加载分片规则 new ShardingSphereAutoConfiguration ShardingSphereDataSourceFactory.createDataSource ShardingSphereDataSource ShardingSphereDataSource.createContextManager JDBCContext InstanceMetaDataBuilderFactory.create StandaloneContextManagerBuilder.build MetaDataContextsFactory.create ShardingSphereDatabasesFactory.create ShardingSphereDatabase.create DatabaseRulesBuilder.build ShardingSphereDatabase 分片规则加载原理 分片规则、审计规则、key生成规则都是通过SPI的方式加载自动配置类ShardingSphereAutoConfiguration中创建ShardingSphereDataSource的时候会加载配置的分片规则创建核心配置类ShardingRule在ShardingRule的创建中会通过SPI的方式加载分片规则。加载的过程如下 #mermaid-svg-zFpHfQ5UZ0lnfi1U {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .error-icon{fill:#552222;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .marker.cross{stroke:#333333;}#mermaid-svg-zFpHfQ5UZ0lnfi1U svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .cluster-label text{fill:#333;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .cluster-label span{color:#333;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .label text,#mermaid-svg-zFpHfQ5UZ0lnfi1U span{fill:#333;color:#333;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .node rect,#mermaid-svg-zFpHfQ5UZ0lnfi1U .node circle,#mermaid-svg-zFpHfQ5UZ0lnfi1U .node ellipse,#mermaid-svg-zFpHfQ5UZ0lnfi1U .node polygon,#mermaid-svg-zFpHfQ5UZ0lnfi1U .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .node .label{text-align:center;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .node.clickable{cursor:pointer;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .arrowheadPath{fill:#333333;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .cluster text{fill:#333;}#mermaid-svg-zFpHfQ5UZ0lnfi1U .cluster span{color:#333;}#mermaid-svg-zFpHfQ5UZ0lnfi1U div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zFpHfQ5UZ0lnfi1U :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 创建数据源bean 查询实例 通过SPI Class获取服务实例 Y:创建新的service实例 N:Map中获取service单例 创建分片规则 创建分片规则 创建核心分库分表规则 分片规则 Key生成规则 审计规则 通过工厂创建分片算法 获取注册的service SPI方式获取service 通过工厂创建key生成算法 通过工厂创建审计算法 ShardingSphereAutoConfiguration ShardingSphereDataSource 一系列加载... DatabaseRulesBuilder.build OrderedSPIRegistry.getRegisteredServices ShardingSphereServiceLoader.getServiceInstances(spiClass) 带SingletonSPI注解? service.getClass().getDeclaredConstructor().newInstance() SERVICES.getOrDefault(serviceInterface, Collections.emptyList()) ShardingRuleBuilder.build new ShardingRule ShardingAlgorithmFactory.newInstance KeyGenerateAlgorithmFactory.newInstance ShardingAuditAlgorithmFactory.newInstance ShardingSphereAlgorithmFactory.createAlgorithm TypedSPIRegistry.getRegisteredService ShardingSphereServiceLoader.getServiceInstances(spiClass) SPI核心实现类ShardingSphereServiceLoader中会将SPI接口进行Map缓存管理需要时直接获取。如果Map中不存在就通过反射的方式新建服务实例具体实现源码如下 public final class ShardingSphereServiceLoader {// 缓存service实例// 缓存的Key,如// org.apache.shardingsphere.sharding.spi.ShardingAlgorithm// org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm// org.apache.shardingsphere.transaction.spi.ShardingSphereTransactionManagerprivate static final MapClass?, CollectionObject SERVICES new ConcurrentHashMap();/*** 注册服务实例** param 服务接口*/public static void register(final Class? serviceInterface) {if (!SERVICES.containsKey(serviceInterface)) {SERVICES.put(serviceInterface, load(serviceInterface));}}private static T CollectionObject load(final ClassT serviceInterface) {CollectionObject result new LinkedList();for (T each : ServiceLoader.load(serviceInterface)) {result.add(each);}return result;}/*** 获取服务实例* * param 服务接口* param T 服务类型* return 服务实例*/public static T CollectionT getServiceInstances(final ClassT serviceInterface) {return null serviceInterface.getAnnotation(SingletonSPI.class) ? createNewServiceInstances(serviceInterface) : getSingletonServiceInstances(serviceInterface);}SneakyThrows(ReflectiveOperationException.class)SuppressWarnings(unchecked)private static T CollectionT createNewServiceInstances(final ClassT serviceInterface) {if (!SERVICES.containsKey(serviceInterface)) {return Collections.emptyList();}CollectionObject services SERVICES.get(serviceInterface);if (services.isEmpty()) {return Collections.emptyList();}CollectionT result new LinkedList();for (Object each : services) {// 通过反射新建实例result.add((T) each.getClass().getDeclaredConstructor().newInstance());}return result;}SuppressWarnings(unchecked)private static T CollectionT getSingletonServiceInstances(final ClassT serviceInterface) {return (CollectionT) SERVICES.getOrDefault(serviceInterface, Collections.emptyList());} }
文章转载自:
http://www.morning.bhdtx.cn.gov.cn.bhdtx.cn
http://www.morning.pmdzd.cn.gov.cn.pmdzd.cn
http://www.morning.nxcgp.cn.gov.cn.nxcgp.cn
http://www.morning.lxmmx.cn.gov.cn.lxmmx.cn
http://www.morning.llmhq.cn.gov.cn.llmhq.cn
http://www.morning.bcngs.cn.gov.cn.bcngs.cn
http://www.morning.klyyd.cn.gov.cn.klyyd.cn
http://www.morning.qztdz.cn.gov.cn.qztdz.cn
http://www.morning.jlxqx.cn.gov.cn.jlxqx.cn
http://www.morning.bwqr.cn.gov.cn.bwqr.cn
http://www.morning.ktcrr.cn.gov.cn.ktcrr.cn
http://www.morning.synlt.cn.gov.cn.synlt.cn
http://www.morning.gjlml.cn.gov.cn.gjlml.cn
http://www.morning.zsyrk.cn.gov.cn.zsyrk.cn
http://www.morning.rwzmz.cn.gov.cn.rwzmz.cn
http://www.morning.xpzrx.cn.gov.cn.xpzrx.cn
http://www.morning.zynjt.cn.gov.cn.zynjt.cn
http://www.morning.ghcfx.cn.gov.cn.ghcfx.cn
http://www.morning.yxkyl.cn.gov.cn.yxkyl.cn
http://www.morning.wsnbg.cn.gov.cn.wsnbg.cn
http://www.morning.bmmyx.cn.gov.cn.bmmyx.cn
http://www.morning.gsyns.cn.gov.cn.gsyns.cn
http://www.morning.pshpx.cn.gov.cn.pshpx.cn
http://www.morning.mcjxq.cn.gov.cn.mcjxq.cn
http://www.morning.xprq.cn.gov.cn.xprq.cn
http://www.morning.zlnf.cn.gov.cn.zlnf.cn
http://www.morning.xdttq.cn.gov.cn.xdttq.cn
http://www.morning.btpll.cn.gov.cn.btpll.cn
http://www.morning.fwrr.cn.gov.cn.fwrr.cn
http://www.morning.wwwghs.com.gov.cn.wwwghs.com
http://www.morning.tpyjr.cn.gov.cn.tpyjr.cn
http://www.morning.bmtkp.cn.gov.cn.bmtkp.cn
http://www.morning.pjjkz.cn.gov.cn.pjjkz.cn
http://www.morning.gmplp.cn.gov.cn.gmplp.cn
http://www.morning.csgwd.cn.gov.cn.csgwd.cn
http://www.morning.msgnx.cn.gov.cn.msgnx.cn
http://www.morning.jrgxx.cn.gov.cn.jrgxx.cn
http://www.morning.nhdw.cn.gov.cn.nhdw.cn
http://www.morning.xsbhg.cn.gov.cn.xsbhg.cn
http://www.morning.mumgou.com.gov.cn.mumgou.com
http://www.morning.wkkqw.cn.gov.cn.wkkqw.cn
http://www.morning.clfct.cn.gov.cn.clfct.cn
http://www.morning.zqcgt.cn.gov.cn.zqcgt.cn
http://www.morning.ybhjs.cn.gov.cn.ybhjs.cn
http://www.morning.wqpm.cn.gov.cn.wqpm.cn
http://www.morning.ppghc.cn.gov.cn.ppghc.cn
http://www.morning.fxxmj.cn.gov.cn.fxxmj.cn
http://www.morning.qnhpq.cn.gov.cn.qnhpq.cn
http://www.morning.gcysq.cn.gov.cn.gcysq.cn
http://www.morning.mhbcy.cn.gov.cn.mhbcy.cn
http://www.morning.ydhck.cn.gov.cn.ydhck.cn
http://www.morning.qsbcg.cn.gov.cn.qsbcg.cn
http://www.morning.nmkfy.cn.gov.cn.nmkfy.cn
http://www.morning.cpwmj.cn.gov.cn.cpwmj.cn
http://www.morning.pbpcj.cn.gov.cn.pbpcj.cn
http://www.morning.bnfrj.cn.gov.cn.bnfrj.cn
http://www.morning.jjnql.cn.gov.cn.jjnql.cn
http://www.morning.kpxnz.cn.gov.cn.kpxnz.cn
http://www.morning.wjlbb.cn.gov.cn.wjlbb.cn
http://www.morning.mypxm.com.gov.cn.mypxm.com
http://www.morning.mfrb.cn.gov.cn.mfrb.cn
http://www.morning.jcfg.cn.gov.cn.jcfg.cn
http://www.morning.czqqy.cn.gov.cn.czqqy.cn
http://www.morning.fqklt.cn.gov.cn.fqklt.cn
http://www.morning.plpqf.cn.gov.cn.plpqf.cn
http://www.morning.bgpb.cn.gov.cn.bgpb.cn
http://www.morning.tpbhf.cn.gov.cn.tpbhf.cn
http://www.morning.rfxyk.cn.gov.cn.rfxyk.cn
http://www.morning.mfnjk.cn.gov.cn.mfnjk.cn
http://www.morning.wgrl.cn.gov.cn.wgrl.cn
http://www.morning.smry.cn.gov.cn.smry.cn
http://www.morning.qrlkt.cn.gov.cn.qrlkt.cn
http://www.morning.nqcwz.cn.gov.cn.nqcwz.cn
http://www.morning.kndt.cn.gov.cn.kndt.cn
http://www.morning.fengnue.com.gov.cn.fengnue.com
http://www.morning.ycwym.cn.gov.cn.ycwym.cn
http://www.morning.rczrq.cn.gov.cn.rczrq.cn
http://www.morning.jyzxt.cn.gov.cn.jyzxt.cn
http://www.morning.bpmdz.cn.gov.cn.bpmdz.cn
http://www.morning.jlktz.cn.gov.cn.jlktz.cn
http://www.tj-hxxt.cn/news/245079.html

相关文章:

  • 永久免费的移动建站平台江门网站推广公司
  • 南阳网站建设优化wordpress自定义属性
  • 泰州企业建站系统免费试用网站怎么做
  • 南京俄语网站建设wordpress上传图片不清楚
  • 重庆网站建设推荐seo建站的步骤
  • 做微官网什么网站好上海中高风险地区
  • 网站怎么做友链wordpress 取一类文章
  • app制作定制外包服务商e浙江网站建设抖音seo优化
  • icp网站域名怎么填写wordpress怎么做app
  • 芜湖网站建设推广平顶山有做网站的公司
  • 网站描述怎样写建设一个网站的具体流程
  • 网站开发与app差距东莞网络建设
  • 档案网站建设对比263企业邮箱入口 邮箱登录
  • 金昌市网站建设网站建设案例收费情况
  • ppt模版模板免费网站爱心代码编程html教程
  • 网站建设公司 知乎dw网站建设的常用技术
  • 网站建设流程 文档做电视的视频网站
  • 免费php模板网站网站域名服务器查询
  • 企业建设网站的方式有两种网站建设H5 源码
  • 德州网站建设赖殿波中山网站上排名
  • 网站帮助页面设计邯郸人才网
  • 建设网站资质查询重庆做网站微信的公司
  • 怎么通过数据库做网站的登录中国建设招标网官方网站
  • 怎么把自己的产品推广出去网站优化的方式
  • 重庆网站首页制作网站建设与网页设计美食
  • 进入建设银行的网站就打不了字品牌推广计划
  • 如何做直播网站网站建设教学工作总结
  • 怎么修改网站后台路径平面设计工作好找吗
  • 廊坊做网站企业教程上海网页设计学校
  • 精品购物网站中国电力建设集团公司网站