• 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() + "	" + 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() + "	" + 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;">

  • 相关阅读:
    【转帖】关于release和debug的区别
    【转载】技术普及帖:你刚才在淘宝上买了一件东西
    iPhone史上最全的扫盲帖 【越狱,解锁,激活,Cydia,基带,裸机】
    【转帖】深入浅出话事件
    asp.net 4.0 的IIS部署
    【转帖】vs2010 快捷键大全
    C++中在一个类定义的头文件里含有一个对象,这个对象没有默认构造函数,如何实现初始化
    开通博客
    Selenium2+python自动化65js定位几种方法总结
    jps查看不到数据节点
  • 原文地址:https://www.cnblogs.com/pipicai96/p/11743119.html
Copyright © 2020-2023  润新知