• Spring Cloud学习笔记(Hystrix)


    Hystrix简介

    Hystrix是通过添加延迟容忍和容错逻辑,从而控制分布式服务之间的交互。
    在高流量的情况下,一个后端的延迟可能会导致所哟服务的资源在数秒变得饱和,后续结果如果有再有请求将无法提供服务,应用会出现故障。
    Hystrix对第三方客户端访问依赖的延迟和故障进行保护和控制,Hystrix实现这一目标的思路为:
    (1)将外部依赖的访问请求封装在独立的线程中,进行资源隔离
    (2)对于超出设定阙值的服务调用,直接进行超时处理,不允许器耗费过长时间阻塞线程。
    (3)没个依赖服务维护一个独立的线程池,一旦线程池满了,直接拒绝服务的调用。
    (4)统计依赖服务调用的成功次数,失败次数,拒绝次数,超时次数等结果。
    (5)在一段时间内,如果服务调用的异常次数超过一定阙值,就会触发熔断器,停止对特定服务的所有请求。
    (6)如果某个服务出现调用失败、被拒绝、超时等异常情况,就自动调用fallback降级机制。
    (7)实现监控指标和配置变化。

    Hystrix入门

    示例
    (1)搭建eureka-server
    (2)创建一个eureka-hystrix-client的Spring Boot项目加入Eureka Client、Web、Feign、Ribbon、Hystrix依赖
    (3)在启动类中添加@EnableHystrix
    (4)创建一个config包,添加HystrixConfig类

    package com.itheima.eurekahystrixclient.config;
    
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class HystrixConfig {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return  new RestTemplate();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    (5)新建controller类,新建LocalController类

    package com.itheima.eurekahystrixclient.controller;
    
    import com.itheima.eurekahystrixclient.service.LocalItemService;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class LocalIntemController {
        @Autowired
        LocalItemService localItemService;
        @GetMapping("/hi")
        public String hi(String id){
            return localItemService.hi(id);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    (6)新建一个service包,新建LocalItemService类

    package com.itheima.eurekahystrixclient.service;
    
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    @Service
    public class LocalItemService{
        @Autowired
        private RestTemplate restTemplate;
        @HystrixCommand(fallbackMethod = "hiError")
        public String hi(String id) {
            return restTemplate.getForObject("http://hystrix-provider/hi?id=" + id,String.class);
        }
        public String hiError(String id) {
            return  String.format("Hi,your message is : %s but  request bad.",id);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    (7)新建一个hystrix-provider的Spring Boot项目。新建一个controller包,中新建一个HystrixController类

    package com.itheima.hystrixprovider.controler;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HystrixController {
    @GetMapping("/hi")
        public String hi(String id){
        return  "Hello World, I'm from hystix!"+id;
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (9)启动服务,访问http://localhost:8764/hi?id=12
    在这里插入图片描述

    使用Hystrix熔断器

    (1)开启Hystrix熔断功能,在eureka-hysterix-client项目配置文件application.xml

    feign:
      hystrix:
        enabled: true
    
    • 1
    • 2
    • 3

    (2)在eureka-hystrix-client启动类中添加@EnableFeignClients
    (3)在项目eureka-hystrix-client中创建一个LocalServiceImpl接口指定LocalServiceImpl类为失败逻辑处理类

    package com.itheima.eurekahystrixclient.service;
    
    import com.itheima.eurekahystrixclient.config.HystrixConfig;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    
    @FeignClient(value = "hystrix-provider",configuration = HystrixConfig.class,fallback = LocalItemServiceImpl.class)
    public interface LocalItemService {
        @RequestMapping(value = "/hi",method = RequestMethod.GET)
        public String hi(@RequestParam(value = "id") String id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (4)创建一个失败逻辑处理类LocalItemServiceImpl。

    package com.itheima.eurekahystrixclient.service;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class LocalItemServiceImpl implements LocalItemService{
        @Override
        public String hi(String  id){
            return String.format("Hi,your message is : %s but request bad.",id);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    (5)启动服务访问http://localhost:8764/hi?id=hello
    在这里插入图片描述

    (6)关闭provider,访问http://localhost:8764/hi?id=hello
    在这里插入图片描述

    监控熔断器状态

    (1)在eureka-hystrix-client的pom.xml中增加

     
                org.springframework.cloud
                spring-cloud-netflix-hystrix-dashboard
                1.4.0.RELEASE
     
     
                org.springframework.boot
                spring-boot-starter-actuator
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (2)在启动类中增加@EnableHystrixDashboard
    (3)创建hystrix.stream的Servlet配置。在config包下创建一个HystrixDashboardConfiguration类。

    package com.itheima.eurekahystrixclient.config;
    
    import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class HystrixDashboardConfiguration {
        @Bean
        public ServletRegistrationBean getServlet(){
            HystrixMetricsStreamServlet streamServlet=new HystrixMetricsStreamServlet();
            ServletRegistrationBean registrationBean=new ServletRegistrationBean(streamServlet);
            registrationBean.setLoadOnStartup(1);
            registrationBean.addUrlMappings("/hystrix.stream");
            registrationBean.setName("HystrixStreamServlet");
            return  registrationBean;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    (4)启动项目eureka-hystrix-client,访问http://localhost:8769/hystrix
    在这里插入图片描述

    在第一个框中输入http://localhost:8764/hystrix.stream,点击“Monitor Stream”。在打开一个标签页访问http://localhost:8764/hi?id=hello在这里插入图片描述

    在这里插入图片描述

    使用Hystrix和Turbine进行聚合监控

    使用Hystrix Dashboard组件监控服务的熔断器状态是,每个服务都有一个HystrixDashboard主页,监控非常不方便,为了同时监控多个服务熔断器的状况要用到Turbine,Turbine将每个服务的Hystrix Dashboard数据进行了整合。
    步骤:
    (1)搭建eureka-hystrix-client1和hystrix-provider1的服务消费者与服务提供买吧eureka-hystrix-client1项目的端口设置为8765,hystrix-provider1项目端口号设置为7006。
    (2)创建一个turbine-server的SpringBoot项目,添加Eureka Client、Web、Test、Turbine和dashboard依赖。

    
                org.springframework.cloud
                spring-cloud-starter-netflix-turbine
    
    
                org.springframework.cloud
                spring-cloud-netflix-hystrix-dashboard
                1.4.0.RELEASE
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (3)在项目turbine-server的配置文件application.yml中进行相关配置,具体代码如下:

    server:
      port: 8769
    spring:
      application:
        name: service-turbine
    security:
      basic:
        enable: false
    turbine:
      instanceUrlSuffix: /hystrix.stream
      aggregator:
        clusterConfig: default
      appConfig: eureka-hystrix-client
      clusterNameExpression: new String("default")
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:7000/eureka/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    (4)在启动类上添加@EnableTurbine注解,开启聚合监控功能,添加@EnableHystrixDashboard注解,启用Hystrix-Dashboard功能。
    (5)启动项目访问http://localhost:8769/hystrix
    在这里插入图片描述
    在输入框中输入http://localhost:8769/turbine.stream点击MonitorStream进入监控页面
    在这里插入图片描述

  • 相关阅读:
    【跟小嘉学习区块链】二、Hyperledger Fabric 架构详解
    Cache缓存
    雅思 四处刷题的记录(一)
    ubuntu16 ARM 4G双网卡的上网配置
    【数据结构】链表经典oj
    绘画系统(01):【纲】Paint System[官翻]
    基于web在线餐饮网站的设计与实现——蛋糕甜品店铺(HTML+CSS+JavaScript)
    Ubuntu下高效Vim的搭建(离线版)
    操作系统内存管理-01分段
    np中的normalize/histogram/cumsum/interp函数
  • 原文地址:https://blog.csdn.net/qq_50834939/article/details/126191877