首先创建一个基于Spring boot的工程,命名为eureka-server,并在pom.xml中引入必要的内容:
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-test
test
通过@EnableEurekaServer注解启动一个服务注册中心给其它服务,这一步非常的简单,只需要在一个基础的spring boot 项目主类中添加注解就可以开启,如下:
package com.eureka.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
默认情况下该服务注册中心会将自己作为客户端注册自己,所以我们需要禁用它的客户端行为,只需要在application.properties配置文件中做如下配置:
server.port=9001
eureka.instance.hostname=localhost
#是否将自己注册为服务(不向注册中心注册自己)
eureka.client.register-with-eureka=false
#禁止向注册中心检索服务
eureka.client.fetch-registry=false
#服务地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
#是否关闭自我保护机制
eureka.server.enable-self-preservation=true
在完成上面的配置后,启动应用并访问http://localhost:9001/,可以看到如下图中的Eureka信息面板,其中Instances currently registered with Eureka信息栏为空,说明还没用注册任何服务。
在完成注册中心的搭建后,我们创建一个基础的spring boot应用eureka-client,在pom.xml中添加服务依赖。
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-test
test
在启动类上添加@EnableEurekaClient注解激活Eureka中的DiscoveryClient实现:
package com.eureka.client;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
最后我们需要在application.properties中添加spring.application.name来为服务命名,通过eureka.client.service-url.defaultZone来指定注册中心的地址,完整配置如下:
spring.application.name=service-test
eureka.client.service-url.defaultZone=http://localhost:9001/eureka
启动eureka-client服务,我们可以通过控制台看到服务成功的注册:
2018-12-18 20:07:12.403 INFO 7352 --- [ main] com.netflix.discovery.DiscoveryClient : Discovery Client initialized at timestamp 1545134832291 with initial instances count: 0
2018-12-18 20:07:12.407 INFO 7352 --- [ main] o.s.c.n.e.s.EurekaServiceRegistry : Registering application SERVICE-TEST with eureka with status UP
2018-12-18 20:07:12.408 INFO 7352 --- [ main] com.netflix.discovery.DiscoveryClient : Saw local status change event StatusChangeEvent [timestamp=1545134832408, current=UP, previous=STARTING]
2018-12-18 20:07:12.455 INFO 7352 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_SERVICE-TEST/yaomingyang-bjb.go-goal.com:service-test: registering service...
2018-12-18 20:07:12.514 INFO 7352 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2018-12-18 20:07:12.524 INFO 7352 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8080
2018-12-18 20:07:12.527 INFO 7352 --- [ main] c.eureka.client.EurekaClientApplication : Started EurekaClientApplication in 6.747 seconds (JVM running for 7.312)
2018-12-18 20:07:12.879 INFO 7352 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_SERVICE-TEST/yaomingyang-bjb.go-goal.com:service-test - registration status: 204
也可以通过Eureka的信息面板Instances currently registered with Eureka一栏中看到服务的注册信息。
当我们在本地调试Eureka单机模式程序时,经常会遇到如下问题,在服务注册中心的信息面板上会出现 如下警告信息:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
实际上上面的警告就是触发了Eureka Server的自我保护机制;服务注册到Eureka Server注册中心后会维护一个心跳连接,告诉Eureka Server注册中心我还活着。Eureka Server注册中心会统计心跳失败的比例在在15分钟内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境中通常由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,让这些实例不会过期,尽可能保护这心注册信息。但是, 在这段保护期间内实例若出现问题, 那么客户端很容易拿到实际已经不存在的服务实例, 会出现调用失败的清况, 所以客户端必须要有容错机制, 比如可以使用请求重试、断路器等机制。
由于本地调试很容易触发注册中心的保护机制, 这会使得注册中心维护的服务实例不那么准确。所以, 我们在本地进行开发的时候, 可以使用eureka.server.enable-self-preservation=false 参数来关闭保护机制, 以确保注册中心可以将不可用的实例正确剔除。