本篇概论
在上一篇中我们介绍了微服务相关的内容。微服务的本质就是让服务与服务之间进行互相调用。那么在调用之前需要有一个前提。就是不同的服务与服务之间怎么知道彼此的存在的呢? 因为服务都是独立部署的,根本没有任何关联。如果都不知道要调用的服务地址,那还怎么进行互相调用呢?为了解决这样的问题,于是 SrpingCloud 提供了注册中心的组件。我们在开发项目时,都向注册中心注册,在进行服务调用时,注册中心返回要调用服务的地址,这样就解决了上述问题了。
创建 Eureka 服务端步骤
在 SrpingCloud 中 Eureka 是注册中心的组件,通过 Eureka 我们可以很方便的搭建一个注册中心。在 SrpingCloud 中 Eureka 组件分为服务端和客户端。如果有 Dubbo 项目开发经验的人可以理解为 Eureka 中的服务端,就相当于 zokeerper 服务,也就是记录服务地址的。而 Eureka 中的客户端,即是我们 Dubbo 项目中真真正正的服务。下面我们来详细介绍一下,怎么搭建一个 Eureka 服务端。
搭建一个 Eureka 服务端非常的简单,和创建一个 SpringBoot 的项目差不多,不同之处,就是添加依赖不一样。下面我们来详细介绍一下。
在 IDEA 中选择 Spring Initializr 选项。也就是如下图所示:
设置项目的相关参数,在这一点和创建 SpringBoot 的项目没有任何区别。
这一块是最重要的,也就是唯一和创建 SpringBoot 项目不同的地方。
这一步还是和 SpringBoot 项目一样,直接点击完成就可以了。
下图就是项目的架构图,比较简单和 SpringBoot 一样,唯一的区别就是 pom.xml 中的不同,也就是依赖不同。
下面我启动直接启动项目看一下运行结果。启动日志:
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
@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
返回结果:
自定义注册中心地址
我们看这回返回的不是默认的错误页面了, 而是返回了一个管理界面。这个管理界面就是 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 地址来看看此时的注册中心和刚刚相比,是否有不一样的地方。
修改默认项目名
我们看这时的注册中心已经检测到了有服务注册了,只不过这个服务就是 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 修改为我们指定的项目名字了。
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 服务端自己。
我们发现这时注册中心已经检测到不任何服务了。下面我们将 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 服务端一样从创建项目开始。具体步骤如下:
我们还是在 IDEA 中选择 Spring Initializr 选项。也就是如下图所示:
设置项目的相关参数,和 Eureka 服务端没有任何区别。
这一步非常关键,因为它和 Eureka 服务端和 SpringBoot 都是不一样的。
备注: 为了保证 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 客户端。
这时我们发现注册中心已经成功的检测到了 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 服务端后,在看一下注册中心中的变化。
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 注册中心:
8762 注册中心:
我们看我们的 Eureka 客户端只配置了一个注册中心,但两个注册中心都检测到了 Eureka 客户端的存在。这就是刚刚提到过的当两个注册中心彼此注册时,就会进行数据通信,所以 8762 注册中心也检测到了该 Eureka 客户端的存在。下面我们将 8761 注册中心停止服务,然后在观察一下 8762 的注册中心,看看是否有何变化。
8762 注册中心:
我们发现虽然我们将 8761 注册中心停止了服务,但 8762 注册中心依然检测到了 Eureka 客户端的存在。下面我们重新启动一下 Eureka 客户端然后在看一下 8762 注册中心还是否可以检测到 Eureka 客户端的存在。
这时我们发现 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
这时我们在访问一下注册中心,看一下服务是否可以检测到。
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 客户端的服务,及其它注册中心的存在。
我们看注册中心已经成功的检测到了 Eureka 客户端的服务了,并且红色标识的地方已经检测到了其它两个注册中心的地址了,所以我们在访问注册中心时,就可以通过下面红色标识的地方,来了解项目中的 Eureka 服务端有几个注册中心。
上述内容就是 SpringClould 中 Eureka 组件的详细介绍,如有不正确或者需要交流的欢迎留言,下一篇我们将介绍怎么在 SpringClould 中进行不同的服务与服务之间的调用。谢谢。
项目源码
https://github.com/jilinwula/jilinwula-springcloud-eureka.git
原文链接
http://jilinwula.com/article/24342