网站建设 鼠标,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