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

spring?cloud之eureka高可用集群和服務(wù)分區(qū)解析

 更新時(shí)間:2022年03月04日 08:50:20   作者:兇狠的士兵76  
這篇文章主要介紹了spring?cloud之eureka高可用集群和服務(wù)分區(qū)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

準(zhǔn)備

1.首先,在C:\WINDOWS\System32\drivers\etc\hosts文件里面添加一下映射,如果不添加也沒(méi)關(guān)系,只是如果是單機(jī)環(huán)境,在eureka首頁(yè)中的replicas那一項(xiàng)看到的其它注冊(cè)中心都是localhost,我這里為了方便理解就添加了映射。

2.為了方便理解,我這里是單個(gè)application用一個(gè)module,沒(méi)有采用通過(guò)多個(gè)profile開啟多個(gè)application的做法,而且這樣做一會(huì)兒驗(yàn)證起來(lái)也比較清晰。

3.必要的一些概念

先看官方的這張圖:

springcloud中eureka的默認(rèn)region是us-east-1,一個(gè)region下可以有多個(gè)zone。

比如zone1內(nèi)有服務(wù)A,zone2內(nèi)也有服務(wù)A,消費(fèi)者A(這里指調(diào)用服務(wù)A的client)如果屬于zone1,他就會(huì)優(yōu)先調(diào)用zone1,如果zone1內(nèi)的服務(wù)都不可用了,就會(huì)調(diào)用zone2中的服務(wù)A,這種調(diào)用方式就是服務(wù)分區(qū)。

分區(qū)其實(shí)就是建立在集群之上,zone1和zone2構(gòu)成了集群,但是消費(fèi)者A調(diào)用zone1的時(shí)候可能開銷會(huì)小一些,所以可以讓他優(yōu)先調(diào)用zone1內(nèi)的服務(wù)A。

搭建

2個(gè)注冊(cè)中心

  • region1-zone1(region1區(qū)域內(nèi)的zone1),region1-zone2(region1區(qū)域內(nèi)的zone2)

region1-zone1:

application.properties:

#端口
server.port=8761
#主機(jī)名
eureka.instance.hostname=region1-zone1
#應(yīng)用名稱
spring.application.name=eureka-server
 
#是否注冊(cè)自身到eureka服務(wù)器
eureka.client.register-with-eureka=true
#是否獲取eureka服務(wù)器注冊(cè)表上的注冊(cè)信息
eureka.client.fetch-registry=true
 
#false表示在此eureka服務(wù)器中關(guān)閉自我保護(hù)模式,所謂自我保護(hù)模式,默認(rèn)true
eureka.server.enableSelfPreservation=false
 
#配置這個(gè)eureka server注冊(cè)中心所屬的region,默認(rèn)值us-east-1
eureka.client.region=region1
 
#region1內(nèi)的所有zone,提取第一個(gè)作為自己的zone
eureka.client.availability-zones.region1=region1-zone1,region1-zone2
 
#region1內(nèi)的所有其它zone的注冊(cè)中心
eureka.client.service-url.region1-zone2=http://region1-zone2:8764/eureka/

啟動(dòng)類:

