最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud?微服務(wù)框架詳解

 更新時(shí)間:2025年11月03日 09:00:06   作者:百***9226  
本文詳細(xì)介紹了單體架構(gòu)、垂直架構(gòu)、分布式架構(gòu)和微服務(wù)架構(gòu)的特點(diǎn)和優(yōu)缺點(diǎn),重點(diǎn)講解了微服務(wù)架構(gòu)的四個(gè)原則,最后介紹了如何使用Nacos進(jìn)行配置中心管理,并實(shí)現(xiàn)了配置的熱更新,感興趣的朋友跟隨小編一起看看吧

單體架構(gòu):將業(yè)務(wù)全部功能集中到一個(gè)項(xiàng)目中,打成一個(gè)war包存儲(chǔ),部署在一臺(tái)服務(wù)器中,只有一個(gè)數(shù)據(jù)庫(kù)

優(yōu)點(diǎn) :架構(gòu)簡(jiǎn)單,部署成本低。適合小型項(xiàng)目

問題:高并發(fā)性能問題,開發(fā)時(shí)代碼耦合問題,部署升級(jí)時(shí)停服的問題

垂直架構(gòu):拆分模塊,每個(gè)模塊使用自己的數(shù)據(jù)庫(kù),如果有模塊需要其他模塊數(shù)據(jù)時(shí)需要自己查對(duì)方模塊數(shù)據(jù)庫(kù)

問題:大量代碼冗余,系統(tǒng)難以維護(hù),性能問題,部署問題

分布式架構(gòu):根據(jù)業(yè)務(wù)功能對(duì)系統(tǒng)做拆分,每個(gè)業(yè)務(wù)功能作為獨(dú)立項(xiàng)目開發(fā),稱為一個(gè)服務(wù)

服務(wù)之間相互調(diào)用,分布式多節(jié)點(diǎn)部署

優(yōu)點(diǎn):降低耦合,有利于服務(wù)升級(jí)和拓展 適合大型互聯(lián)網(wǎng)項(xiàng)目

缺點(diǎn):服務(wù)調(diào)用關(guān)系錯(cuò)綜復(fù)雜

在進(jìn)行服務(wù)拆分的時(shí)候要考慮很多問題:服務(wù)拆分的粒度如何界定,服務(wù)之后如何調(diào)用,服務(wù)的調(diào)用關(guān)系如何管理,需要指定一套有效的標(biāo)準(zhǔn)來(lái)約束分布架構(gòu)

微服務(wù)

架構(gòu)特點(diǎn):1.單一職責(zé),每一個(gè)服務(wù)對(duì)應(yīng)唯一的業(yè)務(wù)能力,做到單一職責(zé)

2.自治,團(tuán)隊(duì)獨(dú)立,技術(shù)獨(dú)立,數(shù)據(jù)獨(dú)立,獨(dú)立部署和交付

3.面向服務(wù),服務(wù)提供統(tǒng)一的接口,與語(yǔ)言技術(shù)無(wú)關(guān)

4.隔離性強(qiáng),服務(wù)調(diào)用做好隔離,容錯(cuò),降級(jí)避免出現(xiàn)級(jí)聯(lián)問題(級(jí)聯(lián)故障是由于正反饋循環(huán)并且隨著時(shí)間的增加所產(chǎn)生的故障。典型表現(xiàn):最初由單個(gè)節(jié)點(diǎn)或子系統(tǒng)故障觸發(fā)的連鎖反應(yīng))

微服務(wù)的上述特點(diǎn)給分布式架構(gòu)制定啦一個(gè)標(biāo)準(zhǔn),進(jìn)一步降低服務(wù)之間的耦合,提供服務(wù)的獨(dú)立性和靈活性。微服務(wù)是一種經(jīng)過(guò)良好架構(gòu)設(shè)計(jì)的分布式架構(gòu)方案

微服務(wù)技術(shù)的對(duì)比

SpringCloud微服務(wù)框架

官網(wǎng)地址:Spring Cloud

開發(fā)springcloud組件的組織:spring社區(qū),alibaba,netflix

springCloud集成了各種微服務(wù)功能組件,基于SpringBoot實(shí)現(xiàn)組件的自動(dòng)裝配

