bapinggaitianli 2019-10-26
Eureka REST APIEureka 作为注册中心,其本质是存储了每个客户端的注册信息,Ribbon 在转发的时候会获取注册中心的服务列表,然后根据对应的路由规则来选择一个服务给 Feign 来进行调用。
如果我们不是Spring Cloud 技术选型,也想用 Eureka,可以吗?完全可以。
如果不是 Spring Cloud 技术栈,推荐用 Zookeeper,这样会方便些,当然用 Eureka 也是可以的,这样的话就会涉及如何注册信息、如何获取注册信息等操作。其实 Eureka 也考虑到了这点,提供了很多 REST 接口API 来给我们调用。http://localhost:8761/eureka/apps/eureka中的服务名
如果想返回 Json数据的格式,可以用一些接口测试工具来请求,比如 Postman,在请求头中添加代码Content-Type:application/json Accept:application/json
即可。
如果 Eureka 开启了认证,记得添加认证信息,用户名和密码必须是 Base64 编码过的 Authorization:Basic 用户名:密码,其余的接口就不做过多讲解了,大家可以自己去尝试。Postman 直接支持了 Basic 认证,将选项从 Headers 切换到 Authorization,选择认证方式为 Basic Auth 就可以填写用户信息了。
元数据使用Eureka 的元数据有两种类型,分别是框架定好了的标准元数据和用户自定义元数据。标准元数据指的是主机名、IP 地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。自定义元数据可以使用 eureka.instance.metadataMap 进行配置。
在配置文件中添加
eureka: instance: metadata-map: port: ${server.port} user: yucai applicationName: ${spring.application.name}
可以看到
@GetMapping("/getApiInfo") public Object getApiInfo(){ return eurekaClient.getInstancesByVipAddress("MYEUREKA-SERVICE", false); }
postman中调用一下,可以获取到如下信息
import org.springframework.cloud.client.discovery.DiscoveryClient; ... @GetMapping("/getApiInfoByDiscoveryClient") public Object getApiInfoByDiscoveryClient() { return discoveryClient.getInstances("MYEUREKA-SERVICE"); }
postman中调用一下,可以获取到如下信息
健康检查默认情况下,Eureka 客户端是使用心跳和服务端通信来判断客户端是否存活,在某些场景下,比如 MongoDB 出现了异常,但你的应用进程还是存在的,这就意味着应用可以继续通过心跳上报,保持应用自己的信息在 Eureka 中不被剔除掉。
Spring Boot Actuator 提供了 /actuator/health 端点,该端点可展示应用程序的健康信息,当 MongoDB 异常时,/actuator/health 端点的状态会变成 DOWN,由于应用本身确实处于存活状态,但是 MongoDB 的异常会影响某些功能,当请求到达应用之后会发生操作失败的情况。
在这种情况下,我们希望可以将健康信息传递给 Eureka 服务端。这样 Eureka 中就能及时将应用的实例信息下线,隔离正常请求,防止出错。
代码中添加配置
eureka: healthcheck: enabled: true
模拟异常情况:定义一个扩展端点,将状态设置为 DOWN
import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.Health.Builder; import org.springframework.stereotype.Component; @Component public class CustomHealthIndicator extends AbstractHealthIndicator { @Override protected void doHealthCheck(Builder builder) throws Exception { builder.down().withDetail("status", false); } }
可以看到我们的服务状态就是down了
服务上下线监控在某些特定的需求下,我们需要对服务的上下线进行监控,上线或下线都进行邮件通知,Eureka 中提供了事件监听的方式来扩展。
目前支持的事件如下:
eureka-server中添加
@Component public class EurekaStateChangeListener { @EventListener public void listen(EurekaInstanceCanceledEvent event) { System.err.println(event.getServerId() + "\t" + event.getAppName() + " 服务下线 "); } @EventListener public void listen(EurekaInstanceRegisteredEvent event) { InstanceInfo instanceInfo = event.getInstanceInfo(); System.err.println(instanceInfo.getAppName() + " 进行注册 "); } @EventListener public void listen(EurekaInstanceRenewedEvent event) { System.err.println(event.getServerId() + "\t" + event.getAppName() + " 服务进行续约 "); } @EventListener public void listen(EurekaRegistryAvailableEvent event) { System.err.println(" 注册中心启动 "); } @EventListener public void listen(EurekaServerStartedEvent event) { System.err.println("Eureka Server启动 "); } }
注意:在 Eureka 集群环境下,每个节点都会触发事件,这个时候需要控制下发送通知的行为,不控制的话每个节点都会发送通知。