【云原生】springcloud11——Hystrix是怎样让微服务“易凡峰顺”的1

简介: 【云原生】springcloud11——Hystrix是怎样让微服务“易凡峰顺”的

1 Hystrix简介

1.1 分布式系统面临的问题

image.png


image.png

1.2 Histrix是什么

image.png

1.3 Hystrix能做什么

服务降级、服务熔断,接近实时监控。

官方文档:https://github.com/Netflix/Hystrix/wiki

1.4 停更运维


image.png

后面我们会介绍代替的方案,但是必须先学习Hystrix了解其思想。

2.Hystix的重要概念

2.1 服务降级

dcf6e1f9d5b9449bb2434df07e36db8f.png


概念:服务降级一般是指在服务器压力剧增的时候,根据实际业务使用情况以及流量,对一些服务和页面有策略的不处理或者用一种简单的方式进行处理,从而 释放服务器资源的资源以保证核心业务的正常高效运行。


原因: 服务器的资源是有限的,而请求是无限的。在用户使用即并发高峰期,会影响整体服务的性能,严重的话会导致宕机,以至于某些重要服务不可用。故高峰期为了保证核心功能服务的可用性,就需要对某些服务降级处理。可以理解为舍小保大


应用场景: 多用于微服务架构中,一般当整个微服务架构整体的负载超出了预设的上限阈值(和服务器的配置性能有关系),或者即将到来的流量预计会超过预设的阈值时(比如双11、6.18等活动或者秒杀活动)


总结:服务降级是舍小保大,释放服务器资源的资源以保证核心业务的正常高效运行。


2.2 服务熔断

熔断这一概念来源于电子工程中的断路器(Circuit Breaker)。


在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。


这种牺牲局部,保全整体的措施就叫做熔断。


总结:服务熔断相当于断闸


❤服务降级与服务熔断的区别

1.触发原因不一样,服务熔断由链路上某个服务引起的,服务降级是从整体的负载考虑

2.管理目标层次不一样,服务熔断是一个框架层次的处理,服务降级是业务层次的处理

3.实现方式不一样,服务熔断一般是自我熔断恢复,服务降级相当于人工控制

4.触发原因不同 服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;

总结:服务熔断是应对系统服务雪崩的一种保险措施,给出的一种特殊降级措施。而服务降级则是更加宽泛的概念,主要是对系统整体资源的合理分配以应对压力。


2.3服务限流

限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说系统的吞吐量是可以被测算的,为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理,或者部分拒绝处理等等

9a0d5cf734484284815ece86b264c7e4.png


总结:服务限流相当于排队

3 Hystrix微服务构建

3.1 准备工作

前面我们使用的都是Eureka集群,为了简化后面的测试、编码工作,避免每次启动的微服务数量过多(方便学习演示),我们暂时将7001的application.yml改造下,改成单机环境。


9c5aefec6029488ebe199fbf8557337b.png

3.2 建项目

新建项目cloud-provider-hystrix-payment8001


06d0125e5440422eb3feff201fc01be1.png

3.3 写pom

<dependencies>
    <!-- hystrix-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    <!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
    <dependency>
        <groupId>com.wangzhou.springcloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--监控-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--eureka client-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!--热部署-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <!--   一个Java工具包     -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

3.4 写yml

server:
  port: 8001
spring:
  application:
    name: cloud-provider-hystrix-payment
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      #单机版
      defaultZone: http://localhost:7001/eureka
      #集群版
#      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka

3.5 主启动

@SpringBootApplication
@EnableEurekaClient
public class PaymentHystrixMain8001 {
    public static void main(String[] args) {
         SpringApplication.run(PaymentHystrixMain8001.class, args);
    }
}

3.6 业务类

(1)Service

节约时间,我们就不写接口了。

@Service
public class PaymentService {
    // 正常访问
    public String paymentInfo_OK(Integer id){
        // Hystrix底层调用的是Tomcat的线程池,我们在这里将线程名放回
        return "线程:  "+Thread.currentThread().getName()+"  paymentInfo_OK, id = "+id;
    }
    //超时访问
    public String paymentInfo_Timeout(Integer id) throws InterruptedException {
        int timeout = 3;
        // Hystrix底层调用的是Tomcat的线程池,我们在这里将线程名放回
        TimeUnit.SECONDS.sleep(timeout);
        return "线程:  "+Thread.currentThread().getName()+"  paymentInfo_OK, id = "+id + "\t" + "耗时"+ timeout +"s";
    }
}

(2)Controller

@RestController
@Slf4j
public class PaymentController {
    @Resource
    private PaymentService paymentService;
    @Value("${server.port}")
    private String serverPort;
    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentOk(@PathVariable("id")Integer id) {
        String result = paymentService.paymentInfo_OK(id);
        log.info("result:" + result);
        return result;
    }
    @GetMapping("/payment/hystrix/timeout/{id}")
    public String paymentInfo_timeout(@PathVariable("id") Integer id) throws InterruptedException {
        String result = paymentService.paymentInfo_Timeout(id);
        log.info("********* RESULT:"+ result +"***********");
        return result;
    }
}

3.7 测试