常見的組件:服務(wù)注冊(cè)發(fā)現(xiàn)(Eureka,nacos,consul),服務(wù)遠(yuǎn)程調(diào)用(OpenFeign,Dubbo),服務(wù)鏈路監(jiān)控(Zipkin,Sleuth),統(tǒng)一配置管理(SpringCloudConfig,nacos),統(tǒng)一網(wǎng)關(guān)路由(SpringCloudGateway,zuul),流控降級(jí)保護(hù)(Hystix,Sentinel)

SpringCloud底層是依賴于SpringBoot的,并且有版本兼容關(guān)系

服務(wù)拆分原則:1.不同微服務(wù)不用重復(fù)開發(fā)相同業(yè)務(wù)

2.微服務(wù)數(shù)據(jù)獨(dú)立,有自己的數(shù)據(jù)庫(kù)

3.微服務(wù)可以將自己的業(yè)務(wù)暴露為接口,供其他微服務(wù)使用

遠(yuǎn)程調(diào)用

微服務(wù)的調(diào)用方式:基于RestTemplate發(fā)起的http請(qǐng)求實(shí)現(xiàn)遠(yuǎn)程調(diào)用,http請(qǐng)求做遠(yuǎn)程調(diào)用只要知道ip,端口,接口路徑,請(qǐng)求參數(shù)即可。

步驟:1.注冊(cè)RestTemplate的實(shí)例到Spring容器

2.修改消費(fèi)者order-service服務(wù)中的OrderService類中的queryOrderById方法,根據(jù)Order對(duì)象中的userId查詢User

3.將查詢到的User填到Order對(duì)象

#在order-service服務(wù)中的OrderApplication啟動(dòng)類中,注冊(cè)RestTemplate實(shí)例
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
#修改order-service服務(wù)中的OrderService類中的queryOrderById方法
@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RestTemplate restTemplate;
    public Order queryOrderById(Long orderId) {
        // 1.查詢訂單
        Order order = orderMapper.findById(orderId);
        //2查詢用戶
        String url="http://userservice/user/"+order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        // 3封裝user信息
        order.setUser(user);
        // 4.返回
        return order;
    }
}

在服務(wù)調(diào)用關(guān)系中,會(huì)有兩個(gè)不同的角色,這兩個(gè)角色是相對(duì)的

服務(wù)提供者Provider:一次業(yè)務(wù)中,被其他微服務(wù)調(diào)用的服務(wù),提供接口給其他服務(wù)

服務(wù)消費(fèi)者consumer:一次業(yè)務(wù)中,調(diào)用其他微服務(wù)的服務(wù),調(diào)用其他微服務(wù)提供的接口

注冊(cè)中心

解決問題:服務(wù)注冊(cè)與發(fā)現(xiàn)(服務(wù)治理問題)

Eureka注冊(cè)中心

EurekaServer:服務(wù)端,注冊(cè)中心

EurekaClient:客戶端

服務(wù)注冊(cè):提供者啟動(dòng)之后將自己的信息注冊(cè)到eureka-server(Eureka服務(wù)端)

eureka-server保存服務(wù)名稱到服務(wù)實(shí)例地址列表的映射關(guān)系

服務(wù)拉?。合M(fèi)者根據(jù)服務(wù)名稱拉取實(shí)例地址列表(注冊(cè)表)并緩存到本地

消費(fèi)者根據(jù)負(fù)載均衡算法選中一個(gè)實(shí)例地址,發(fā)起遠(yuǎn)程調(diào)用

健康檢查:提供者每隔一段時(shí)間(默認(rèn)30秒)向eureka-server發(fā)起請(qǐng)求,報(bào)告自己狀態(tài)。稱為心跳

當(dāng)超過(guò)一段時(shí)間(90秒)沒有發(fā)送心跳,eureka-server認(rèn)為微服務(wù)實(shí)例故障,將該實(shí)例從列表中剔除,拉取服務(wù)時(shí),該故障實(shí)例排除

搭建eureka-server

1.引入依賴

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

2.編寫啟動(dòng)類

@SpringBootApplication
@EnableEurekaServer    //開啟eureka的注冊(cè)中心功能
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

3.編寫配置文件application.yml

server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka

啟動(dòng)成功

服務(wù)注冊(cè)

引入依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

配置文件

spring:
  application:
    name: orderservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

可以將user-service多次啟動(dòng),模擬多實(shí)例部署,注意修改端口設(shè)置-Dserver.port=自定義的端口號(hào)