@SpringBootApplication
@EnableEurekaServer
public class Application {
 
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

region1-zone2:

server.port=8764 
eureka.instance.hostname=region1-zone2
spring.application.name=eureka-server
 
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.server.enableSelfPreservation=false
 
eureka.client.region=region1
eureka.client.availability-zones.region1=region1-zone2,region1-zone1
eureka.client.service-url.region1-zone1=http://region1-zone1:8761/eureka/

啟動(dòng)類:同region1-zone1

3個(gè)service-hi服務(wù)

我這里用前綴用來(lái)區(qū)分他們分別屬于哪個(gè)zone。

region1-zone1-service-hi-1:

server.port=8762 
spring.application.name=test-zone
eureka.client.region=region1
 
eureka.client.availability-zones.region1=region1-zone1,region1-zone2
eureka.client.service-url.region1-zone1=http://region1-zone1:8761/eureka/
eureka.client.service-url.region1-zone2=http://region1-zone2:8764/eureka/
eureka.client.prefer-same-zone-eureka=true
eureka.instance.prefer-ip-address=true
 
#屬于哪一個(gè)zone
eureka.instance.metadata-map.zone=region1-zone1
 
#自定義信息,驗(yàn)證的時(shí)候用
info=region1-zone1-service-hi-1

啟動(dòng)類:

@EnableEurekaClient
@SpringBootApplication
public class Application { 
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

controller:

@RestController
public class HelloController { 
    @Value("${info}") 
    private String info; 
    @RequestMapping(value="/hi")
    public String hi() {
        return info;
    }
}

region1-zone1-service-hi-2:

server.port=8763 
spring.application.name=test-zone
eureka.client.region=region1
eureka.client.availability-zones.region1=region1-zone1,region1-zone2
eureka.client.service-url.region1-zone1=http://region1-zone1:8761/eureka/
eureka.client.service-url.region1-zone2=http://region1-zone2:8764/eureka/
eureka.client.prefer-same-zone-eureka=true
eureka.instance.prefer-ip-address=true 
eureka.instance.metadata-map.zone=region1-zone1 
info=region1-zone1-service-hi-2

啟動(dòng)類、controller都和region1-zone1-service-hi-1相同

region1-zone2-service-hi-1:

server.port=8765
 
spring.application.name=test-zone
eureka.client.region=region1
eureka.client.availability-zones.region1=region1-zone2,region1-zone1
eureka.client.service-url.region1-zone1=http://region1-zone1:8761/eureka/
eureka.client.service-url.region1-zone2=http://region1-zone2:8764/eureka/
eureka.client.prefer-same-zone-eureka=true
eureka.instance.prefer-ip-address=true        
eureka.instance.metadata-map.zone=region1-zone2 
info=region1-zone2-service-hi-1

啟動(dòng)類、controller都和region1-zone1-service-hi-1相同

1個(gè)consumer

application.properties:

server.port=8888 
spring.application.name=region1-consumer
eureka.client.region=region1
eureka.client.availability-zones.region1=region1-zone1,region1-zone2
eureka.client.service-url.region1-zone1=http://region1-zone1:8761/eureka/
eureka.client.service-url.region1-zone2=http://region1-zone2:8764/eureka/
eureka.client.prefer-same-zone-eureka=true
eureka.instance.prefer-ip-address=true
eureka.instance.metadata-map.zone=region1-zone1
 
logging.level.root=debug
 

controller:

@RestController
public class HiController { 
    @Autowired
    private RestTemplate restTemplate; 
    @RequestMapping(value="/hello")
    public String hi() {
        return restTemplate.getForObject("http://test-zone/hi", String.class);
    }
}

驗(yàn)證

先啟動(dòng)兩個(gè)注冊(cè)中心:eureka-server-region1-zone1、eureka-server-region1-zone2。

然后將4個(gè)服務(wù)啟動(dòng)。

再啟動(dòng)消費(fèi)者服務(wù)。

訪問(wèn)zone1的注冊(cè)中心:

訪問(wèn)zone2的注冊(cè)中心:

可以看到每個(gè)注冊(cè)中心都有4個(gè)服務(wù),這說(shuō)明,3個(gè)service-hi和一個(gè)consumer注冊(cè)到了集群中所有注冊(cè)中心上。

打開瀏覽器訪問(wèn):http://ip:8888/hello,ip自行改成consumer服務(wù)的ip即可,連續(xù)訪問(wèn)這個(gè)url若干次,可以看到consumer調(diào)用的service的始終是zone1中的service-hi-1和service-hi-2,并且由于ribbon的默認(rèn)負(fù)載均衡規(guī)則,service-hi-1和service-hi-2被輪詢調(diào)用。

然后我們關(guān)閉zone1中的service-hi-1,再訪問(wèn)若干次,可以發(fā)現(xiàn)此時(shí)始終只有service-hi-2提供服務(wù)了。

然后我們?cè)訇P(guān)閉zone1中的service-hi-2,再訪問(wèn)若干次url,此時(shí)zone1中的注冊(cè)中心已經(jīng)沒(méi)有服務(wù)提供者可以給consumer消費(fèi)了,zone2中的service-hi-1開始給consumer提供服務(wù)。

解釋

1.有的人可能會(huì)發(fā)現(xiàn)在關(guān)閉服務(wù)后立即調(diào)用會(huì)報(bào)錯(cuò),這一點(diǎn)下面做下解釋:

打開debug

logging.level.root=debug

這里我截取了一部分心跳日志:

2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8765, 192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: [192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8762]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone1=[192.168.5.1:8762, 192.168.5.1:8763]}
[192.168.5.1:8765, 192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: [192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8762]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone1=[192.168.5.1:8762, 192.168.5.1:8763]}

2.此時(shí)region1-zone1-service-hi-1已經(jīng)下線,但是region1-zone1-service-hi-2和region1-zone2-service-hi-1還存在于ribbon的服務(wù)列表中。由于服務(wù)分區(qū)的原因,ribbon只會(huì)使用region1-zone1-service-hi-2服務(wù)。

2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8765, 192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: [192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : zoneAffinity is overriden. blackOutServerPercentage: 0.0, activeReqeustsPerServer: 0.0, availableServers: 1
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8763]
2018-06-24 14:07:03.688 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone1=[192.168.5.1:8763]}
[192.168.5.1:8765, 192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: [192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : zoneAffinity is overriden. blackOutServerPercentage: 0.0, activeReqeustsPerServer: 0.0, availableServers: 1
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8763]
2018-06-24 14:07:03.688 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone1=[192.168.5.1:8763]}

3.此時(shí)zone1中的服務(wù):region1-zone1-service-hi-1和region1-zone1-service-hi-2都已經(jīng)下線,ribbon只能使用region1-zone2-service-hi-1服務(wù)

2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: []
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : zoneAffinity is overriden. blackOutServerPercentage: NaN, activeReqeustsPerServer: 0.0, availableServers: 0
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone2=[192.168.5.1:8765]}
[192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: []
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : zoneAffinity is overriden. blackOutServerPercentage: NaN, activeReqeustsPerServer: 0.0, availableServers: 0
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone2=[192.168.5.1:8765]}

