Eureka简单搭建
新建一个SpringBoot项目
在pom.xml中添加Eureka依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
在application.properites中添加
server.port=8900
# 下面这个两个配置表示不把自己当做客服端
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
或者在applicatioon.yml中添加
server:
port: 8900
eureka:
client:
# 下面这个两个配置表示不把自己当做客服端
register-with-eureka: false
fetch-registry: false
在启动类上添加@EnableEurekaServer注解,如下
@EnableEurekaServer
@SpringBootApplication
public class DemoEurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(DemoEurekaServerApplication.class, args);
}
}
运行启动类之后打开http://localhost:8900/,打开成功则Eureka搭建成功
Eureka与CAP
不支持C,每个Eureka服务有三个缓存,数据同步有时间间隔,最差情况下,服务列表在30秒内不一致。
支持A,在Eureka集群中每个节点都是平等的,只要存在一个节点,就能保证注册服务可用性
支持P,因为有定时踢出和自我保护,即使Client没有续约上,其他Client也能从Server拉取到注册表信息
Eurekad的三级缓存
Eurekad的三级缓存分别是register,readWrtiteCacheMap,readOnlyCacheMap
源码中三个缓存分别使用的数据类型:
private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry
= new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();
private final ConcurrentMap<Key, Value> readOnlyCacheMap = new ConcurrentHashMap<Key, Value>();
private final LoadingCache<Key, Value> readWriteCacheMap;
流程关系是当有服务注册进来时,会先注册到registry,同时如果readWrtiteCacheMap存在该服务,则让其失效。readOnlyCacheMap在于readWrtiteCacheMap定时同步,客户端拉取服务时默认先从readOnlyCacheMap取,如果没有再从readWrtiteCacheMap取,所以可以修改这个默认配置直接从readWrtiteCacheMap取
Eureka拉取实例信息的过程
客户端第一次全量拉取+后续增量拉取
eureka集群available-replicas不为空
Eureka处理available-replicas和unavailable-replicas信息的源码:
private boolean isReplicaAvailable(String url) {
try {
/**
需要将以下配置设置为true
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
**/
Application app = registry.getApplication(myAppName, false);
if (app == null) {
return false;
}
for (InstanceInfo info : app.getInstances()) {
// 服务之间注册和接收到的地址要一致
if (peerEurekaNodes.isInstanceURL(url, info)) {
return true;
}
}
} catch (Throwable e) {
logger.error("Could not determine if the replica is available ", e);
}
return false;
}
Server优化
eureka:
server:
# 每 6 秒会检测失效的服务,也就是如果有服务超过 6 秒没有向Eureka Server 发起 Renew 请求的话,就会被当做失效服务剔除掉
eviction-interval-timer-in-ms: 6000
# 自我保护,服务较少的情况下关掉,服务较多的情况下可以开启,因为服务较多的情况下可能出现网络波动导致服务没有续约上
enable-self-preservation: false
# 自我保护阈值,默认0.85,表示如果有100个服务掉了15个服务就会开启自我保护,后面没收到心跳包的Client不会被踢出
renewal-percent-threshold: 0.85
# 关闭从readOnly读注册表
use-read-only-response-cache: false
Client优化
eureka:
client:
service-url:
# 向Eureka Server的注册地址,在集群情况下需要将注册地址打乱,不然压力都会在第一个地址的服务器下
defaultZone: http://localhost:8000/eureka
# 刷新注册表( 拉取注册表 )间隔,默认30秒
registry-fetch-interval-seconds: 5
instance:
# 心跳续约间隔
lease-renewal-interval-in-seconds: 10
# 心跳过期时间
lease-expiration-duration-in-seconds: 10