如果沒有service選項(xiàng)【IDEA】idea打開新項(xiàng)目,左下角的工作欄中沒有顯示Services解決辦法

在order-service完成服務(wù)拉取,修改OrderService的代碼,修改訪問路徑

在order-service項(xiàng)目的啟動(dòng)類OrderApplication中RestTemplate添加負(fù)載均衡諸界

    @Bean
    @LoadBalanced    //負(fù)載均衡注解
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }

負(fù)載均衡

SpringCloud底層利用Ribbon的組件,實(shí)現(xiàn)負(fù)載均衡。服務(wù)調(diào)用者動(dòng)態(tài)調(diào)用服務(wù)提供者的多個(gè)節(jié)點(diǎn)

Ribbon內(nèi)部就是集成了LoadBalancerClient負(fù)載均衡,通過(guò)@LoadBalance注解開啟負(fù)載均衡器。

基本流程:RibbonLoadBalanceClient從請(qǐng)求url中獲取服務(wù)名稱,DynamicServerListLoadBalancer根據(jù)服務(wù)名稱到eureka拉取服務(wù)列表eureka返回服務(wù)列表,IRule利用內(nèi)置的負(fù)載均衡規(guī)則從列表中選擇一個(gè)服務(wù),返回給RibbonLoadBalanceClient

Ribbon的負(fù)載均衡規(guī)則時(shí)一個(gè)叫IRule的接口來(lái)定義的,每一個(gè)接口就是一種規(guī)則

內(nèi)置的負(fù)載均衡規(guī)則:

RoundRobinRule 簡(jiǎn)單的輪詢服務(wù)列表來(lái)選擇服務(wù)器,Ribbon默認(rèn)的負(fù)載均衡規(guī)則

ZoneAvoidanceRule 以區(qū)域可用的服務(wù)器為基礎(chǔ)進(jìn)行服務(wù)器的選擇

默認(rèn)的實(shí)現(xiàn)就是ZoneAvoidanceRule,是一種輪詢方案(一般使用默認(rèn)的負(fù)載均衡規(guī)則,不修改)

Ribbon采用默認(rèn)的懶加載,第一次訪問才會(huì)去創(chuàng)建LoadBalanceClient,請(qǐng)求時(shí)間會(huì)很長(zhǎng)。

Nacos注冊(cè)中心

Nacos是阿里巴巴的產(chǎn)品,現(xiàn)在是SpringCloudAlibaba中的一個(gè)組件(SpringCloudAlibaba實(shí)現(xiàn)啦對(duì)SpringCloud組件進(jìn)行擴(kuò)展)

與Eureka的差異:依賴不同,服務(wù)地址不同

Nacos服務(wù)搭建,下載安裝包,解壓,在bin目錄下運(yùn)行startup.cmd -mstandalone

引入依賴,在父工程里面,引入

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

在服務(wù)消費(fèi)者和提供者的pom文件引入nacos的依賴,注釋掉eureka的依賴

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置nacos地址,在user-service和order-service的application.yml中添加nacos地址,不要忘了注釋掉eureka的地址

spring:
  cloud:
    nacos:
      server-addr: localhost:8848

在啟動(dòng)類添加注解@EnableDicoveryClient

Nacos服務(wù)分級(jí)存儲(chǔ)模型

一個(gè)服務(wù)有多個(gè)實(shí)例,實(shí)例分布在不同的機(jī)房中,Nacos將同一機(jī)房的實(shí)例劃分為一個(gè)集群

服務(wù)-集群-實(shí)例

服務(wù)調(diào)用盡可能選擇本地集群的服務(wù),跨集群調(diào)用延遲較高。(本地集群不可訪問時(shí),在訪問其他集群)

給user-service配置集群,修改user-service的application.yml文件

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名稱

復(fù)制一個(gè)user-service啟動(dòng)配置,添加屬性

-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH

默認(rèn)的zoneAvoidanceRule不能實(shí)現(xiàn)同集群有效實(shí)現(xiàn)負(fù)載均衡,Nacos中提供了一個(gè)NacosRule的實(shí)現(xiàn),可以優(yōu)先從同集群中挑選實(shí)例。

修改負(fù)載均衡規(guī)則修改order-service的application.yml文件,修改負(fù)載均衡規(guī)則:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負(fù)載均衡規(guī)則 

