什么是Eureka?
Eureka是一个服务发现组件。所谓的服务发现就是将服务的调用者和被调用者者,都注册到一个第三方应用上。调用者在调用服务时可以清楚的知道被调用服务的状态。如果大家用过ZooKeeper就能很好的理解服务发现的原理。Eureka也如ZooKepper一般由service和client两部分组成。
Eureka-Clients
添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Client端代码
@RestController //Spring-Boot
@EnableEurekaClient //EurekaClient
@SpringBootApplication
public class EurekaClientApplication {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
我们在上述代码上用了@EnableEurekaClient这个注解,在Spring-Cloud除了这个注解还可以用@EnableDiscoveryClient。那么这两个注解有啥区别呢?@EnableEurekaClient表明这个是EurekaClient,@EnableDiscoveryClient则是标记一个服务发现客户端。这个可户端可以是ZK-Client,也可以EurekaClient
。
application配置
server:
</br>
port: 8080
</br>
spring:
</br>
application:
</br>
name: eureka-client-one #建议小写,eureka默认注册节点是会将应用名称大写。
</br>
eureka:
</br>
client:
</br>
serviceUrl:
</br>
defaultZone: http://localhost:8761/eureka
启动效果
Eureka-Service
添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
服务端代码
@EnableEurekaServer //EurekaServer
@SpringBootApplication
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class, args);
}
}
配置文件
server:
port: 8761
eureka:
instance:
#实例主机名#
hostname: localhost
client:
#是否需要多机拷贝#
register-with-eureka: false
fetch-registry: false
#本机服务地址#
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动后效果
重要参数解释
修改Instance-ID
我们在看上面实例状态时,状态栏给出的默认Instance-ID信息不是特别直观,我们有什么方式可以改呢?
eureka:
</br> instance:
</br> #开启地址显示
</br> prefer-ip-address: true
</br> instanceId:${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
#此修改要在Eureka-Client上修改
</br>
默认定义:
</br>
修改后效果:
Eureka开启安全验证和健康检查
安全验证
添加依赖
<!--添加在Eureka-Server-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
注意!如果不添加依赖直接进行配置项目启动时不报错的。
配置文件
security:
</br> #开启eureka权限控制
</br> basic:
</br> enabled: true
</br> #设定访问用户和密码
</br> user:
</br> name: user
</br> password: Pass123456
</br>#在Eureka-Server配置
注意!改完上述配置后Server和Client的下述配置都需要修改:
eureka:
</br> client:
</br> service-url:
</br> #此种风格是CURL的配置模式
</br> defaultZone: http://user:Pass123456@localhost:8761/eureka
配置效果
健康检查配置
添加依赖
<!--添加在Eureka-Client-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
添加配置
eureka:
</br> client:
</br> healthcheck:
</br> enabled: true
注意事项
老版本的Spring-Cloud配置完以上的就可以,访问一些healthcheck的接口了。如果你访问/env等路路径出现:
需要做以下配置:
management:
</br> security:
</br> enabled: false
配置效果
其他相关配置
剔除过期等不健康实例(生产环境不建议使用)
</br>服务端:
#关闭注册中心自我保护机制
</br> eureka:
</br> server:
</br> enable-self-preservation:false
</br> #注册中心清理间隔(单位毫秒,默认60*1000)
</br> eureka:
</br> server:
</br> eviction-interval-timer-in-ms:10000
</br>客户端:
#租期更新时间间隔(默认30秒)
</br> eureka:
</br> instance:
</br> lease-renewal-interval-in-seconds=10
</br> #租期到期时间(默认90秒)
</br> eureka:
</br> instance:
</br> lease-expiration-duration-in-seconds=15
Eureka的自我保护模式
如果在Eureka Server的首页看到以下这段提示,则说明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.
一般出现此模式时,服务返回错误。即如果真实的服务已经Down掉,但在注册中心界面服务却一直存在,且显示为UP状态。
产生原因
Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。
EurekaClient端代码获取实例信息
@Autowired
private EurekaClient discoveryClient;
public String serviceUrl() {
InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);
return instance.getHomePageUrl();
}
Netflix-EurekaClient端代码获取实例信息
@Autowired
private EurekaClient discoveryClient;
public String serviceUrl() {
InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);
return instance.getHomePageUrl();
}
不要在@PostConstruct方法或@Scheduled方法中(或ApplicationContext可能尚未启动的任何地方)使用EurekaClient。
客户端常用配置,均以eureka.client为前缀####
<table>
<thead>
<tr>
<th>参数名</th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody><tr>
<td>enabled</td>
<td>启用Eureka客户端</td>
<td>true</td>
</tr>
<tr>
<td>registryFetchIntervalSeconds</td>
<td>从Eureka服务端获取注册信息的间隔时间,单位为秒</td>
<td>30</td>
</tr>
<tr>
<td>instanceInfoReplicationIntervalSeconds</td>
<td>更新实例信息的变化到Eureka服务端的间隔时间,单位为秒</td>
<td>30</td>
</tr>
<tr>
<td>initialInstanceInfoReplicationIntervalSeconds</td>
<td>初始化实例信息到Eureka服务端的间隔时间,单位为秒</td>
<td>40</td>
</tr>
<tr>
<td>eurekaServiceUrlPollIntervalSeconds</td>
<td>轮询Eureka服务端地址更改的间隔时间,单位为秒。当我们与Spring CLoud Config整合,动态刷新Eureka的serviceURL地址时需要关注该参数</td>
<td>300</td>
</tr>
<tr>
<td>eurekaServerReadTimeoutSeconds</td>
<td>读取Eureka Server信息的超时时间,单位为秒</td>
<td>8</td>
</tr>
<tr>
<td>eurekaServerConnectTimeoutSeconds</td>
<td>链接Eureka Server的超时时间,单位为秒</td>
<td>5</td>
</tr>
<tr>
<td>eurekaServerTotalConnections</td>
<td>从Eureka客户端到所有Eureka服务端的连接总数</td>
<td>200</td>
</tr>
<tr>
<td>eurekaServerTotalConnectionsPerHost</td>
<td>从Eureka客户端到每个Eureka服务端主机的连接总数</td>
<td>50</td>
</tr>
<tr>
<td>eurekaConnectionIdleTimeoutSeconds</td>
<td>Eureka服务端连接的空闲关闭时间,单位为秒</td>
<td>30</td>
</tr>
<tr>
<td>heartbeatExecutorThreadPoolSize</td>
<td>心跳连接池的初始化线程数</td>
<td>2</td>
</tr>
<tr>
<td>heartbeatExecutorExponentialBackOffBound</td>
<td>心跳超时重试延迟时间的最大乘数值</td>
<td>10</td>
</tr>
<tr>
<td>cacheRefreshExecutorThreadPoolSize</td>
<td>缓存刷新线程池的初始化线程数</td>
<td>2</td>
</tr>
<tr>
<td>cacheRefreshExecutorExponentialBackOffBound</td>
<td>缓存刷新重试延迟时间的最大乘数值</td>
<td>10</td>
</tr>
<tr>
<td>useDnsForFetchingServiceUrls</td>
<td>使用DNS来获取Eureka服务端的serviceUrl</td>
<td>false</td>
</tr>
<tr>
<td>registerWithEureka</td>
<td>是否要将自身的实例信息注册到Eureka服务端 true</td>
<td></td>
</tr>
<tr>
<td>preferSameZoneEureka</td>
<td>是否偏好使用处于相同Zone的Eureka服务端 true</td>
<td></td>
</tr>
<tr>
<td>filterOnlyUpInstances</td>
<td>获取实例时是否过滤,仅保留UP状态的实例</td>
<td>true</td>
</tr>
<tr>
<td>fetchRegistry</td>
<td>是否从Eureka服务端获取注册信息</td>
<td>true</td>
</tr>
<tr>
<td>serviceUrl</td>
<td>指定注册中心</td>
<td>http://:@localhost:1111/eureka</td>
</tr>
</tbody></table>
本文参考:Spring-Cloud-Eureka-DOC
,springboot-actuator监控的401,Eureka客户端服务端配置