Eureka--4、使用Peer实现Eureka Server高可用

单独的Eureka Server仍然可以保持很高的弹性

因为客户端本地也会存有一份服务的map,所以即使所有的注册中心全部挂掉,也不影响client的相互访问。并且会在注册中心可用的情况下第一时间进行通信,同步数据。即使只有一个Eureka Server,也可以让系统又比较高的弹性。

但是对于大型项目,天生就要求有多个Zone的存在。每个Zone中又会有至少一个Eureka Server。这些Eureka Server应该互为peer。peer会从所有的兄弟peer那里同步服务列表。从其它节点那里同步到的服务列表和本机的服务列表一样,也可以同步给客户端。

 

实现高可用的Eureka集群

我们前面已经把eureka-server和拆成了两个,但是用来演示高可用,两个是不够的。

我们假定有两个zone,nj1,nj2,假设用来演示一个zone下有多个eureka server,需要四个server,我们把server继续拆成nj1a、nj1b,nj2a,nj2b。同时把client拆成两个。

然后把Server改成不用defaultZone的配置。具体注释放在yml中,所有配置如下。

需要继续去hosts里面添加hostName

127.0.0.1 eureka-server3

127.0.0.1 eureka-server4

配置Eureka Client

加载配置的顺序为先加载bootstrap.yml,再加载application.yml,如果有后缀,也就是profile,则会先加载原始的,再加载带后缀的,后面的配置会覆盖前面的配置。因为我们使用了config,所以bootstrap.yml必不可少,我们在bootstrap.yml中配置config需要的信息。在application.yml中配置公共信息。在application-xxx.xml中配置各自的信息。

bootstrap.yml省略

application.yml

eureka:

  instance:

    hostname: localhost

  client:

    假设指定region为江苏

    region: js

    availability-zones:

      #假设江苏下面有南京的两个region

      js: nj1,nj2

    service-url:

      客户端应该根据所在zone,兄弟zone的顺序,列出所有的可连接service-url

      nj1: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka

      nj2: http://eureka-server3:8763/eureka,http://eureka-server4:8764/eureka

application-web1.yml

server:

  port: 8080

eureka:

  instance:

    metadata-map:

      zone: nj1

application-web2.yml

server:

  port: 8081

eureka:

  instance:

    metadata-map:

      zone: nj2

配置Eureka Server

注意前俩metadateMap.zone是nj1,后俩是nj2,虽然不知道啥用,我们先按照“假设这俩是用来指定server真正属于哪个zone”的逻辑来设置

 

前俩是availabilityZones是js: nj1,nj2 后俩是js: nj2,nj1

hostname是eureka-server1,eurea-server2,eurea-server3,eurea-server4顺着排下去

前俩service-url,nj1在前面,后俩nj2在前面

application-nj1a.yml

spring:

  application:

    name: eureka

server:

  port: 8761

eureka:

  instance:

    hostname: eureka-server1

    指定当前属于njzone

    metadata-map:

      zone: nj1

  client:

    使用默认的registerWithEurekafetchRegistry

    #register-with-eureka: false

    #fetch-registry: false

    region: js

    availability-zones:

      为达到优先访问自己zone的效果,这里需要调整顺序

      原则为自己的在前,按照跨region访问顺序排布其它的

      js: nj1,sz1

    service-url:

      按照属于自身region的放在前面,其它region的按顺序罗列

      nj1: http://eureka-server2:8762/eureka

      相同region,多个服务使用逗号隔开

      nj2: http://eureka-server3:8763/eureka, http://eureka-server4:8764/eureka

application-nj1b.yml

spring:

  application:

    name: eureka

server:

  port: 8762

eureka:

  instance:

    hostname: eureka-server2

    指定当前属于njzone

    metadata-map:

      zone: nj1

  client:

    使用默认的registerWithEurekafetchRegistry

    #register-with-eureka: false

    #fetch-registry: false

    region: js

    availability-zones:

      为达到优先访问自己zone的效果,这里需要调整顺序

      原则为自己的在前,按照跨region访问顺序排布其它的

      js: nj1,nj2

    service-url:

      按照属于自身region的放在前面,其它region的按顺序罗列

      nj1: http://eureka-server1:8761/eureka

      相同region,多个服务使用逗号隔开

      nj2: http://eureka-server3:8763/eureka, http://eureka-server4:8764/eureka

application-nj2a.yml

spring:

  application:

    name: eureka

server:

  port: 8763

eureka:

  instance:

    hostname: eureka-server3

    指定当前属于njzone

    metadata-map:

      zone: nj2

  client:

    使用默认的registerWithEurekafetchRegistry

    #register-with-eureka: false

    #fetch-registry: false

    region: js

    availability-zones:

      为达到优先访问自己zone的效果,这里需要调整顺序

      原则为自己的在前,按照跨region访问顺序排布其它的

      js: nj2,nj1

    service-url:

      按照属于自身region的放在前面,其它region的按顺序罗列

      nj2: http://eureka-server4:8764/eureka

      相同region,多个服务使用逗号隔开

      nj1: http://eureka-server1:8761/eureka, http://eureka-server2:8762/eureka

application-nj2b.yml

spring:

  application:

    name: eureka

server:

  port: 8764

eureka:

  instance:

    hostname: eureka-server4

    指定当前属于njzone

    metadata-map:

      zone: nj2

  client:

    使用默认的registerWithEurekafetchRegistry

    #register-with-eureka: false

    #fetch-registry: false

    region: js

    availability-zones:

      为达到优先访问自己zone的效果,这里需要调整顺序

      原则为自己的在前,按照跨region访问顺序排布其它的

      js: nj2,nj1

    service-url:

      按照属于自身region的放在前面,其它region的按顺序罗列

      nj2: http://eureka-server3:8763/eureka

      相同region,多个服务使用逗号隔开

      nj1: http://eureka-server1:8761/eureka, http://eureka-server1:8762/eureka

我们启动web1和web2,server的nj1a,nj1b,nj2a,nj2b

效果应该是localhost:8761的DS Replicas是eureka-server2,eureka-server3,eureka-server4,localhost:8762的DS Replicas应该是其它三个,依次类推。然后四个Eureka Server都会显示六台服务,包括两个注册上来的服务,和4个Eureka Server自身。为节省篇幅,截前两个的图。

serviceUrl的设置规则

无论是client还是serviceUrl应该把所有的Eureka Server全部列到后面。

按照优先本Region的其它serviceUrl,然后其它Region内的serviceUrl。

虽然配置了很多,但是Eureka会逐个探测serviceUrl是否能连接,能够连接则停止。所以同一时间只会和一个发生关系。假设最优先的serviceUrl连接不上,会“暂时”连接次优先的server,一旦前面的可以连接,将会连接到前面的serviceUrl。

所以必须要全部列出来,按照优先级排列,才是高可用的最佳实践。

DS Replicas

replicas 复制品,DS不知道啥意思,这里表示的就是peer的hostname列表。

为什么每次都需要重启来测试效果

这个问题太大,留着下一篇说

猜你喜欢

转载自blog.csdn.net/u011531425/article/details/81713479