中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

SpringCloud學(xué)習(xí)系列之五-----配置中心(Con-創(chuàng)新互聯(lián)

前言
本篇?jiǎng)t介紹基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的分布式配置中心(SpringCloud Config)的配置刷新和消息總線(RabbitMQ和Kafka)使用教程。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括嫩江網(wǎng)站建設(shè)、嫩江網(wǎng)站制作、嫩江網(wǎng)頁制作以及嫩江網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,嫩江網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到嫩江省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

SpringCloud Config Refresh
在上一篇中我們介紹了springcloud配置中心的本地使用和Git使用的用法,但是當(dāng)重新修改配置文件提交后,客戶端獲取的仍然是修改前的信息,需要客戶端重啟才可以獲取最新的信息。因此我們需要客戶端能夠動(dòng)態(tài)進(jìn)行更新,幸好springcloud官方已經(jīng)給出方案,所以我們只需要使用就行了。

開發(fā)準(zhǔn)備
開發(fā)環(huán)境

JDK:1.8
SpringBoot:2.0.6.RELEASE
SpringCloud:Finchley.SR2
注:不一定非要用上述的版本,可以根據(jù)情況進(jìn)行相應(yīng)的調(diào)整。需要注意的是SpringBoot2.x以后,jdk的版本必須是1.8以上!

確認(rèn)了開發(fā)環(huán)境之后,我們?cè)賮硖砑酉嚓P(guān)的pom依賴。

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
服務(wù)端
服務(wù)端以及注冊(cè)中心這塊配置和代碼和之前springcloud-config配置基本一樣即可。注冊(cè)中心新項(xiàng)目的的名稱為springcloud-config-bus-eureka,服務(wù)端新項(xiàng)目的的名稱為springcloud-config-bus-server。

注冊(cè)中心pom配置、application.properties配置和代碼如下:

pom:

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
application.properties:

spring.application.name=springcloud-config-bus-eureka
server.port=8006
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
代碼:

12
3
4
5
6
7
8
9
10
@SpringBootApplication
br/>2
3
4
5
6
7
8
9
10
@SpringBootApplication
public class ConfigBusEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigBusEurekaApplication.class, args);
System.out.println("config bus 注冊(cè)中心服務(wù)啟動(dòng)...");
}
}
服務(wù)端pom配置、application.properties配置和代碼如下:

pom:

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
application.properties:

spring.application.name=springcloud-config-server
server.port=9005
eureka.client.serviceUrl.defaultZone=http://localhost:8005/eureka/
spring.cloud.config.server.git.uri = https://github.com/xuwujing/springcloud-study/
spring.cloud.config.server.git.search-paths = /springcloud-config/config-repo
spring.cloud.config.server.git.username =
spring.cloud.config.server.git.password =
代碼:

12
3
4
5
6
7
8
9
10
11
@EnableDiscoveryClient
br/>2
3
4
5
6
7
8
9
10
11
@EnableDiscoveryClient
br/>@SpringBootApplication
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
System.out.println("配置中心服務(wù)端啟動(dòng)成功!");
}
}
客戶端
客戶端這邊在之前springcloud-config-client項(xiàng)目中進(jìn)行改造,新項(xiàng)目的的名稱為springcloud-config-bus-client,在pom文件中新增如下配置:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
spring-boot-starter-actuator表示對(duì)該程序進(jìn)行監(jiān)控,可以通過http接口得到該程序的各種信息,詳細(xì)的使用可以查看我的這個(gè)項(xiàng)目springboot-actuator,可以在注釋中查詢各種接口的使用。

然后再到配置文件application.properties中添加如下配置:

management.endpoints.web.exposure.include=refresh
該配置表示暴露刷新的地址為refresh。

注:如果是SpringBoot1.x的版本,那么配置改成management.security.enabled=false即可。

最后在客戶端的Controller增加一個(gè)@RefreshScope注解,該注解表示在接到SpringCloud配置中心配置刷新的時(shí)候,自動(dòng)將新的配置更新到該類對(duì)應(yīng)的字段中。

