Spring Cloud 应用篇 之 Eureka 高可用

在 Spring Cloud 应用篇 之 Eureka 初体验 一文中,已经介绍了 Eureka 的基本使用了,但是之前 Eureka 只使用了单节点部署,生产上,不可能只有一个节点,所以我们要实现 Eureka 的高可用,本例就在此前代码的基础上进行修改,只部署两个节点。下面进行修改:

(一)修改配置文件如下,让两个 Eureka 互相向对方注册

spring:
  profiles:
    active: instance1
  application:
    name: eureka-service

eureka:
  client:
    #由于该应用为注册中心,设置为false,表明不向注册中心注册自己
    register-with-eureka: false
  server:
    enable-self-preservation: false
    #是否从eureka服务器获取注册信息,这里不需要
    fetch-registry: false
logging:
  level:
    com:
      netflix:
        eureka: OFF
        discovery: OFF

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
      health:
        show-details: ALWAYS

---

spring:
  profiles: instance1

server:
  port: 8761

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8762/eureka/

---
spring:
  profiles: instance2

server:
  port: 8762

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

每次启动一个 Eureka 的实例,需改 spring.profiles.active 的值,还有要去掉 Single instance only 的勾选

Spring Cloud 应用篇 之 Eureka 高可用_第1张图片

(二)修改 spring.profiles.active 的值为 instance1,启动 Eureka

Spring Cloud 应用篇 之 Eureka 高可用_第2张图片

修改 spring.profiles.active 的值为 instance2,启动 Eureka

Spring Cloud 应用篇 之 Eureka 高可用_第3张图片

(三)启动之前写的一个服务 spring-demo-service,它的配置文件如下:

server:
  port: 8281

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
spring:
  application:
    name: spring-demo-service

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
      health:
        show-details: ALWAYS

可以看到,此服务只注册到了 localhost:8761 的 Eureka

(四)访问 http://localhost:8761/,如下,spring-demo-service 已经注册进来

Spring Cloud 应用篇 之 Eureka 高可用_第4张图片

访问 http://localhost:8762/,如下,发现 spring-demo-service 还注册到了 localhost:8762 

Spring Cloud 应用篇 之 Eureka 高可用_第5张图片

从 spring-demo-service 的配置文件我们可以看到,它没有向 localhost:8762 注册,但是此时确实注册到了,主要是因为,两个注册中心 Eureka 相互注册了,所有注册到其中一个 Eureka 的服务实例信息会同步到另一个中。

(五)下面我们停止 localhost:8761 的 Eureka,再次访问 http://localhost:8761/,已经发现不能访问了,然后访问 http://localhost:8762/,发现注册列表中仍然有 spring-demo-service 的服务实例,这样,当其中一个节点的 Eureka 出现异常不可用时,还可以访问其他节点的 Eureka。

下面我们再看另一种情况,重启 spring-demo-service 服务,访问 http://localhost:8762/

Spring Cloud 应用篇 之 Eureka 高可用_第6张图片


这个时候,spring-demo-service 的服务在注册中心就没有了,那这种情况肯定是不行的啊,我们想要的结果是,其中一台注册中心挂掉后,服务还可以注册到其它的注册中心去,那要怎么解决这个问题呢?我们只能让每个服务都注册到每个注册中心去,下面我们修改 spring-demo-service 的配置文件如下:

server:
  port: 8281

eureka:
  client:
    serviceUrl:
      # 向每个注册中心注册
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
spring:
  application:
    name: spring-demo-service

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
      health:
        show-details: ALWAYS

重启 spring-demo-service 服务,这个时候再访问 http://localhost:8762/,就会发现 spring-demo-service 又注册进来了,图就不贴了。至此,我们就实现了 Eureka 的高可用。生产上可能会部署不只两个节点的 Eureka,可能会有三个或更多,只要让它们两两互相注册即可。

源码下载:https://github.com/shmilyah/spring-cloud-componets


你可能感兴趣的:(Spring,Cloud,应用篇,Spring,Cloud,Finchley)