希望此时您看过配置页面以了解如何设置Eureka服务器。
Eureka Server交互的第一步是初始化Eureka客户端。如果您在AWS Cloud中运行,则可以通过以下方式初始化:
从版本1.1.153开始,引入了EurekaModule类,允许使用带有管理器/ guice的eureka-client。请参阅此受管制的示例。
在1.1.153版本之前,可以通过如下方式初始化Eureka Server:
DiscoveryManager.getInstance().initComponent(
new CloudInstanceConfig(),
new DefaultEurekaClientConfig());
如果您在其他数据中心中运行,则可以通过以下方式初始化:
DiscoveryManager.getInstance().initComponent(
new MyDataCenterInstanceConfig(),
new DefaultEurekaClientConfig());
Eureka客户端查找eureka-client.properties,如此处所述。
About Instance Statuses
默认情况下,Eureka客户端在STARTING状态下启动,这使得实例有机会进行应用程序的特定初始化,然后才能为流量提供服务。
然后,应用程序可以通过将实例状态转换为UP来明确地为流量设置实例。
ApplicationInfoManager.getInstance().setInstanceStatus(InstanceStatus.UP)
当实例状态更改为DOWN,应用程序还可以注册运行健康检查回调。
在Netflix,我们还使用OUT_OF_SERVICE状态,主要用于实例停止为流量服务。它用于在出现问题时轻松回滚部署新版本.大多数应用程序为新版本创建新的ASG,并且流量将路由到新的ASG。在出现问题的情况下,回滚修订版只需通过将ASG中的所有实例设置为OUT_OF_SERVICE来关闭流量。
Eureka Client Operations
Eureka客户端首先尝试与AWS云中相同区域中的Eureka Server进行所有操作,如果找不到服务器,则会将其失效转移(fail over)到其他区域。
应用程序客户端可以使用Eureka客户端返回的信息进行负载平衡。以下是使用Eureka客户端返回的信息对客户端进行负载平衡的应用程序示例。
InstanceInfo nextServerInfo = DiscoveryManager.getInstance()
.getDiscoveryClient()
.getNextServerFromEureka(vipAddress, false);
Socket s = new Socket();
int serverPort = nextServerInfo.getPort();
try {
s.connect(new InetSocketAddress(nextServerInfo.getHostName(),
serverPort));
} catch (IOException e) {
System.err.println("Could not connect to the server :"
+ nextServerInfo.getHostName() + " at port " + serverPort);
}
如果基本的轮询负载平衡不足以满足您的需求,您可以将负载均衡器包装在此处提供的API /operations之上。在AWS云中,请确保重试失败并保持较低的超时,因为Eureka服务器可能返回在中断情况下不再存在的实例。
值得注意的是,Eureka客户端会清除为服务器通信而创建的空闲超过30秒的HTTP连接。这是因为AWS防火墙限制不允许流量在几分钟的空闲时间后通过连接。
Eureka客户端通过以下方式与服务器交互。
Register
Eureka客户端将有关正在运行的实例的信息注册到Eureka服务器。在AWS云中,可以通过访问URL http://169.254.169.254/latest/metadata获取有关实例的信息。注册发生在第一次心跳(30秒后)。
Renew
Eureka客户需要每30秒发送一次心跳来续订租约。续订通知Eureka服务器该实例仍然存在。建议不要更改续订间隔,因为服务器使用该信息来确定客户端到服务器通信是否存在广泛的问题。
Fetch Registry
Eureka客户端从服务器获取注册表信息并在本地缓存它。之后,客户端使用该信息来查找其他服务。通过获取最近周期和当前周期之间的增量更新,定期(每30秒)更新此信息。增量信息在服务器中保持较长时间(大约3分钟),因此增量提取可能会再次返回相同的实例。
Eureka客户端自动处理重复信息。
获得增量后,Eureka客户端通过比较服务器返回的实例计数来协调与服务器的信息,如果由于某种原因信息不匹配,则再次获取整个注册表信息。Eureka服务器缓存增量的压缩有效负载-整个注册表以及每个应用程序以及相同的未压缩信息。有效负载还支持JSON / XML格式。 Eureka客户端使用jersey apache客户端从压缩的JSON格式获取信息。
Cancel
Eureka客户端在关机时向Eureka服务器发送取消请求。这将从服务器的实例注册表中删除实例,从而有效地使实例不再为流量工作。
这在Eureka客户端关闭时完成,应用程序应确保在关闭期间调用以下内容。
DiscoveryManager.getInstance().shutdownComponent()
Time Lag(滞后时间)
来自Eureka客户端的所有操作可能需要一些时间才能映射在Eureka服务器中以及随后的其他Eureka客户端中。这是因为eureka服务器上的有效负载缓存会定期刷新以映射新信息。Eureka客户还定期获取增量。因此,更新信息传到所有Eureka客户端可能需要2分钟。
Communication mechanism(交互机制)
默认情况下,Eureka客户端使用Jersey和Jackson以及JSON有效负载与Eureka Server进行通信。您可以通过覆盖默认机制来使用您选择的机制。请注意,对于某些遗留用例,XStream也是依赖关系图的一部分。