SpringCloud注册中心Eureka

/ SpringCloud / 5 条评论 / 107浏览

本篇概论

在上一篇中我们介绍了微服务相关的内容。微服务的本质就是让服务与服务之间进行互相调用。那么在调用之前需要有一个前提。就是不同的服务与服务之间怎么知道彼此的存在的呢?因为服务都是独立部署的,根本没有任何关联。如果都不知道要调用的服务地址,那还怎么进行互相调用呢?为了解决这样的问题,于是SrpingCloud提供了注册中心的组件。我们在开发项目时,都向注册中心注册,在进行服务调用时,注册中心返回要调用服务的地址,这样就解决了上述问题了。


创建Eureka服务端步骤

在SrpingCloud中Eureka是注册中心的组件,通过Eureka我们可以很方便的搭建一个注册中心。在SrpingCloud中Eureka组件分为服务端和客户端。如果有Dubbo项目开发经验的人可以理解为Eureka中的服务端,就相当于zokeerper服务,也就是记录服务地址的。而Eureka中的客户端,即是我们Dubbo项目中真真正正的服务。下面我们来详细介绍一下,怎么搭建一个Eureka服务端。


搭建一个Eureka服务端非常的简单,和创建一个SpringBoot的项目差不多,不同之处,就是添加依赖不一样。下面我们来详细介绍一下。

  1. 在IDEA中选择Spring Initializr选项。也就是如下图所示:

title

  1. 设置项目的相关参数,在这一点和创建SpringBoot的项目没有任何区别。

title

  1. 这一块是最重要的,也就是唯一和创建SpringBoot项目不同的地方。

title

  1. 这一步还是和SpringBoot项目一样,直接点击完成就可以了。

title

  1. 下图就是项目的架构图,比较简单和SpringBoot一样,唯一的区别就是pom.xml中的不同,也就是依赖不同。

title

下面我启动直接启动项目看一下运行结果。启动日志:

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.InstanceInfoReplicator$1.run(InstanceInfoReplicator.java:101) [eureka-client-1.9.8.jar:1.9.8]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_191]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_191]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_191]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_191]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]

2019-03-09 18:20:09.617  INFO 1752 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-03-09 18:20:09.618  INFO 1752 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8080

我们发现和SpringBoot启动有一些不同,我们什么都没有改,也就是都是用默认的配置,启动的时候,居然抛出异常了。而在SpringBoot的项目中是可以正常启动的。虽然项目抛出了异常,但项目已经启动成功了,因为日志已经正确的输出了项目的端口了。下面我们直接访问这个端口,看看会返回什么信息。访问地址:

http://127.0.0.1:8080

title

@EnableEurekaServer注解

看上面的返回结果我们应该很熟悉,这是因为我们没有写Controller导致的,在SpringBoot的文章中我们介绍过,这里就不详细介绍了。但这显然是不对的,因为刚刚我们介绍过SpringCloud中是使用Eureka来提供注册中心服务的,并且Eureka有客户端和服务端之分,所以我们只在项目添加了Eureka的依赖还是不够的,我们还要在项目的代码中添加注解,来标识当前的Eureka服务是客户端服务还是服务端服务。这也就是本篇介绍的第一个注解。也就是@EnableEurekaServer注解。我们只要将该注解添加到SpringCloud项目中的启动类中即可。具体代码如下:

package com.jilinwula.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class JilinwulaSpringcloudEurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(JilinwulaSpringcloudEurekaServerApplication.class, args);
    }

}

然后我们继续启动项目。在访问地址:http://127.0.0.1:8080看一下项目返回的结果。项目启动日志如下:

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.InstanceInfoReplicator$1.run(InstanceInfoReplicator.java:101) [eureka-client-1.9.8.jar:1.9.8]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_191]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_191]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_191]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_191]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]

2019-03-09 18:42:29.427  INFO 1837 --- [      Thread-19] o.s.c.n.e.server.EurekaServerBootstrap   : isAws returned false
2019-03-09 18:42:29.428  INFO 1837 --- [      Thread-19] o.s.c.n.e.server.EurekaServerBootstrap   : Initialized server context
2019-03-09 18:42:29.461  INFO 1837 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-03-09 18:42:29.461  INFO 1837 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8080

