服务注册中心eureka
首先引入的依赖 版本跟随springboot
## spring cloud
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
## eureka-server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
启动添加注解@EnableEurekaServer
来作为服务注册主机启动
配置文件,这里使用properties文件
server.port=8763
## eureka实例名称
eureka.instance.hostname=localhost
## 多个注册中心相互注册 客户端也使用这个参数来配置
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
客户端连接时
添加注解@EnableEurekaClient
作为客户端注册
用户认证
##开启用户校验
security.basic.enabled=true
## 用户
spring.security.user.name=admin
## 密码
spring.security.user.password=admin
客户端再注册时需要加上用户名和密码,如http://admin:admin@localhost:8761/eureka/
如果客户端无法连上eureka,可能时需要关闭csrd校验问题
服务续约保活
客户端和eureka进行心跳来检查客户端的存活情况;
有关续约保活的配置
客户端配置
# 服务续约,心跳的时间间隔
eureka.instance.lease-renewal-interval-in-seconds=30
# 如果从前一次发送心跳时间起, 90 秒没接受到新的心跳,将剔除服务
eureka.instance.lease-expiration-duration-in-seconds=90
# 表示 eureka client 间隔多久去拉取服务注册信息,默认为 30 秒
eureka.client.registry-fetch-interval-seconds=30
服务端配置
# 自我保护模式,当出现出现网络分区、 eureka 在短时间内丢失过多客户端时,会进入自我保护模式,即一个服务长时间没有发送心跳, eureka 也不会将其删除,默认为 true
eureka.server.enable-self-preservation=true
# Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85% ,如果低于 85% , Eureka Server 会将这些实例保护起来
eureka.server.renewal-percent-threshold=0.85
# eureka server 清理无效节点的时间间隔,默认 60000 毫秒,即 60 秒
eureka.server.eviction-interval-timer-in-ms=60000
如上,并不是一次心跳失败就会想客户端下线为down,而是持续一段时间失败,才会正式下线
Eureka 健康检测
Eureka 默认的健康检测只是你校验服务连接是否是 UP 还是 DOWN 的,然后客户端只会调用状态为 UP 状态的服务,但是有的情况下,虽然应用服务连接正常,但是有可能这个服务的某些接口不是正常的,可比如 Redis,mongodb 或者 DB 有问题导致接口调用失败,所以理论上服务虽然能够正常调用,但是它不是一个健康的服务。所以我们就有必要对这种情况做自定义健康检测。
客户端通过下面配置开启
eureka.client.healthcheck.enabled=true
并通过实现HealthIndicator
接口,比如如下示例,maven依赖spring-boot-starter-actuator
import com.xiangxue.jack.controller.UserController;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.actuate.health.Status;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MicroWebHealthIndicator implements HealthIndicator {
@Override
public Health health() {
//这个状态就是数据库是否连接OK
if(DbUtils.isOk()) {
return new Health.Builder(Status.UP).build();
} else {
return new Health.Builder(Status.DOWN).build();
}
}
}
这里的健康检查也是会根据前面续约保活的配置来延时跟新状态,
服务下线
eureka有提供手动下线的请求,使用delete的http请求
http://{hostname}:{port}/eureka/apps/{服务名称}/{服务实例名}
由于前面的保活续约机制,不能立即下线服务,可以通过上述方式调用来立即下线服务,但是客户端还是不一定会更新成最新的,前面有配置客户端拉取最新服务列表的参数
高可用eureka
高可用情况下会配置多个注册中心,多个eureka服务为复制集
配置时注意,服务端
#是否注册到eureka,相互注册
eureka.client.registerWithEureka=true
#是否从eureka中拉取注册信息,相互复制
eureka.client.fetchRegistry=true
##暴露eureka服务的地址 对方
eureka.client.serviceUrl.defaultZone=http://admin:admin@Eureka8762.com:8762/eureka/
客户端通过逗号分隔来配置多个
eureka.client.serviceUrl.defaultZone=http://admin:admin@localhost:8761/eureka/,http://admin:admin@localhost:8762/eureka/