启动7001,8001两个微服务。

访问:http://localhost:7001/,可用看到带熔断的8001Hystrix微服务。


d773fea1726845d5b9ad968b8cc035b3.png

访问ok接口

http://localhost:8001/payment/hystrix/ok/1

没毛病。

930eff35b3a44396a5d59bce3b59760b.png

timeout接口。


a814a44ec3b14e4ca69ab48a1abadf53.png


b17ad2d1acd649dcabbb9e74931983e1.png

相关文章
|
7天前
|
Kubernetes Cloud Native 持续交付
云原生技术浪潮下的微服务架构实践
在数字化转型的今天,云原生技术成为推动企业IT革新的关键力量。本文将通过浅显易懂的语言和实际案例,带领读者了解云原生的核心概念、微服务架构的设计原则以及如何在云平台上高效部署和管理微服务。我们将从基础概念出发,逐步深入到微服务的生命周期管理,探讨如何在云原生生态中实现快速迭代和持续交付。无论你是云原生技术的初学者,还是希望深化理解的开发者,这篇文章都将为你提供有价值的指导和思考。
|
1天前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
4天前
|
Cloud Native 算法 持续交付
云原生之旅:从容器到微服务
在数字化时代的浪潮中,云原生技术如同一座灯塔,指引着企业航向灵活、高效的未来。本文将深入浅出地探索云原生的核心概念,包括容器化、微服务架构以及持续集成与持续部署(CI/CD),旨在为读者揭开云原生的神秘面纱,展现其在现代软件开发中的革命性影响。通过实际案例分析,我们将一同见证云原生技术如何助力企业实现快速迭代和高弹性的IT架构。
21 2
|
11天前
|
运维 Cloud Native 持续交付
云原生技术浪潮下的微服务架构演进
【8月更文挑战第9天】随着云计算技术的不断进步,云原生已成为推动现代软件开发和运维模式变革的关键力量。本文旨在探讨云原生环境下微服务架构的演化路径,分析其在提升应用开发效率、促进持续交付以及增强系统可扩展性方面的优势。文章将着重讨论微服务架构在设计原则、部署策略及治理机制方面的适应性调整,并展望未来云原生技术如何进一步影响微服务架构的创新与实践。
|
12天前
|
Cloud Native 云计算 微服务
云原生时代:企业分布式应用架构的惊人蜕变,从SOA到微服务的大逃亡!
【8月更文挑战第8天】在云计算与容器技术推动下,企业分布式应用架构正经历从SOA到微服务再到云原生的深刻变革。SOA强调服务重用与组合,通过标准化接口实现服务解耦;微服务以细粒度划分服务,增强系统灵活性;云原生架构借助容器化与自动化技术简化部署与管理。每一步演进都为企业带来新的技术挑战与机遇。
48 6
|
7天前
|
运维 Cloud Native 持续交付
云原生时代的微服务架构演进
【8月更文挑战第12天】在数字化转型的浪潮中,企业级应用正逐渐从传统的单体架构向微服务架构转变。本文将探讨微服务架构的概念、优势以及在云原生环境下的演进路径,同时分析微服务实施过程中面临的挑战和解决策略。通过深入讨论微服务与容器化技术的结合,文章旨在为读者提供一种现代化的应用开发和部署范式。
|
8天前
|
运维 监控 Cloud Native
云原生时代下的微服务架构演进
在数字化的浪潮中,云原生技术如同一艘承载梦想的巨轮,带领企业驶向灵活、高效的未来。本文将深入浅出地探讨微服务架构如何在云原生的大背景下不断演进,从传统的单体应用到现代化的服务网格,每一步的变革都是对技术挑战的回应和对未来趋势的拥抱。通过具体案例分析,我们将一窥微服务与容器化、自动化运维等云原生概念的融合之美,以及这一进程如何为企业带来前所未有的敏捷性和创新能力。
|
11天前
|
运维 Cloud Native 开发者
云原生时代:容器化与微服务架构的融合之旅
【8月更文挑战第9天】 在数字化浪潮的推动下,企业纷纷上云以追求更高效的运营模式。本文将深入探讨云原生技术的核心——容器化与微服务架构的结合,揭示它们如何共同塑造现代软件的开发与部署。通过浅显易懂的语言和实际案例,我们将一同见证这场技术变革给企业带来的创新与挑战,以及开发人员如何在这波潮流中找到自己的立足点。
16 4
|
10天前
|
运维 Cloud Native Android开发
云原生之旅:容器化与微服务架构的融合之道安卓应用开发入门指南
本文将深入探讨云原生技术的核心要素——容器化和微服务架构,并揭示它们如何共同推动现代软件的开发与部署。通过实际案例分析,我们将看到这两种技术如何相辅相成,助力企业实现敏捷、可扩展的IT基础设施。文章旨在为读者提供一条清晰的道路,指引如何在云原生时代利用这些技术构建和优化应用。 本文将引导初学者了解安卓应用开发的基本概念和步骤,从安装开发环境到编写一个简单的“Hello World”程序。通过循序渐进的讲解,让读者快速掌握安卓开发的核心技能,为进一步深入学习打下坚实基础。
19 1