看上述日志,项目启动时还是会抛出异常,我们先不用考虑,在后续的内容中我们在解释为什么启动时会抛出异常。还是和第一次启动一样,虽然启动抛出异常了,但项目还是启动成功了。下面我们继续访问以下地址,看一下访问结果。

http://127.0.0.1:8080

返回结果:

title

自定义注册中心地址

我们看这回返回的不是默认的错误页面了,而是返回了一个管理界面。这个管理界面就是SpringCloud中Eureka组建为我们提供的注册中心的管理界面,通过这个界面,我们可以非常方便的,来管理哪些服务注册成功、哪些注册失败以及服务其它状态等。看上图中的界面显示,现在没有任何一个服务注册成功。下面我们看一下刚刚项目启动时,抛出的异常。如果我们现在观察项目的启动日志,我们会发现,日志是每隔一段时间,就会抛出和启动时一样的异常。这是为什么呢?这是因为Eureka服务端和客户端是通过心跳方式检测的服务状态。刚刚我们通过@EnableEurekaServer注解启动了Eureka的服务端。实际上@EnableEurekaServer注解在底层实现时,除了标识项目为Eureka的服务端外,还会默认标识项目为Eureka的客户端。也就是通过@EnableEurekaServer注解标识的项目,默认即是Eureka的客户端还是Eureka的服务端。所以上述报错的原因就是Eureka的客户端与找到Eureka的服务端才抛出的异常。那怎么解决呢?既然我们知道了异常的根本原因,那我们解决就比较简单了,我们只要在项目中正确的配置Eureka的服务端的地址就可以解决上述的问题。具体配置如下。我们知道在创建SpringClourd项目默认会为我们创建application.properties文件,我们首先将该文件修改为yml文件(原因在之前的文章中已经介绍过了)。具体配置如下。application.yml配置:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8080/eureka/

配置完上述参数后,我们重新启动项目,然后在观察一下日志,看看是不是还会抛出异常?(第一次启动项目时,还会是抛出异常的,因为我们的Eureka服务端还没有启动成功呢,所以还是会抛出异常的,我们只要看心跳之后,会不会抛出异常即可。)下面为启动后的日志:

2019-03-09 21:00:27.909 INFO 1930 --- [ Thread-21] o.s.c.n.e.server.EurekaServerBootstrap : isAws returned false
2019-03-09 21:00:27.909 INFO 1930 --- [ Thread-21] o.s.c.n.e.server.EurekaServerBootstrap : Initialized server context
2019-03-09 21:00:27.949 INFO 1930 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2019-03-09 21:00:27.949 INFO 1930 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8080
2019-03-09 21:00:27.952 INFO 1930 --- [ main] inwulaSpringcloudEurekaServerApplication : Started JilinwulaSpringcloudEurekaServerApplication in 4.318 seconds (JVM running for 4.816)
2019-03-09 21:00:28.288 INFO 1930 --- [(1)-192.168.0.3] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-03-09 21:00:28.288 INFO 1930 --- [(1)-192.168.0.3] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2019-03-09 21:00:28.295 INFO 1930 --- [(1)-192.168.0.3] o.s.web.servlet.DispatcherServlet : Completed initialization in 6 ms2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Disable delta property : false
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Single vip registry refresh property : null
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Force full registry fetch : false
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Application is null : false
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Registered Applications size is zero : true
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Application version is -1: true
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Getting all instance registry info from the eureka server
2019-03-09 21:00:57.745 WARN 1930 --- [nio-8080-exec-1] c.n.e.registry.AbstractInstanceRegistry : DS: Registry: lease doesn't exist, registering resource: UNKNOWN - 192.168.0.3
2019-03-09 21:00:57.745 WARN 1930 --- [nio-8080-exec-1] c.n.eureka.resources.InstanceResource : Not Found (Renew): UNKNOWN - 192.168.0.3
2019-03-09 21:00:57.763 INFO 1930 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/192.168.0.3 - Re-registering apps/UNKNOWN
2019-03-09 21:00:57.763 INFO 1930 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/192.168.0.3: registering service...
2019-03-09 21:00:57.770 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : The response status is 200
2019-03-09 21:00:57.807 INFO 1930 --- [nio-8080-exec-3] c.n.e.registry.AbstractInstanceRegistry : Registered instance UNKNOWN/192.168.0.3 with status UP (replication=false)
2019-03-09 21:00:57.809 INFO 1930 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/192.168.0.3 - registration status: 204
2019-03-09 21:00:58.329 INFO 1930 --- [nio-8080-exec-4] c.n.e.registry.AbstractInstanceRegistry : Registered instance UNKNOWN/192.168.0.3 with status UP (replication=true)

