SpringCloud学习心得—1.3—Eureka与REST API

SpringCloud学习心得—1.3—Eureka与REST API


Eureka的REST API接口

API的基本访问

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 就可以填写用户信息了。

API返回值中添加元数据metadata

元数据使用Eureka 的元数据有两种类型,分别是框架定好了的标准元数据和用户自定义元数据。标准元数据指的是主机名、IP 地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。自定义元数据可以使用 eureka.instance.metadataMap 进行配置。
在配置文件中添加

eureka:
    instance:
        metadata-map:
            port: ${server.port}
            user: yucai
            applicationName: ${spring.application.name}

可以看到

集成Eureka后获取数据

  1. 使用EurekaClient
    在我们的eureka-ervice中,简单获取一下信息,

    @GetMapping("/getApiInfo")
    public Object getApiInfo(){
        return eurekaClient.getInstancesByVipAddress("MYEUREKA-SERVICE", false);
    }

    postman中调用一下,可以获取到如下信息

  2. 使用DiscoveryClient
    在我们的eureka-ervice中,简单获取一下信息,

    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 中提供了事件监听的方式来扩展。

Euraka事件监听

目前支持的事件如下:

  1. EurekaInstanceCanceledEvent 服务下线事件。
  2. EurekaInstanceRegisteredEvent 服务注册事件。
  3. EurekaInstanceRenewedEvent 服务续约事件。
  4. EurekaRegistryAvailableEvent Eureka 注册中心启动事件。
  5. EurekaServerStartedEvent Eureka Server 启动事件。

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 集群环境下,每个节点都会触发事件,这个时候需要控制下发送通知的行为,不控制的话每个节点都会发送通知。

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

原文地址:https://www.cnblogs.com/pipicai96/p/11743119.html

时间: 2024-10-10 01:16:27

SpringCloud学习心得—1.3—Eureka与REST API的相关文章

SpringCloud学习心得—1.2—Eureka注册中心的密码认证、高可用的设置

SpringCloud学习心得—1.2—Eureka注册中心的密码认证.高可用的设置 这是相关代码 链接 Eureka开启密码配置 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> 向properties添加密码与用户名 spr

SpringCloud学习心得

SpringCloud 介绍 SpringCloud为开发人员提供了快速构建分布式系统的常用工具,包括配置管理.服务发现.服务熔断.智能路由.总线.鉴权等.SpringCloud基于SpringBoot实现微服务架构,它是Java项目从单体应用架构向微服务架构变迁的主流选择之一. 特性 (1) 分布式/版本化配置 (2) 服务注册和发现 (3) 路由 (4) service - to - service 调用 (5) 负载均衡 (6) 断路器 (7) 分布式消息传递 打比方 单体应用:个人开发者

SpringCloud学习第四章-Eureka创建

注:因为有了父项目,所以不需要引入boot的jar,项目都是maven构建 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLoca

SpringCloud学习系列之一 ----- 搭建一个高可用的注册中心(Eureka)

前言 本篇主要介绍的是SpringCloud相关知识.微服务架构以及搭建一个高可用的服务注册与发现的服务模块(Eureka). SpringCloud介绍 Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集,为开发人员提供快速建立分布式系统中的一些常见的模式. 例如: 配置管理(configuration management),服务发现(servicediscovery),断路器(circuit breakers),智能路由( intelligen

SpringCloud学习之Ribbon

一.负载均衡与Ribbon 负载均衡,在集群中是很常见的一个“名词”,顾名思义是根据一定的算法将请求分摊至对应的服务节点上,常见的算法有如下几种: 轮询法:所有请求被依次分发到每台应用服务器上,每台服务器需要处理的请求数目都相同,适合所有服务器硬件都相同的场景 随机法:请求被随机分配到各个应用服务器,在许多场合下,这种方案都很简单实用. 源地址哈希(Hash)法:将请求来源的IP地址进行Hash计算,得到对应的服务器,这样来自同一个IP的请求总在同一个服务器上处理 加权法:根据应用服务器配置的情

SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由网关的过滤器Filter以及异常处理的教程. SpringCloud Zuul Filter 介绍 过滤器概述 Zuul的中心是一系列过滤器,能够在HTTP请求和响应的路由过程中执行一系列操作. 以下是Zuul过滤器的主要特征: 类型:通常在应用过滤器时在路由流程中定义阶段(尽管它可以是任何自定义字

SpringCloud学习系列之三----- 断路器Hystrix和断路器监控Dashboar

前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netflix创建了一个名为Hystrix的库,它实现了断路器模式.主要的目的是为了解决服务雪崩效应的一个组件,是保护服务高可用的最后一道防线. 开发准备 开发环境 JDK:1.8 SpringBoot:2.1.1.RELEASE SpringCloud:Finchley 注:不一定非要用上述的版本,可以根据

Linux系统理解以及Linux系统学习心得

原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 说一下我对Linux系统的理解 1.加载Linux内核准备:在加载基本输入输出模块(BIOS)之后,从磁盘的引导扇区读入操作系统的代码文件块到内存中,之后开始整个系统的初始化. 2.main.c的start_kernel函数是整个操作系统的入口,这也与Linux是基于C语言的特性相符,start_kernel具体做的动作很多

我的MYSQL学习心得(八)

我的MYSQL学习心得(八) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL学习心得(五) 我的MYSQL学习心得(六) 我的MYSQL学习心得(七) 这一篇<我的MYSQL学习心得(七)>将会讲解MYSQL的插入.更新和删除语句 同样的,只会讲解跟SQLSERVER不同的地方 插入 将多行查询结果插入到表中 语法 INSERT INTO table_name1(column_list1) SELECT (