新闻资讯
SpringCloud基础教程-Eureka进阶
一、Eureka的健康检查
在不添加任何配置的情况下,Eureka注册中心和服务之间是通过心跳机制来监测的,如果心跳正常,那么代表服务是可以用的。但是实际上不是这样。我们开发的微服务组件,大多数都会依赖缓存Redis、搜素引擎Solr等等外部的资源。如果这些资源不能提供应用,虽然服务组件能与Eureka正常的保持心跳,但是在这样的情况下,服务的调用就不能获得预期的效果。在这里,我们可以通过配置Eureka的健康检查,将服务组件的状态同步到Eureka中心。
在开发的微服务组件中,修改application.xml 开启健康检查,默认是false,依赖心跳,这里修改成true,
eureka:
client:
healthcheck:
enabled: true复制代码
并在pom.xml中添加actuator依赖(如果不添加,是不起作用的):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>复制代码
Eureka中的实例包含了多种状态:UP、DOWN、STARTING、OUTOFSERVICE、UNKNOWN.这里我们可以自定义的实现 org.springframework.boot.actuate.health.HealthIndicator 接口。通过HTTP接口手动的修改服务组件的状态,并同步到Eureka.(在实际的应用中,例如缓存宕机,就可以改变当前的服务组件的健康状态)。
新建SelfHealthChecker的组件实现HealthIndicator接口,创建Health对象,当前服务的健康状态随着health的之变化而变化。
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class SelfHealthChecker implements HealthIndicator {
private boolean health = true;
@Override
public Health health() {
if (health) {
return new Health.Builder()
.withDetail("a", 10).withDetail("b", "up").up().build();
} else {
return new Health.Builder()
.withDetail("error", "client is down").down().build();
}
}
public boolean isHealth() {
return health;
}
public void setHealth(boolean health) {
this.health = health;
}
} 复制代码
新建控制器,注入自定义的健康检查组件,可以通过HTTP接口调用的方式,改变当前的微服务组件的健康状态:
这个时候,再去查看Eureka的监控页面,就可以看到服务提供方的状态发生了变化:
这里我们是可以根据自己的场景进行操作的
二、 Eureka高可用集群
如果是本机搭建,首先在host文件中,配置如下的映射(如果不配置,而是使用localhost,那么服务注册的时候只能注册到一个Eureka实例中,原因是eureka对localhost做了过滤。)
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com复制代码
分别启动3个eureka实例,并在每个实例的配置中配置其他可用的实例URL,如下
appcaiton-s1.xml
#eureka 服务端
spring:
application:
name: eureka-server
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #服务端的实例名称
client:
service-url:
# 设置与注册中心交互的url ,
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
#false表示自己就是服务中细腻
fetch-registry: false
#注册自己到注册中心
register-with-eureka: true
healthcheck:
enabled: false 复制代码
appcaiton-s2.xml
#eureka 服务端
spring:
application:
name: eureka-server
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #服务端的实例名称
client:
service-url:
# 设置与注册中心交互的url ,
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/
#false表示自己就是服务中细腻
fetch-registry: false
#注册自己到注册中心
register-with-eureka: true
healthcheck:
enabled: false 复制代码
appcaiton-s3.xml
#eureka 服务端
spring:
application:
name: eureka-server
server:
port: 7003
eureka:
instance:
hostname: eureka7003.com #服务端的实例名称
client:
service-url:
# 设置与注册中心交互的url ,
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
#false表示自己就是服务中细腻
fetch-registry: false
#注册自己到注册中心
register-with-eureka: true
healthcheck:
enabled: false 复制代码
打开eureka任何一个示例的监控中心,可以看到,每个eureka将自己也注册到了集群中了。
服务注册:分别将服务提供方和服务调用方启动,注册到eureka集群中,例如服务提供方的配置文件applicaiton.yml配置如下:配置的eureka示例只要配置集群任何一个eureka示例就可以了
#服务提供方
spring:
application:
name: server-provider
server:
port: 9001
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称
client:
service-url:
# 与注册中心交互的url
defaultZone: http://eureka7002.com:7002/eureka/
enabled: true 复制代码
通过集群监控面板可以看到如下的信息。这个时候,服务调用方就可以调用服务提供方接口了,就算eureka实例宕机一台,也不影响服务的调用。
三、自我保护模式
eureka在设计时候充分考虑到了分布式环境网络的不可靠。因为网络的原因会导致eureka的server没有收到心跳,但是并不能说明eureka是宕机了。所以Eureka Server默认会打开保护模式。
一旦进入保护模式,eureka不是删除里面的服务注册列表数据,即不会立刻注销任何微服务。服务调用者任然尝试调用服务提供者。如果调用失败,则会使用熔断模式。当网络故障恢复后,eureka会自动的退出自我保护模式。
修改配置的yml,打开或者关闭注册中心的为我保护模式,false代表关闭。
eureka:
server:
enable-self-preservation: false复制代码
四、其他配置
eureka默认的服务名称是
${spring.cloud.client.hostname}:${spring.application.name}:${spring.applicaiton.instance_id}:${port}:复制代码
这里我们可以直接修改,修改成如下图
eureka:
instance:
instance-id: P1复制代码
自定义Eureka的控制台服务链接
Eureka首页显示服务调用的地址默认是 http:hostName:port/
可以通过配置
eureka:
instance:
prefer-ip-address: true #设置服务调用IP为先复制代码
回复列表