Spring Cloud从构建到部署系列(三)之服务治理:Eureka

  这篇的内容主要介绍Eureka的使用,首先版本说明,Spring Boot的版本采用2.0.7.RELEASE,Srping Cloud的版本采用Finchley.SR2。

  • 1 搭建一个注册中心

    工程目录如下图,构建一个父工程,将我们所有的项目都建在父工程下面,后续的模块会陆续添加:

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

  我们先来看下父工程的pom文件,主要是依赖管理,统一版本,所有子模块引用的spring Cloud相关的依赖都不用再指定版本,避免了版本不一致的问题:

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

然后是Eureka 服务端的代码

1.首先引入依赖:

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

2.编写启动类:

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

其中@SpringBootApplication注解是springboot启动类注解,@EnableEurekaServer注解是表示作为Eureka服务端。

3.配置文件application.yml

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

这里应该不需要太多解释,启动程序,访问http://localhost:8080/,就可以看到Eureka的管理界面:

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

但是现在存在一个问题,管理界面虽然可以访问,但是控制台一直在报错:Caused by: java.net.ConnectException: Connection refused: connect

这是因为Eureka在作为服务端的同时也会作为客户端,它也会向服务端注册自己,但是找不到服务端,所以报错,解决办法也很简单,在application.yml中增加一行配置,不向服务端注册自己,具体如下:

eureka:
  client:
    register-with-eureka: false

注册中心服务端搭建好了,下面新建一个客户端工程,向服务端注册自己,新建一个项目就叫demo吧。

1.引入依赖

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

2.编写启动类

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

@EnableDiscoveryClient 注解就是作为的客户端。

3.配置文件

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

eureka的这段配置就是指定注册中心的地址,会作为服务端向这个注册中心指向的地址注册自己。

ok,一切搞定,我们启动客户端,启动成功后可以看到Eureka的界面上多了一个服务,就是我们刚才的客户端,成功的注册到了服务端。

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

  • 2 构建高可用注册中心

    Spring Cloud从构建到部署系列(三)之服务治理:Eureka

        Eureka在设计之初就可虑了高可用的问题,一个Eureka Server即可以作为注册中心,同时也可作为客户端,向其他注册中心注册自己。因此,Eureka注册中心的高可用的实现是,部署多个注册中心,彼此互相注册,构建出注册中心的集群,下面一两个注册中心节点为例进行说明。

        准备两个Eureka注册中心启动实例,分别命名为EurekaServerApplication1,端口为8081;EurekaServerApplication2,端口为8082。如下图

        Spring Cloud从构建到部署系列(三)之服务治理:Eureka

        首先启动第一个注册中心,配置文件

spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8082/eureka #这里是EurekaServerApplication2注册中心的

    然后启动EurekaServerApplication2,注册中心地址修改为指向EurekaServerApplication1

spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka #这里指向刚才启动的EurekaServerApplication1

 

通过访问htpp://localhost:8080和htpp://localhost:8081观察两个注册中心的管理页面,会发现彼此已经互相注册了,下图展示注册中心1的管理页面

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

但是同时存在一个问题,就是虽然EurekaServerApplication2已经注册到了EurekaServerApplication1中( registered-replicas ),但是是在不可用分片中( unavailable-replicas ),这个问题我也鼓捣了半天,找到了解决办法:

首先,修改c:\Window\System32\drivers\etc\hosts文件,增加如下配置

127.0.0.1 peer1

127.0.0.1 peer2

然后我们修改注册中心的配置如下:

spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: peer1
  client:
    service-url:
      defaultZone: http://peer2:8081/eureka #指向EurekaServerApplication2
spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: peer2
  client:
    service-url:
      defaultZone: http://peer1:8081/eureka #指向EurekaServerApplication1


再次重新启动两个注册中心,访问注册中心1的管理页面会看到,注册中心2已经在可用分片中了:

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

 

具体是因为啥我没去研究,等我弄明白了在分享出来,如果有知道的可以在下面留言。

上面只是举例说明了2个节点的注册中心集群,更多的节点的集群也是如此,相互注册即可:

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

好了,说完了服务端的集群,再来说说客户端如何针对注册中心集群进行配置,以上面的demo项目为例,只需要修改**册中的配置,将所有的注册中心都配置进去:

spring:
  application:
    name: eureka-client
eureka:
  client:
    service-url:
      defaultZone: http://peer1:8081/eureka,http://peer2:8082/eureka #这里配置集群注册中心

我们启动下demo项目,就可以在两个注册中心中都看到demo项目的注册信息了

Spring Cloud从构建到部署系列(三)之服务治理:Eureka

以上就是注册中心服务端集群和客户端的配置,下面聊聊注册中心的自我保护机制。

有的小伙伴可能已经发现,如果我将demo项目停止,但是在注册中心里会一直有demo的注册信息,这就是注册中心的自我保护机制。

Eureka默认60s内没有收到客户端的心跳信息,就会将此应用从自己维护的实例中剔除,但是有些情况,比如网络故障,客户端和服务端的通信中断,但是客户端还是正常运行的,这个时候就不应该将其剔除,这里就是Eureka引入的自我保护机制。

自我保护工作机制是在15分钟内,85%的客户端节点都没有正常心跳,服务端就会启动自我保护功能,启动后会出现一下的情况:

1、Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。

2、Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。

3、当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。

因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。

但是在测试开发中我们可能不需要这种保护机制,以便观察到更多的问题,那么可以通过配置来关闭自我保护功能,在Eureka服务端增加如下配置:

eureka:
  instance:
    hostname: peer1
  server:
    enable-self-preservation: false #默认为true,设置成false关闭自我保护

这样就可以在客户端服务停止60s后将其剔除,为了更直观的观察,我们还可以设置剔除时间,将其设置成1s,这样当客户端服务停止后,再次刷新Eureka管理界面,就可以看到实例从注册列表中剔除了,具体配置如下:

eureka:
  instance:
    hostname: peer1
  server:
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 1000 #将剔除时间设置为1s,注意单位是毫秒

到此,Eureka的基本使用就介绍完了。