欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)系,只是如果是單機環(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
#主機名
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]}

因為存在心跳機制,默認(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)文章

  • Spring?Boot?整合持久層之Spring Data JPA

    Spring?Boot?整合持久層之Spring Data JPA

    在介紹Spring Data JPA的時候,我們首先認(rèn)識下Hibernate。Hibernate是數(shù)據(jù)訪問解決技術(shù)的絕對霸主,使用O/R映射技術(shù)實現(xiàn)數(shù)據(jù)訪問,O/R映射即將領(lǐng)域模型類和數(shù)據(jù)庫的表進(jìn)行映射,通過程序操作對象而實現(xiàn)表數(shù)據(jù)操作的能力,讓數(shù)據(jù)訪問操作無須關(guān)注數(shù)據(jù)庫相關(guān)的技術(shù)
    2022-08-08
  • 詳解JAVA 強引用

    詳解JAVA 強引用

    這篇文章主要介紹了JAVA 強引用的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • java的時間類匯總(齊全)

    java的時間類匯總(齊全)

    這篇文章主要介紹了java的時間類匯總(齊全),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-09-09
  • Java中File文件操作類的基礎(chǔ)用法

    Java中File文件操作類的基礎(chǔ)用法

    這篇文章主要給大家介紹了關(guān)于Java中File文件操作類基礎(chǔ)用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用File類具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • java實現(xiàn)文件打包壓縮輸出到瀏覽器下載

    java實現(xiàn)文件打包壓縮輸出到瀏覽器下載

    這篇文章主要介紹了java實現(xiàn)文件打包壓縮輸出到瀏覽器下載,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 聊聊SpringBoot的@Scheduled的并發(fā)問題

    聊聊SpringBoot的@Scheduled的并發(fā)問題

    這篇文章主要介紹了聊聊SpringBoot的@Scheduled的并發(fā)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • C# 中Excel導(dǎo)入時判斷是否被占用三種方法

    C# 中Excel導(dǎo)入時判斷是否被占用三種方法

    這篇文章主要介紹了C# 中Excel導(dǎo)入時 判斷是否被占用三種方法的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • spring中實現(xiàn)容器加載完成后再執(zhí)行自己的方法

    spring中實現(xiàn)容器加載完成后再執(zhí)行自己的方法

    這篇文章主要介紹了spring中實現(xiàn)容器加載完成后再執(zhí)行自己的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 基于Spring中的事務(wù)@Transactional細(xì)節(jié)與易錯點、幻讀

    基于Spring中的事務(wù)@Transactional細(xì)節(jié)與易錯點、幻讀

    這篇文章主要介紹了基于Spring中的事務(wù)@Transactional細(xì)節(jié)與易錯點、幻讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 解決SpringBoot在后臺接收前臺傳遞對象方式的問題

    解決SpringBoot在后臺接收前臺傳遞對象方式的問題

    這篇文章主要介紹了解決SpringBoot在后臺接收前臺傳遞對象方式的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論