根據(jù)權(quán)重負(fù)載均衡:在實(shí)際部署中提高權(quán)重配置來(lái)控制訪問頻率,權(quán)重高訪問頻率高

在Nacos控制臺(tái)設(shè)置實(shí)例的權(quán)重值0~1之間

環(huán)境隔離namespace

Nacos中服務(wù)存儲(chǔ)和數(shù)據(jù)存儲(chǔ)的最外層都是一個(gè)namespace的東西,用做最外層隔離,修改order-service的application.yml文件:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空間,填I(lǐng)D

Nacos的服務(wù)實(shí)例分為兩種類型:

臨時(shí)實(shí)例:如果實(shí)例宕機(jī)超過(guò)一段時(shí)間,會(huì)從服務(wù)列表中剔除,默認(rèn)的類型

非臨時(shí)實(shí)例:如果實(shí)例宕機(jī),不會(huì)從服務(wù)列表中剔除,也叫永久實(shí)例

Nacos和Eureka的區(qū)別:

相同點(diǎn):都支持服務(wù)注冊(cè)和服務(wù)拉取,都支持服務(wù)提供者心跳方式做健康檢測(cè)

區(qū)別:1.Nacos支持服務(wù)端主動(dòng)檢測(cè)提供者狀態(tài):臨時(shí)實(shí)例采用心跳檢測(cè),非臨時(shí)實(shí)例nacos主動(dòng)詢問

2.臨時(shí)實(shí)例心跳不正常被剔除,非臨時(shí)實(shí)例則不會(huì)剔除

3.Nacos支持服務(wù)禮包變更的消息推送模式,服務(wù)列表更新更及時(shí)

4.Nacos集群默認(rèn)采用AP方式,集群中存在非實(shí)例時(shí)采用CP模式;Eureka采用AP模式

CAP定理:布魯爾定理

指出對(duì)于一個(gè)分布式計(jì)算機(jī)來(lái)說(shuō),不可能同時(shí)滿足三點(diǎn),最多同時(shí)滿足兩點(diǎn):

一致性(Consistency)系統(tǒng)中所有數(shù)據(jù)備份,在同一時(shí)刻同樣的值

可用性(Availability)保證每次請(qǐng)求不管成功失敗都有響應(yīng)

分區(qū)容錯(cuò)性(Partition tolerance)系統(tǒng)中任意信息的丟失或失敗不會(huì)影響系統(tǒng)的繼續(xù)運(yùn)作

配置中心

配置統(tǒng)一管理和配置隔離問題

nacos=SpringCloud eureka注冊(cè)中心+SpringCloud config配置中心

項(xiàng)目的核心配置,需要熱更新的配置才有放到nacos管理的必要?;静粫?huì)變更的一些配置還是保存在微服務(wù)本地比較好。(熱加載:不重啟一個(gè)項(xiàng)目,使得部分代碼更新,通過(guò)java類加載器實(shí)現(xiàn))

保證項(xiàng)目中有bootstrap.yml

微服務(wù)要拉取nacos中管理的配置,并且與本地的application.yml配置合并,才能完成項(xiàng)目啟動(dòng)

在bootstrap.yml中提那就配置中心相關(guān)內(nèi)容:環(huán)境相關(guān)spring.profiles.active

配置中心地址,配置文件后綴

配置加載順序:先加載共享配置文件,再加載環(huán)境相關(guān)配置文件,在加載application.yml

在idea中的使用

導(dǎo)入依賴

<!--nacos配置管理依賴-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

添加bootstrap.yaml

spring:
  application:
    name: userservice # 服務(wù)名稱
  profiles:
    active: dev #開發(fā)環(huán)境,這里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后綴名

配置熱更新

最終目的,是修改nacos中的配置后,微服務(wù)無(wú)需重啟就可以讓配置生效(配置熱更新)

使用兩種方式:

一:@Value注入的變量所在類上添加注解@RefreshScope:

二: 在controller中使用@ConfigurationProperties注解代替@Value注解。