我们看项目这时已经不会抛出异常了,并且通过观察发现,每隔一段时间就会有日志输出,这也就是上面介绍的Eureka的服务端和Eureka的客户端的心跳机制。下面我们继续访问http://127.0.0.1:8080地址来看看此时的注册中心和刚刚相比,是否有不一样的地方。

title

修改默认项目名

我们看这时的注册中心已经检测到了有服务注册了,只不过这个服务就是Eureka的服务端自己,并且名字为UNKNOWN。如果有强迫者的人如果看到UNKNOWN那一定会感觉不舒服,不了解了Eureka组件的还以为注册中心出错了呢。下面我们修改一下项目参数,将UNKNOWN改成我们指定的名字。具体配置如下:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8080/eureka/
spring:
  application:
    name: jilinwula-springcloud-eureka-server

我们在看一下注册中的的变化,看看还是不是已经成功的将UNKNOWN修改为我们指定的项目名字了。

title

register-with-eureka配置

我们看注册中心已经成功的显示我们配置文件中的项目名字了。在实际的开发中,我们基本不会让注册中心显示Eureka的服务端自己的服务,这样可能会导致和Eureka的客户端相混淆。所以通常的做法是让注册中心将Eureka的服务端屏蔽掉,说是屏蔽实际上是让Eureka的服务端不向注册中心注册。具体配置如下:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8080/eureka/
    register-with-eureka: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server

我们在观察一下注册中心看看还是否可以检测到Eureka服务端自己。

title

我们发现这时注册中心已经检测到不任何服务了。下面我们将Eureka服务端的端口设置为默认的端口8761,因为8080端口可能会被占用。具体配置如下:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/
    register-with-eureka: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8761

创建Eureka客户端步骤

这时我们Eureka服务端的基本配置就介绍完了,下面我们介绍一下Eureka组件的客户端。下面我们还是向Eureka服务端一样从创建项目开始。具体步骤如下:

  1. 我们还是在IDEA中选择Spring Initializr选项。也就是如下图所示:

title

  1. 设置项目的相关参数,和Eureka服务端没有任何区别。

title

  1. 这一步非常关键,因为它和Eureka服务端和SpringBoot都是不一样的。

title

备注:为了保证Eureka服务端和客户端可以注册成功,我们要特别注意保证两个项目中SpringBoot及其SpringCloud的版本一致。由于剩下的步骤和Eureka服务端一样,我们就不做过多的介绍了。下面我们还是和Eureka服务端一样,配置注册中心的服务地址。具体配置如下:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/
spring:
  application:
    name: jilinwula-springcloud-eureka-client
server:
  port: 8081

@EnableEurekaClient注解

如果只修改上面的配置,注册中心是不会检测到Eureka客户端的,因为我们还没有在该项目的启动类上添加Eureka客户端的注解。具体配置如下:

package com.jilinwula.jilinwulaspringcloudeurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class JilinwulaSpringcloudEurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(JilinwulaSpringcloudEurekaClientApplication.class, args);
    }

}

@EnableEurekaClient注解与@EnableDiscoveryClient注解区别