因?yàn)榇嬖谛奶鴻C(jī)制,默認(rèn)情況下,服務(wù)的超時(shí)時(shí)間是90s,服務(wù)和注冊(cè)中心的心跳間隔是30s

我們可以看下spring cloud的文檔:

eureka.instance.lease-expiration-duration-in-seconds

90

Indicates the time in seconds that the eureka server waits since it received thelast heartbeat before it can remove this instance from its view and there bydisallowing traffic to this instance.

Setting this value too long could mean that the traffic could be routed to theinstance even though the instance is not alive. Setting this value too small couldmean, the instance may be taken out of traffic because of temporary networkglitches.This value to be set to atleast higher than the value specified inleaseRenewalIntervalInSeconds.

大概意思是:

eureka將等待一定的時(shí)間(默認(rèn)90秒)保持實(shí)例的存活,過(guò)了這個(gè)時(shí)間如果沒(méi)有收到最新的心跳,那么eureka將會(huì)把這個(gè)實(shí)例從自己的視圖中移除,并且拒絕他的流量。

eureka.instance.lease-renewal-interval-in-seconds

30

Indicates how often (in seconds) the eureka client needs to send heartbeats to eureka server to indicate that it is still alive. If the heartbeats are not received for the period specified in leaseExpirationDurationInSeconds, eurekaserver will remove the instance from its view, there by disallowing traffic to thisinstance.

Note that the instance could still not take traffic if it implementsHealthCheckCallback and then decides to make itself unavailable.

這個(gè)是在講心跳的時(shí)間間隔:指示eureka client隔多少時(shí)間發(fā)送心跳給server,過(guò)了這個(gè)時(shí)間如果沒(méi)收到心跳,eureka server就會(huì)移除超時(shí)的eureka client。

所以說(shuō),當(dāng)一個(gè)服務(wù)下線,eureka server要90s后才能知道這個(gè)服務(wù)已經(jīng)不存在了。

為什么我這里調(diào)試的時(shí)候要禁用保護(hù)模式?

當(dāng)保護(hù)模式被觸發(fā)的時(shí)候,實(shí)例就永遠(yuǎn)不會(huì)過(guò)期,如果zone1中的服務(wù)都下線了,由于這個(gè)保護(hù)模式,eureka并不會(huì)讓這些實(shí)例過(guò)期,因此,zone2中的服務(wù)就永遠(yuǎn)調(diào)用不到了。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一起來(lái)看看springboot集成redis的使用注解

    一起來(lái)看看springboot集成redis的使用注解

    這篇文章主要為大家詳細(xì)介紹了springboot集成redis的使用注解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Java多線程及線程安全實(shí)現(xiàn)方法解析

    Java多線程及線程安全實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Java多線程及線程安全實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Spring Boot應(yīng)用關(guān)閉分析詳解

    Spring Boot應(yīng)用關(guān)閉分析詳解

    本文挖掘了Spring Boot的關(guān)閉方式,并列舉了關(guān)閉方式,從原理、源碼的角度闡述了Spring Boot的關(guān)閉代碼及擴(kuò)展點(diǎn),感興趣的朋友一起看看吧
    2024-12-12
  • JAVA Integer類型自加實(shí)例詳解

    JAVA Integer類型自加實(shí)例詳解

    這篇文章主要介紹了JAVA Integer類型自加實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • java不可逆加密算法之md5加密算法使用示例

    java不可逆加密算法之md5加密算法使用示例

    MD5的全稱是Message-Digest Algorithm 5,他是一個(gè)不可逆的字符串加密算法,下面使用示例說(shuō)明他的用法
    2014-01-01
  • Java?Arrays.copyOf?功能示例代碼

    Java?Arrays.copyOf?功能示例代碼

    Arrays.copyOf功能是實(shí)現(xiàn)數(shù)組的復(fù)制,返回復(fù)制后的數(shù)組,這篇文章主要介紹了Java?Arrays.copyOf?功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 關(guān)于maven:pom文件的使用解析

    關(guān)于maven:pom文件的使用解析

    這篇文章主要介紹了關(guān)于maven:pom文件的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Idea中如何修改項(xiàng)目的SVN地址

    Idea中如何修改項(xiàng)目的SVN地址

    這篇文章主要介紹了Idea中如何修改項(xiàng)目的SVN地址問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 最新評(píng)論

    宿迁市| 民权县| 增城市| 南昌市| 昌吉市| 泗洪县| 滨州市| 应城市| 河池市| 老河口市| 巨鹿县| 宝山区| 密山市| 大同县| 闻喜县| 安宁市| 孟州市| 隆化县| 华宁县| 陆河县| 静乐县| 富宁县| 松滋市| 历史| 南澳县| 普陀区| 班戈县| 上高县| 高淳县| 长沙市| 泽库县| 上栗县| 海南省| 弋阳县| 清水河县| 宕昌县| 洛阳市| 宾川县| 静安区| 镇平县| 临湘市|