12
3
4
5
6
7
8
9
10
11
12
13
@RestController
br/>2
3
4
5
6
7
8
9
10
11
12
13
@RestController
public class ClientController {

@Value("${word}")
private String word;

@RequestMapping("/hello")
public String index(@RequestParam String name) {
    return name+","+this.word;
}

}
測(cè)試
完成上述的代碼開發(fā)后,我們來進(jìn)行測(cè)試Spring-Config是否可以進(jìn)行配置實(shí)時(shí)更新。
首先依次啟動(dòng)springcloud-config-bus-eureka、springcloud-config-bus-server和springcloud-config-bus-client這三個(gè)項(xiàng)目。其中9005是服務(wù)端springcloud-config-bus-server的端口,9006是第一個(gè)客戶端springcloud-config-bus-client的端口。
啟動(dòng)成功之后,在瀏覽器輸入:

http://localhost:9006//hello?name=pancm

界面返回:

pancm,hello world!!
可以正常得到服務(wù)端configtest-pro.properties的配置信息。

然后在把configtest-pro.properties的配置更改為:

word=hello
然后我們?cè)贋g覽器輸入:

http://localhost:9006//hello?name=pancm

界面返回:

pancm,hello world!!
可以發(fā)現(xiàn)配置并沒有實(shí)時(shí)的刷新,查閱官方文檔得知,需要客戶端通過POST方法觸發(fā)各自的/refresh,所以這里我們就用Postman工具模擬post請(qǐng)求刷新,然后再查看信息。

使用POST請(qǐng)求如下地址:

http://localhost:9006/actuator/refresh

返回:

[
"word"
]
說明完成了word配置的刷新,我們?cè)贋g覽器輸入:

http://localhost:9006//hello?name=pancm

界面返回:

pancm,hello
發(fā)現(xiàn)已經(jīng)成功實(shí)現(xiàn)配置刷新了!

示例圖:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

SpringCloud Config Bus
上述的示例中,我們客戶端發(fā)現(xiàn)每次獲取最新配置都需要手動(dòng)進(jìn)行刷新,如果少的的話還可以使用,但是多的話就比較繁瑣了,雖然我們可以使用類似Github的WebHook的工具。

WebHook是當(dāng)某個(gè)事件發(fā)生時(shí),通過發(fā)送http post請(qǐng)求的方式來通知信息接收方。

但是當(dāng)客戶端越來越多的時(shí)候WebHook已經(jīng)不好使用了,每次新增客戶端都需要更改WebHook會(huì)顯得很麻煩,springcloud官方給出了非常好的解決方案,Spring Cloud Bus。

Spring cloud bus通過輕量消息代理連接各個(gè)分布的節(jié)點(diǎn)。這會(huì)用在廣播狀態(tài)的變化(例如配置變化)或者其他的消息指令。Spring bus的一個(gè)核心思想是通過分布式的啟動(dòng)器對(duì)spring boot應(yīng)用進(jìn)行擴(kuò)展,也可以用來建立一個(gè)多個(gè)應(yīng)用之間的通信頻道。目前唯一實(shí)現(xiàn)的方式是用AMQP消息代理作為通道,同樣特性的設(shè)置(有些取決于通道的設(shè)置)在更多通道的文檔中。

為什么使用Spring Cloud Bus就可以解決這個(gè)問題了呢?
我們不一定非要透徹的理解其原理才可以知道,我們只需要知道它的實(shí)現(xiàn)步驟,就可以知道了為什么可以解決了。
步驟如下:

首先,在配置中進(jìn)行更新配置文件信息,它就會(huì)自動(dòng)觸發(fā)post發(fā)送bus/refresh;
然后服務(wù)端就會(huì)將更新的配置并且發(fā)送給Spring Cloud Bus;
繼而Spring Cloud bus接到消息之后并通知給使用該配置的客戶端;
最后使用該配置的客戶端收到通知后,就會(huì)獲取最新的配置進(jìn)行更新;
這里我也簡(jiǎn)單的畫了下使用Spring Cloud Bus之前和之后的流程圖,方便進(jìn)行理解。