也就是添加@EnableEurekaClient注解。实际上除了该注解外,我们还可以用@EnableDiscoveryClient注解来达到同样的作用。它们两个注解的区别是注册中心的实现方式有很多种,如果是采用的是Eureka服务的话,那客户端直接使用@EnableEurekaClient注解和@EnableDiscoveryClient注解都可以。如果注册中心采用的是zookeeper或者其它服务时,那我们注册中心客户端就不能采用@EnableEurekaClient注解了,而是要使用@EnableDiscoveryClient注解。所以在实际的开发中我们推荐使用@EnableDiscoveryClient注解,这样当我们更换注册中心实现时,就不用修改代码了。上述代码中我们为了和Eureka服务端一致,所以我们采用@EnableDiscoveryClient注解。下面我们启动一下项目看看注册中心是否可以成功的检测Eureka客户端的存在。当我们按照上面的配置启动Eureka客户端时,我们发现日志居然报错了,并且项目自动停止运行了。具体日志如下:

2019-03-09 23:00:55.844  INFO 2082 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_JILINWULA-SPRINGCLOUD-EUREKA-CLIENT/192.168.0.3:jilinwula-springcloud-eureka-client:8081: registering service...
2019-03-09 23:00:55.852  INFO 2082 --- [           main] inwulaSpringcloudEurekaClientApplication : Started JilinwulaSpringcloudEurekaClientApplication in 2.115 seconds (JVM running for 2.567)
2019-03-09 23:00:55.866  INFO 2082 --- [       Thread-8] o.s.c.n.e.s.EurekaServiceRegistry        : Unregistering application JILINWULA-SPRINGCLOUD-EUREKA-CLIENT with eureka with status DOWN
2019-03-09 23:00:55.866  WARN 2082 --- [       Thread-8] com.netflix.discovery.DiscoveryClient    : Saw local status change event StatusChangeEvent [timestamp=1552143655866, current=DOWN, previous=UP]
2019-03-09 23:00:55.869  INFO 2082 --- [       Thread-8] com.netflix.discovery.DiscoveryClient    : Shutting down DiscoveryClient ...
2019-03-09 23:00:55.883  INFO 2082 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_JILINWULA-SPRINGCLOUD-EUREKA-CLIENT/192.168.0.3:jilinwula-springcloud-eureka-client:8081 - registration status: 204
2019-03-09 23:00:55.883  INFO 2082 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_JILINWULA-SPRINGCLOUD-EUREKA-CLIENT/192.168.0.3:jilinwula-springcloud-eureka-client:8081: registering service...
2019-03-09 23:00:55.888  INFO 2082 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_JILINWULA-SPRINGCLOUD-EUREKA-CLIENT/192.168.0.3:jilinwula-springcloud-eureka-client:8081 - registration status: 204
2019-03-09 23:00:55.889  INFO 2082 --- [       Thread-8] com.netflix.discovery.DiscoveryClient    : Unregistering ...
2019-03-09 23:00:55.893  INFO 2082 --- [       Thread-8] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_JILINWULA-SPRINGCLOUD-EUREKA-CLIENT/192.168.0.3:jilinwula-springcloud-eureka-client:8081 - deregister  status: 200
2019-03-09 23:00:55.902  INFO 2082 --- [       Thread-8] com.netflix.discovery.DiscoveryClient    : Completed shut down of DiscoveryClient

这是为什么呢?这个问题的原因是因为版本不同导致的,也就是有的Eureka版本有BUG导致的,少了一个依赖我们只要把缺少的依赖添加上即可。缺少的依赖如下:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

下面我们继续启动Eureka客户端,然后看看注册中心是否可以检测到Eureka客户端。

title

这时我们发现注册中心已经成功的检测到了Eureka客户端的服务了。除此之外,我们发现此时的注册中心和以往相比有了其它的不同,我们发现注册中心显示警告信息了。这是为什么呢?这是因为注册中心有预警机制,因为我为了掩饰项目,会频繁的启动重启项目,这样注册中心的心跳就会时常检测不到Eureka客户端的心跳,所以就会认为该服务已下线。所以Eureka注册中心当服务下线少于一定比率时,就会显示警告信息,以此来表示有的服务运行不稳定。当然我们还是可以通过配置参数来消除上面的警告。具体参数如下:

register-with-eureka配置

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8761

该参数的是意思是默认认为服务均在线,并且还有一点要注意,该参数是在Eureka服务端配置的。我们重新启动完Eureka服务端后,在看一下注册中心中的变化。

title

Eureka服务端双注册中心配置

