SpringCloud实践(三) 高可用的Eureka注册中心

       微服务的一个重要的特性就是去中心化,在上一节中,建立了一个微服务的demo,但是在上面例子中,很明显注册中心存在单点失效问题。当单一的注册中心失效后,对整个微服务来说,就会崩溃。好在SpringCloud提供了注册中心高可用配置的方案,下面就看一下如果实现高可用的Eureka注册中心。

        注册中心的高可用是以集群的方式来解决注册中心的单点问题,用下面的图来表示高可用的架构:


    下面通过例子,是看一下的微服务高可用实现:

    一、实践背景

    1、基于上一节例子

    2、通过配置和启动多个节点,进行验证

    二、工程配置

    1、Eureka 注册中心

    在上一节的注册中心基础上,我们通过配置的方式,来让注册中心支持高可用:

    首先将原工程的application.properties 复制为 application-center1.properties和application-center2.properties两个配置文件,在配置文件中,最重要的是修改配置,让注册中心可以想另外一个注册中心注册服务,起到关键作用的配置项是:

eureka.client.register-with-eureka=true

eureka.client.fetch-registry=true

下面贴出center1和center2 的配置文件,application-center1.properties配置如下

server.port=11111

spring.application.name=Eureka-Server
eureka.instance.hostname=center1
#true表示将自己注册为一个服务,否则是启动了一个注册中心
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

#这里写的center1 的端口,为的是向其进行注册自己
eureka.client.service-url.defaultZone=http://center2:11112/eureka/

#关闭自我保护,并设置剔除时间为30秒
#eureka.server.enable-self-preservation=false
#eureka.server.eviction-interval-timer-in-ms=15000
application-center2.properties的配置如下:
server.port=11112

spring.application.name=Eureka-Server
eureka.instance.hostname=center2
#true表示将自己注册为一个服务,否则是启动了一个注册中心
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

#这里写的center1 的端口,为的是向其进行注册自己
eureka.client.service-url.defaultZone=http://center1:11111/eureka/

#关闭自我保护,并设置剔除时间为30秒
#eureka.server.enable-self-preservation=false
#eureka.server.eviction-interval-timer-in-ms=15000

 在这两个配置文件里面, eureka.instance.hostname对应分别是center1和center2,所以在系统host文件中,我们配置上这两个主机名,本例是本机配两个主机名,实际场景下是多个ip配置主机名。C:\Windows\System32\drivers\etc\ 下有一个hosts文件,在hosts文件中,添加

127.0.0.1   center1
127.0.0.1   center2

注:Eureka也支持配置ip,需要进行一个参数eureka.instance.perferIpAddress=true

eureka.client.service-url.defaultZone参数需要注意一下,如果是center1,需要配置为 http://center2:11112/eureka/

意思是向center2 注册自己,center2正好相反。

还有两个参数设计关闭自我保护,暂时不管

两个配置文件有了,还需要控制启动时调用的是哪个配置文件,我们将application.properties修改一下:

spring.profiles.active=center2

只有一行,通过spring.profiles.active 来控制启动的是哪个配置文件。通过修改这个配置项,我们启动起两个注册中心。由于启动先后,第一个启动的,会打一段异常日志,不用担心,因为它在向第二个注册中心注册,第二个注册中心还没启动好,所以会报错。启动后通过http://localhost:11111/ 查看


注意http://localhost:11111/ 看到DS Replicas 是 center2, 在11112 端口的url下,看到是center1,两个节点时互为HA。这个时候,如果我们关掉 11112端口的进程,发现http://localhost:11111/ 并没有变化,等过了一小段时间后,这个页面刷新一下:


出现红色的警告,但是status 并没有变化。这个是因为Eureka的自我保护默认开启,会保持一段注册信息。将上面的两个配置文件中的注释掉的配置放开,再次正常启动后,关闭11112端口的进程:


注册中心同样启动,但是会提示自我保护关闭

2、服务的配置

两个注册中心节点建立起来后,我们修改一下原来的两个服务的配置文件,这些服务分别向两个注册中心进行注册服务

同样,我们需要修改服务的配置文件:

server.port=21111

eureka.instance.hostname=localhost
eureka.client.service-url.defaultZone=http://center1:11111/eureka/,http://center2:11112/eureka/
# 重点需要注意spring.application.name,这个是在以后服务与服务之间相互调用是根据这个name
spring.application.name=service-sayHello

#服务失效后的保持
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.instance.lease-expiration-duration-in-seconds=30

eureka.client.service-url.defaultZone=http://center1:11111/eureka/,http://center2:11112/eureka/,这里说明服务是向两个注册中心进行注册。我们启动两个服务,port分别是 21111和 31111,启动后,http://localhost:11111/如下:


3、消费者

同样,修改一下消费者的配置文件:

eureka.client.service-url.defaultZone=http://center1:11111/eureka/,http://center2:11112/eureka/,

启动起来后,如下图:


4、验证高可用,关闭注册中心2

消费者http://localhost:31311/hi 并没有受到影响,注册中心2的URL http://localhost:11112/已经打不开了,我们看一下http://localhost:11111/,还能显示(注:这里要等待一下段时间)


注册中心(本身也是服务)在应用服务注册列表中已经看不到了。11112注册中心2关闭后,服务(注册中心1)没有办法注册,所以不在注册列表中,但是服务SAYHELLO和消费服务,因为有向注册中心1注册,所以还可以看到和使用。在General Info中也可以看到http://center2:11112/eureka 是 unavaliable状态。


通过双节点或者更多节点来保障注册中心和服务不会全部崩溃和失效,大大提高了服务的健壮性和可扩展性。


猜你喜欢

转载自blog.csdn.net/csolo/article/details/80540359