不使用Spring Cloud Bus獲取配置信息流程圖:

在這里插入圖片描述

使用Spring Cloud Bus獲取配置信息流程圖:

在這里插入圖片描述

開發(fā)準(zhǔn)備
和上述的環(huán)境一樣即可。

RabbitMQ 的安裝教程可以看我之前寫的這篇文章:RabbitMQ的環(huán)境安裝及配置。

Kafka 的安裝教程可以看我之前寫的這篇文章:kafka安裝使用教程。

服務(wù)端
Spring Cloud Bus 主要的使用的MQ主要使用的是,RabbitMQ和Kafka。至于使用的話就可以根據(jù)情況來進(jìn)行選擇,主要使用的是哪個(gè)MQ就用哪一個(gè)就行了。這里我們就用RabbitMQ作為示例來進(jìn)行講解,Kafka的使用也差不多,也無在乎配置更改而已。

首先在springcloud-config-bus-server服務(wù)端的pom文件添加如下配置:

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

</dependencies>
注: spring-boot-starter-actuator這個(gè)是必須的,不然是無法在服務(wù)端進(jìn)行配置刷新請(qǐng)求的。如果是使用的kafka的話,只需將spring-cloud-starter-bus-amqp改成spring-cloud-starter-bus-kafka即可。

然后再到配置文件中添加如下配置:

配置信息:

spring.application.name=springcloud-config-bus-server
server.port=9005
eureka.client.serviceUrl.defaultZone=http://localhost:8006/eureka/

spring.cloud.config.server.git.uri = https://github.com/xuwujing/springcloud-study/
spring.cloud.config.server.git.search-paths = /springcloud-config/config-repo
spring.cloud.config.server.git.username =
spring.cloud.config.server.git.password =

management.endpoints.web.exposure.include= bus-refresh
spring.cloud.bus.enabled = true
spring.cloud.bus.trace.enabled = true

spring.rabbitmq.host:127.0.0.1
spring.rabbitmq.port:5672
spring.rabbitmq.username:guest
spring.rabbitmq.password:guest
配置說明:

spring.application.name : 這個(gè)是指定服務(wù)名稱。
server.port:服務(wù)指定的端口。
eureka.client.serviceUrl.defaultZone: 這個(gè)是設(shè)置與Eureka Server交互的地址,客戶端的查詢服務(wù)和注冊(cè)服務(wù)都需要依賴這個(gè)地址。
spring.cloud.config.server.git.uri: 配置的Git長(zhǎng)褲的地址。
spring.cloud.config.server.git.search-paths: git倉庫地址下的相對(duì)地址 多個(gè)用逗號(hào)”,”分割。
spring.cloud.config.server.git.username:git倉庫的賬號(hào)。
spring.cloud.config.server.git.password:git倉庫的密碼。
management.endpoints.web.exposure.include:SpringBoot2.x之后必須添加次配置,和上述的客戶端springcloud-config-bus-client增加的的配置一樣,名稱不一樣是為了做區(qū)分。
spring.cloud.bus.enabled:是否啟用springcloud config bus。
spring.cloud.bus.trace.enabled:開啟跟蹤總線事件。
spring.rabbitmq.host: rabbitmq的地址。
spring.rabbitmq.port: rabbitmq的端口。
spring.rabbitmq.username: rabbitmq的用戶名。
spring.rabbitmq.password: rabbitmq的密碼。
注:如果是kafka的話,添加kafka的配置信息spring.kafka.bootstrap-servers,填寫kafka的地址和端口即可。

服務(wù)端代碼和之前一樣即可,在程序主類中,額外添加@EnableConfigServer注解,該注解表示啟用config配置中心功能。代碼如下:

12
3
4
5
6
7
8
9
10
11
@EnableDiscoveryClient
br/>2
3
4
5
6
7
8
9
10
11
@EnableDiscoveryClient
br/>@SpringBootApplication
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
System.out.println("配置中心服務(wù)端啟動(dòng)成功!");
}
}
完成上述代碼之后,我們的配置中心服務(wù)端已經(jīng)構(gòu)建完成了。