这时我们发现警告信息又变了,这说明我们的配置参数启作用了。那为什么还会提示警告呢?这是因为我们配置了改参数,所以注册中心就不会准确的检查服务上下线状态了。所以提示了另一个警告。下面我们将Eureka服务端配置成多节点,在实际的项目开发中,我们知道一个节点可能会出现问题,如果Eureka服务端出现了问题,那么就相当于整个服务都不能调用了,所以为了保证高可用,通常会将Eureka服务端配置成多个节点,下面我们先尝试将Eureka服务端配置成双节点。既然是双节点,那当然是有两个Eureka服务端项目了,由于创建Eureka服务端的步骤,我们已经很熟悉了,所以我们只介绍它们配置文件的不同。首先我们先看一下第一个Eureka服务端注册中心配置:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8762/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8761

第二个Eureka服务端注册中心配置:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8762

我们发现这两个配置基本相同,唯一的不同就是配置注册中地方,它们彼此配置的是对方的服务地址。也就是让两个Eureka服务端彼此注册,这样就只要我们Eureka客户端注册任意一个注册中心,这两个注册中心都可以检测到Eureka客户端的存在,因为底层它们会进行数据同步。下面我们看一下现在的注册中心的变化。

8761注册中心:

title

8762注册中心:

title

我们看我们的Eureka客户端只配置了一个注册中心,但两个注册中心都检测到了Eureka客户端的存在。这就是刚刚提到过的当两个注册中心彼此注册时,就会进行数据通信,所以8762注册中心也检测到了该Eureka客户端的存在。下面我们将8761注册中心停止服务,然后在观察一下8762的注册中心,看看是否有何变化。

8762注册中心:

title

我们发现虽然我们将8761注册中心停止了服务,但8762注册中心依然检测到了Eureka客户端的存在。下面我们重新启动一下Eureka客户端然后在看一下8762注册中心还是否可以检测到Eureka客户端的存在。

title

这时我们发现8762注册中心已经检测不到Eureka客户端的服务了。那应该怎么办呢?解决的办法很简单,那就是让我们的Eureka客户端注册两个注册中心。具体配置如下:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/
spring:
  application:
    name: jilinwula-springcloud-eureka-client
server:
  port: 8081

这时我们在访问一下注册中心,看一下服务是否可以检测到。

title

Eureka服务端三注册中心配置

这时我们的注册中心已经成功的检测到了Eureka客户端了。下面我们介绍一下怎么部署Eureka服务端3节点。既然2节点我们已经知道了要彼此注册,那么3节点,我们应该已经猜到了,那就是让每一个节点都注册另外两个节点的服务。具体配置如下:

8761注册中心:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8761

8762注册中心:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8763/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8762

8763注册中心:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8763

Eureka客户端:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/
spring:
  application:
    name: jilinwula-springcloud-eureka-client
server:
  port: 8081

下面我们看一下访问任何一个注册中心,来看一下注册中心是否可以检测到Eureka客户端的服务,及其它注册中心的存在。

title

我们看注册中心已经成功的检测到了Eureka客户端的服务了,并且红色标识的地方已经检测到了其它两个注册中心的地址了,所以我们在访问注册中心时,就可以通过下面红色标识的地方,来了解项目中的Eureka服务端有几个注册中心。


上述内容就是SpringClould中Eureka组件的详细介绍,如有不正确或者需要交流的欢迎留言,下一篇我们将介绍怎么在SpringClould中进行不同的服务与服务之间的调用。谢谢。   


项目源码

https://github.com/jilinwula/jilinwula-springcloud-eureka.git   

  1. 在注册服务时,Eureka设置了双节点,但是两个节点并没有同步服务注册列表,不太懂

    回复
    1. @阿宸

      你Eureka客户端是怎么配置的,是配置了一个注册中心,还是两个?

      回复
    2. @吉林乌拉

      可以了 我在C盘下设置了IP映射 没生效 我直接在配置文件指定的ip 可以同步了 注册自己的选项是关闭的,拉去服务的选项是开启的

      回复
  2. 很详细,期待下一步文章,加油!

    回复
    1. @阿宸

      谢谢,你们的支持,是我最大的动力,一起加油。

      回复