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

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

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

準(zhǔn)備

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

2.為了方便理解,我這里是單個application用一個module,沒有采用通過多個profile開啟多個application的做法,而且這樣做一會兒驗證起來也比較清晰。

3.必要的一些概念

先看官方的這張圖:

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

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

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

搭建

2個注冊中心

  • 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
 
#是否注冊自身到eureka服務(wù)器
eureka.client.register-with-eureka=true
#是否獲取eureka服務(wù)器注冊表上的注冊信息
eureka.client.fetch-registry=true
 
#false表示在此eureka服務(wù)器中關(guān)閉自我保護(hù)模式,所謂自我保護(hù)模式,默認(rèn)true
eureka.server.enableSelfPreservation=false
 
#配置這個eureka server注冊中心所屬的region,默認(rèn)值us-east-1
eureka.client.region=region1
 
#region1內(nèi)的所有zone,提取第一個作為自己的zone
eureka.client.availability-zones.region1=region1-zone1,region1-zone2
 
#region1內(nèi)的所有其它zone的注冊中心
eureka.client.service-url.region1-zone2=http://region1-zone2:8764/eureka/

啟動類:

@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/

啟動類:同region1-zone1

3個service-hi服務(wù)

我這里用前綴用來區(qū)分他們分別屬于哪個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
 
#屬于哪一個zone
eureka.instance.metadata-map.zone=region1-zone1
 
#自定義信息,驗證的時候用
info=region1-zone1-service-hi-1

啟動類:

@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

啟動類、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

啟動類、controller都和region1-zone1-service-hi-1相同

1個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);
    }
}

驗證

先啟動兩個注冊中心:eureka-server-region1-zone1、eureka-server-region1-zone2。

然后將4個服務(wù)啟動。

再啟動消費者服務(wù)。

訪問zone1的注冊中心:

訪問zone2的注冊中心:

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

打開瀏覽器訪問:http://ip:8888/hello,ip自行改成consumer服務(wù)的ip即可,連續(xù)訪問這個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,再訪問若干次,可以發(fā)現(xiàn)此時始終只有service-hi-2提供服務(wù)了。

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

解釋

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

打開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.此時region1-zone1-service-hi-1已經(jīng)下線,但是region1-zone1-service-hi-2和region1-zone2-service-hi-1還存在于ribbon的服務(wù)列表中。由于服務(wù)分區(qū)的原因,ribbon只會使用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.此時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]}

因為存在心跳機(jī)制,默認(rèn)情況下,服務(wù)的超時時間是90s,服務(wù)和注冊中心的心跳間隔是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將等待一定的時間(默認(rèn)90秒)保持實例的存活,過了這個時間如果沒有收到最新的心跳,那么eureka將會把這個實例從自己的視圖中移除,并且拒絕他的流量。

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.

這個是在講心跳的時間間隔:指示eureka client隔多少時間發(fā)送心跳給server,過了這個時間如果沒收到心跳,eureka server就會移除超時的eureka client。

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

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

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

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

相關(guān)文章

  • 一起來看看springboot集成redis的使用注解

    一起來看看springboot集成redis的使用注解

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

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

    這篇文章主要介紹了Java多線程及線程安全實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    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ò)展點,感興趣的朋友一起看看吧
    2024-12-12
  • JAVA Integer類型自加實例詳解

    JAVA Integer類型自加實例詳解

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

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

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

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

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

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

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

    Idea中如何修改項目的SVN地址

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

    辰溪县| 贵南县| 信丰县| 乐山市| 石景山区| 兖州市| 滁州市| 固阳县| 上思县| 台湾省| 密云县| 湄潭县| 洮南市| 揭东县| 德阳市| 香格里拉县| 阳城县| 原平市| 巨鹿县| 吴桥县| 庄浪县| 宁明县| 西华县| 四子王旗| 南汇区| 永平县| 富源县| 利津县| 松阳县| 五大连池市| 武威市| 东安县| 翼城县| 新蔡县| 赤水市| 大石桥市| 泾阳县| 禹州市| 屏东县| 宜阳县| 绥德县|