注冊(cè)中心和之前保持一致就可以了。

客戶端
客戶端這邊的變動(dòng)基本不大,增加一個(gè)rabbitmq的jar包和相應(yīng)的配置文件即可。
在springcloud-config-bus-clinet的pom文件添加如下配置:

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
</dependencies>
bootstrap.properties文件的配置信息和之前的基本一樣,完整的配置如下:

配置信息:

spring.cloud.config.name=configtest
spring.cloud.config.profile=pro
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=springcloud-config-bus-server
eureka.client.serviceUrl.defaultZone=http://localhost:8006/eureka/
配置說明:

spring.cloud.config.name: 獲取配置文件的名稱。
spring.cloud.config.profile: 獲取配置的策略。
spring.cloud.config.label:獲取配置文件的分支,默認(rèn)是master。如果是是本地獲取的話,則無用。
spring.cloud.config.discovery.enabled: 開啟配置信息發(fā)現(xiàn)。
spring.cloud.config.discovery.serviceId: 指定配置中心的service-id,便于擴(kuò)展為高可用配置集群。
eureka.client.serviceUrl.defaultZone: 這個(gè)是設(shè)置與Eureka Server交互的地址,客戶端的查詢服務(wù)和注冊(cè)服務(wù)都需要依賴這個(gè)地址。
注:上面這些與spring-cloud相關(guān)的屬性必須配置在bootstrap.properties中,config部分內(nèi)容才能被正確加載。因?yàn)閎ootstrap.properties的相關(guān)配置會(huì)先于application.properties,而bootstrap.properties的加載也是先于application.properties。需要注意的是eureka.client.serviceUrl.defaultZone要配置在bootstrap.properties,不然客戶端是無法獲取配置中心參數(shù)的,會(huì)啟動(dòng)失??!

application.properties配置文件新增的配置基本和服務(wù)端的一樣,完整的配置如下:

spring.application.name=springcloud-config-bus-client
server.port=9006
management.endpoints.web.exposure.include=refresh
spring.cloud.config.failFast=true
spring.cloud.bus.trace.enabled = true

spring.rabbitmq.host:127.0.0.1
spring.rabbitmq.port:5672
spring.rabbitmq.username:guest
spring.rabbitmq.password:guest
配置說明:

spring.application.name: 這個(gè)是指定服務(wù)名稱。
server.port:服務(wù)指定的端口。
management.endpoints.web.exposure.include:暴露刷新的地址。
spring.cloud.bus.enabled:是否啟用springcloud config bus。
spring.cloud.bus.trace.enabled:開啟跟蹤總線事件。
spring.rabbitmq.host: rabbitmq的地址。
spring.rabbitmq.port: rabbitmq的端口。
spring.rabbitmq.username: rabbitmq的用戶名。
spring.rabbitmq.password: rabbitmq的密碼。
程序主類代碼,和之前的基本一致。代碼如下:

主程序代碼示例:

12
3
4
5
6
7
8
9
10
@EnableDiscoveryClient
br/>2
3
4
5
6
7
8
9
10
@EnableDiscoveryClient
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
System.out.println("配置中心客戶端啟動(dòng)成功!");
}
}
控制層代碼:

12
3
4
5
6
7
8
9
10
11
12
13
@RestController
br/>2
3
4
5
6
7
8
9
10
11
12
13
@RestController
public class ClientController {

@Value("${word}")
private String word;

@RequestMapping("/hello")
public String index(@RequestParam String name) {
    return name+","+this.word;
}

}
完成上述的項(xiàng)目開發(fā)之后,我們把上面的項(xiàng)目復(fù)制一下,項(xiàng)目名稱為springcloud-config-bus-client2,然后把它的端口改為9007即可。

到此,客戶端的項(xiàng)目也就構(gòu)建完成了。

功能測(cè)試
完成如上的工程開發(fā)之后,我們來進(jìn)行測(cè)試。

