以下是java启动命令的语法说明:
(官方文档说明)
java.util.concurrent.Executor
, java.util.concurrent.ExecutorService
, java.util.concurrent.Executors
这三者均是 Java Executor 框架的一部分,用来提供线程池的功能。因为创建和管理线程非常心累,并且操作系统通常对线程数有限制,所以建议使用线程池来并发执行任务,而不是每次请求进来时创建一个线程。使用线程池不仅可以提高应用的响应时间,还可以避免"java.lang.OutOfMemoryError: unable to create new native thread"
之类的错误。
在 Java 1.5 时,开发者需要关心线程池的创建和管理,但在 Java 1.5 之后 Executor 框架提供了多种内置的线程池,例如:FixedThreadPool
(包含固定数目的线程),CachedThreadPool
(可根据需要创建新的线程)等等。
Eureka client尝试去和相同zone的Eureka Server通信。如果相同zone的server不存在或者通信有问题,client就会转到其他zone的server。
一旦服务器开始接收流量,在服务器上执行的所有操作都将被复制到服务器所知道的所有对等节点。如果某个操作由于某种原因而失败,那么该信息将在服务器之间下一次心跳时核对后复制。
当Eureka server恢复,它尝试从邻居节点获取所有实例的注册信息。如果从一个节点获取信息存在问题,在它放弃之前,它将尝试所有的对等节点。如果Eureka server能够成功获取所有实例信息,则会根据该信息设置应该接收的“续约”阈值。如果任何时候,“续约”低于设置的该阈值百分比(在15分钟内低于85%),Eureka server停止过期实例来保护当前实例的注册信息。
在Neflix,上面的保护称为“自我保护”模式,主要用在一组client和Eureka server之间存在网络分区的情况下的保护。在这种场景下,Eureka server尝试去保护已经拥有的信息。如果发生大规模的故障,在这种情况下,可能会导致client获得已经不存在的实例。client必须确保它们对于返回不存在或不响应的实例的Eureka server具有弹性。在这些情况下,最好的保护是快速超时并尝试其他服务器。
在这种情况下,如果Eureka server无法从邻居节点获取注册表信息,则会等待几分钟(5分钟),以便客户端可以注册其信息。server尽量不提供部分信息给client,而是通过将流量倾斜到仅一组实例并会导致容量问题。
如此处所述,Eureka server使用在Eureka client和server之间使用的相同机制相互通信。