What is Eureka?
eureka基于REST,在aws云上定位服务,目的是负载均衡和中间服务的故障转移
云上的服务端为eureka server
Eureka Client,基于java,用于和server交互,内建了负载均衡器用来做循环负载均衡
What is the need for Eureka?需要eureka解决什么问题
传统的负载均衡器工作在一个ip地址和主机名固定的服务器上,但aws云上,服务不固定,
负载均衡器需要更复杂的负载均衡能力,实现服务在云上的注册及注销
AWS从未提供过中间层上的负载均衡器,eureka填补了这个空白
How is Eureka used at Netflix?
在Netflix, Eureka除了在中间层负载平衡中扮演关键角色外,还用于以下用途。
- 使用Netflix Asgard进行红/黑部署——这是一种开源服务,可以简化云部署。Eureka与Asgard进行交互,使服务部署的新旧版本之间的切换在出现问题的情况下变得快速和无缝,特别是在启动100个实例来部署一个版本可能需要很长时间的情况下。
- 让我们的cassandra部署从通信流中取出实例进行维护。
- 对于我们的memcached缓存服务来标识环中的节点列表。
- 由于各种其他原因,用于承载关于服务的其他特定于应用程序的其他元数据。将实例从通信流中取出进行维护。
How does the application client and application server communicate?
eureka帮你找到要连接的服务的信息,且不在协议或方法上做任何限制.
你可以从eureka上获取服务地址,并使用thrift, http(s) 或任何其他 RPC 机制的协议.
eureka部署结构
每个region有一个eureka集群,该集群只可见本region的实例.
每个zone至少有一个eureka server来处理zone错误
服务注册到eureka,每隔30秒发送心跳以续约.如果client一段时间内不再续约,90秒后它会被移除.
注册信息和续约情况会被复制给所有集群中的eureka节点
任何zone的client都可以查找到server的注册信息并进行远程调用
非java server和client
非java的服务,可以用本语言实现一个client,或者运行一个side car
side car本质上是一个java应用,嵌入了eureka client用于注册和发送心跳
eureka client也通过REST端口实现了所有支持的操作,非java cient可以通过REST端口查询其他服务的信息
Eureka REST 操作
appID是应用的名称,instanceID是与实例关联的唯一id,content types必须是application/xml
或application/json
.
接口说明
- 注册应用
{
method:post,
url:/eureka/apps/{appID},
body:{
},
response:{
200:success
}
}
- 注销应用
{
method:DELETE,
url:/eureka/apps/{appID}/{instanceID},
body:{
},
response:{
200:success,
500:failure
}
}
- 发送心跳
{
method:PUT,
url:/eureka/apps/{appID}/{instanceID},
body:{
},
responseCode:{
200:success,
404:instanceID不存在,
500:failure
}
}
- 查询应用
{
method:GET,
url:/eureka/apps/[{appID}]/[{instanceID}],
responseCode:{
200:success
},
responseBody:{
}
}
- 根据instanceId查询应用
{
method:GET,
url: /eureka/instances/{instanceID},
responseCode:{
200:success
},
responseBody:{
}
}
- 覆写应用
{
method:DELETE,
url: /eureka/apps/{appID}/{instanceID}/status[?value=UP],// value=UP是什么意思
responseCode:{
200:success
500:failure
}
}
- 更新元信息
{
method:PUT,
url: /eureka/apps/{appID}/{instanceID}/metadata?{key}={value}
responseCode:{
200:success
500:failure
}
}
- 根据vipAddress查询应用
{
method:GET,
url: /eureka/vips/{vipAddress}
responseCode:{
200:success
404:vipAddress不存在
},
responseBody:{
}
}
- 根据secureVipAddress查询应用
{
method:GET,
url: /eureka/svips/{svipAddress}
responseCode:{
200:success
404:svipAddress不存在
},
responseBody:{
}
}