我們首先啟動(dòng)RabbitMQ服務(wù),然后再依次啟動(dòng)springcloud-config-bus-eureka、springcloud-config-bus-server、springcloud-config-bus-client和springcloud-config-bus-client2這四個(gè)項(xiàng)目。其中9005是服務(wù)端springcloud-config-bus-server的端口,9006是第一個(gè)客戶端springcloud-config-bus-client的端口,9007是是第二個(gè)客戶端springcloud-config-bus-client2的端口。

全局刷新測(cè)試
啟動(dòng)成功之后,在瀏覽器輸入:

http://localhost:9006//hello?name=pancm

界面返回:

pancm,hello
在瀏覽器輸入:

http://localhost:9007//hello?name=xuwujing

界面返回:

xuwujing,hello
可以正常得到服務(wù)端configtest-pro.properties的配置信息。

然后在把configtest-pro.properties的配置更改為:

word=hello!!
然后在使用Postman工具進(jìn)行發(fā)起POST請(qǐng)求,只不過這次的地址是服務(wù)端的地址和端口。

使用POST請(qǐng)求如下地址:

http://localhost:9005/actuator/bus-refresh

然后我們?cè)贋g覽器輸入:

http://localhost:9006//hello?name=pancm

界面返回:

pancm,hello!!
瀏覽器輸入:

http://localhost:9007//hello?name=pancm

界面返回:

xuwujing,hello!!
示例圖:

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

局部刷新測(cè)試
完成上述全局刷新測(cè)試之后,有時(shí)我們只想刷新部分微服務(wù)的配置,那么便可以使用/actuator/bus-refresh/{destination}端點(diǎn)的 destination 參數(shù)來定位要刷新的應(yīng)用程序。

我們繼續(xù)更改configtest-pro.properties的配置為:

word=hello!!!
然后依舊使用Postman工具發(fā)送post請(qǐng)求,地址為:

http://localhost:9005/actuator/bus-refresh/springcloud-config-bus-client2

然后我們?cè)贋g覽器輸入:

http://localhost:9006//hello?name=pancm

界面返回:

pancm,hello!!
瀏覽器輸入:

http://localhost:9007//hello?name=pancm

界面返回:

xuwujing,hello!!!
發(fā)現(xiàn)只有springcloud-config-bus-client2客戶端的配置更新,另一個(gè)springcloud-config-bus-client沒有進(jìn)行刷新,達(dá)到了我們的目的。

示例圖:

在這里插入圖片描述
在這里插入圖片描述

上述示例完成之后,我們把SpringCloud Config Refresh的測(cè)試在進(jìn)行一遍,發(fā)現(xiàn)依舊可以實(shí)現(xiàn),因此我們發(fā)現(xiàn)只要開啟Spring Cloud Bus 后,不管是對(duì)服務(wù)端還是客戶端,執(zhí)行/actuator/bus-refresh都是可以更新配置的。

如果我們想進(jìn)行跟蹤總線事件的話,只需要在刷新配置之后,在地址后面添加/trace或/actuator/httptrace即可。

其他
項(xiàng)目地址

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前名稱:SpringCloud學(xué)習(xí)系列之五-----配置中心(Con-創(chuàng)新互聯(lián)
文章來源:http://www.rwnh.cn/article6/dcioig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站設(shè)計(jì)、定制網(wǎng)站、網(wǎng)站導(dǎo)航、標(biāo)簽優(yōu)化、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
仙居县| 澳门| 新干县| 花莲县| 叙永县| 襄垣县| 吉林省| 九龙坡区| 仁怀市| 湘乡市| 榆林市| 开江县| 确山县| 教育| 石棉县| 光泽县| 英吉沙县| 荥阳市| 定安县| 阿城市| 罗田县| 金乡县| 工布江达县| 罗源县| 安福县| 灵宝市| 岑溪市| 柳林县| 怀化市| 河源市| 三河市| 昌宁县| 监利县| 周至县| 六盘水市| 禹城市| 大悟县| 怀安县| 垣曲县| 井陉县| 新晃|