> For the complete documentation index, see [llms.txt](https://jun-wang.gitbook.io/learnjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jun-wang.gitbook.io/learnjava/ji-shu-xue-xi/spring/springcloud/springcloudeureka.md).

# SpringCloudEureka

Spring Cloud Eureka

Eureka主要负责完成微服务架构中的服务治理。强调了CAP原理中的AP，即可用性和可靠性，他与zookeeper这类强调CP（一致性和可靠性）的服务治理框架最大的区别就是Eureka为了实现更高的服务可用性，牺牲了一定的一致性。在极端情况下宁愿接受故障实例也不要丢掉“健康”实例，比如，当服务注册中心的网络发生故障断开时，由于所有的服务实例都无法维持续约心跳，在强调AP的服务治理中将会把所有服务实例都剔除掉，而Eureka则会因为超过85%的实例丢失心跳而出发保护机制，注册中心会保留此时的所有节点，以实现服务间可以进行相互调用的场景，即使其中有部分故障节点，但这样做可以继续保障大多数的服务正常消费。

## 核心模块

* 服务注册中心：负责服务的注册与发现
* 服务提供者：提供服务的应用，可以是Spring Boot应用，也可以是其他技术平台且遵循Eureka通信机制的应用
* 服务消费者：消费者从注册中心获取服务列表，并进行调用

## 疑问

1. Eureka服务之间的调用使用什么协议？

http协议，restful风格。

1. 服务提供者正常下线时会通过REST请求通知Rureka，Eureka服务端收到通知后，将服务状态置为下线（DOWN），并把下线事件广播出去，那么如何才算是正常下线呢？

首先在Eureka客户端增加配置`management.endpoint.shutdown.enabled=true` `management.endpoints.web.exposure.include=*`（默认关闭），来启用客户端的安全关闭机制，然后通过POST请求来正常下线：

```
curl -X POST ip:port/actuator/shutdown
```

> 参考：
>
> <https://blog.csdn.net/weixin_34055910/article/details/93768237>
>
> <https://blog.csdn.net/weixin_38003389/article/details/83241504>

1. 服务提供者如果不正常下线如何保证Eureka能正确剔除不可用服务呢？

Eureka服务端默认开启自我保护机制，就是当服务提供者异常时，会将实例注册信息保护起来，让这些实例不会过期，这项举措是为了应付在线上环境下可能会遇到网络暂时不好等但服务正常的情况下保证正常服务不会被下线。所以一般客户端有容错机制，比如通过断路器，请求重试等。在Eureka层面，可以将自我保护机制关闭`eureka.server.enable-self-preservation=false`来确保服务不可用时将其正确剔除。