到此這篇關(guān)于SpringCloud 微服務(wù)框架詳解的文章就介紹到這了,更多相關(guān)SpringCloud 微服務(wù)框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java如何通過(guò)FileOutputStream字節(jié)流向文件中寫數(shù)據(jù)

    java如何通過(guò)FileOutputStream字節(jié)流向文件中寫數(shù)據(jù)

    這篇文章主要介紹了java如何通過(guò)FileOutputStream字節(jié)流向文件中寫數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 微服務(wù)Spring?Cloud?Alibaba?的介紹及主要功能詳解

    微服務(wù)Spring?Cloud?Alibaba?的介紹及主要功能詳解

    Spring?Cloud?是一個(gè)通用的微服務(wù)框架,適合于多種環(huán)境下的開發(fā),而?Spring?Cloud?Alibaba?則是為阿里巴巴技術(shù)棧量身定制的解決方案,本文給大家介紹Spring?Cloud?Alibaba?的介紹及主要功能,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • BeanDefinitionRegistryPostProcessor如何動(dòng)態(tài)注冊(cè)Bean到Spring

    BeanDefinitionRegistryPostProcessor如何動(dòng)態(tài)注冊(cè)Bean到Spring

    這篇文章主要介紹了BeanDefinitionRegistryPostProcessor如何動(dòng)態(tài)注冊(cè)Bean到Spring,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java jpa查詢沒有id表的方法

    java jpa查詢沒有id表的方法

    本文主要介紹了java jpa查詢沒有id表的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Java常用的數(shù)據(jù)脫敏方法(手機(jī)、郵箱、身份證號(hào))

    Java常用的數(shù)據(jù)脫敏方法(手機(jī)、郵箱、身份證號(hào))

    這篇文章主要給大家介紹了關(guān)于Java常用的數(shù)據(jù)脫敏(手機(jī)、郵箱、身份證號(hào))的相關(guān)資料,信息脫敏對(duì)某些敏感信息通過(guò)脫敏規(guī)則進(jìn)行數(shù)據(jù)的變形,實(shí)現(xiàn)敏感隱私數(shù)據(jù)的可靠保護(hù),需要的朋友可以參考下
    2023-07-07
  • spring循環(huán)注入異常問題的解決方案

    spring循環(huán)注入異常問題的解決方案

    今天小編就為大家分享一篇關(guān)于spring循環(huán)注入異常問題的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Java核心編程之文件隨機(jī)讀寫類RandomAccessFile詳解

    Java核心編程之文件隨機(jī)讀寫類RandomAccessFile詳解

    這篇文章主要為大家詳細(xì)介紹了Java核心編程之文件隨機(jī)讀寫類RandomAccessFile,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 構(gòu)建SpringBoot+MyBatis+Freemarker的項(xiàng)目詳解

    構(gòu)建SpringBoot+MyBatis+Freemarker的項(xiàng)目詳解

    在本篇內(nèi)容里小編給大家整理的是關(guān)于構(gòu)建SpringBoot+MyBatis+Freemarker的項(xiàng)目的具體步驟以及實(shí)例代碼,需要的朋友們參考下。
    2019-06-06
  • 如何使用Java模擬退火算法優(yōu)化Hash函數(shù)

    如何使用Java模擬退火算法優(yōu)化Hash函數(shù)

    為了解決局部最優(yōu)解問題,1983年,Kirkpatrick等提出了模擬退火算法(SA)能有效的解決局部最優(yōu)解問題。模擬退火算法包含兩個(gè)部分即Metropolis算法和退火過(guò)程。Metropolis算法就是如何在局部最優(yōu)解的情況下讓其跳出來(lái),是退火的基礎(chǔ)
    2021-06-06
  • java中l(wèi)ong數(shù)據(jù)類型轉(zhuǎn)換為int類型

    java中l(wèi)ong數(shù)據(jù)類型轉(zhuǎn)換為int類型

    這篇文章主要講解Java中基本數(shù)據(jù)類型,java long 類型與其java int類型的轉(zhuǎn)換的幾種方法,希望能給大家做一個(gè)參考
    2016-07-07

最新評(píng)論

加查县| 海阳市| 织金县| 赞皇县| 民丰县| 库尔勒市| 阳东县| 西藏| 岐山县| 元江| 博湖县| 唐海县| 贵州省| 金寨县| 平山县| 达孜县| 郓城县| 招远市| 高雄市| 安陆市| 淅川县| 万载县| 疏勒县| 永安市| 安龙县| 高邑县| 天门市| 扶风县| 繁峙县| 泸州市| 搜索| 宜川县| 罗平县| 南乐县| 旌德县| 崇州市| 巴里| 湘潭县| 丁青县| 斗六市| 乡宁县|