spring cloud搭建(hystrix)

news/2024/11/7 22:47:00/

天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。

spring cloud搭建(hystrix)

  • 一、Hystrix
    • 1. Hystrix概念
    • 2. 服务雪崩
    • 3. 服务熔断
    • 4. 服务降级
    • 5. Hytrix的作用:
  • 二、开发环境
  • 三、Hystrix的应用
    • 1. 服务提供者熔断器的使用
      • 1.1 hystrix依赖
      • 1.2 请求控制类加注解配置
      • 1.3 开启熔断功能
      • 1.4 测试熔断功能
    • 2. 服务调用者熔断器的使用
      • 2.1 hystrix依赖
      • 2.2 配置文件
      • 2.3 请求控制类加注解配置
      • 2.4 开启熔断器功能
      • 2.5 测试熔断功能


spring cloud 相关组件搭建(建议顺序):

  • eureka(注册中心服务)spring cloud搭建(eureka)
  • P-C service(服务提供者和服务调用者)spring cloud搭建(P-C service)
  • feign(接口调用)spring cloud搭建(feign)
  • hystrix(熔断器)本篇
  • zuul(网关服务)spring cloud搭建(zuul)

注:本篇基于前三篇编写


一、Hystrix

1. Hystrix概念

Hystrix是一种实现服务熔断的机制,当某个服务不可用时可以阻断故障传播。
说到hystrix需要先了解以下几个概念。

2. 服务雪崩

在微服务中各个服务互相调用时,某一个服务出现故障导致多个服务出现故障继而导致整个系统故障。
解决服务雪崩的方式有两种,服务熔断和服务降级。

3. 服务熔断

服务出现不可用或响应超时时,为防止服务雪崩,暂停对该服务的调用,直接返回一个结果,释放资源。
检测到服务恢复后再继续对服务调用。

4. 服务降级

防止核心业务负荷过载或响应过慢,对非核心服务进行降级,暂时关闭或延迟使用非核心服务,保证核心服务正常有效运行。

5. Hytrix的作用:

Hystrix监控服务之间的调用情况,连续调用多次失败时进行熔断保护,此时会开启熔断机制,返回一个开发者设置的退路信息。
Hystrix会定期检查故障服务,若故障恢复则可继续使用服务。


二、开发环境

JDK版本:1.8
maven版本:3.9.0
开发工具:IDEA社区版ideaIC-2018.3
项目框架:spring boot 版本为 2.7.3 springboot搭建传送门spring cloud 版本为 2021.0.5

三、Hystrix的应用

使用前请参考前三篇整合eureka、服务提供者service1、服务调用者service2

1. 服务提供者熔断器的使用

这里以service1服务为例使用熔断器,熔断器的使用分两步,引入熔断器依赖,配置文件开启参数(这一步这里不需要配置,在远程调用时的服务调用者service2中配置),请求控制类的方法上使用注解配置熔断参数,服务启动类添加注解开启。

1.1 hystrix依赖

service1服务的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:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>spring_cloud_demo</artifactId><groupId>com.cloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>spring_cloud_service1</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--hystrix熔断器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>2.2.10.RELEASE</version></dependency></dependencies></project>

1.2 请求控制类加注解配置

在请求方法上添加注解,配置参数,这里将方法睡眠3秒,熔断配置的参数为2秒
然后编写fallbackMethod对应的返回函数,返回自己设置的结果

package com.service1.controller;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.service1.service.Impl.Service1ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.concurrent.TimeUnit;/*** @ClassDescription: crud请求控制类* @Author:李白* @Date:2023/5/31 17:07*/
@RestController
@RequestMapping("/crud")
public class Service1Controller {@AutowiredService1ServiceImpl service1ServiceImpl;@PostMapping@HystrixCommand(fallbackMethod = "TimeOutCondition", commandProperties = {//超过2秒,服务熔断,返回指定方法中的值@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000")})public String addInfo() {try {//睡眠3秒TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {throw new RuntimeException(e);}return service1ServiceImpl.addInfo();}@DeleteMappingpublic String remove(){return service1ServiceImpl.removeInfo();}@PutMappingpublic String change(){return service1ServiceImpl.changeInfo();}@GetMappingpublic String search(){return service1ServiceImpl.searchInfo();}/*** 熔断调用函数* @return*/public String TimeOutCondition(){return "远程调用失败-超时2秒";}}

1.3 开启熔断功能

在service1服务的启动类上添加@EnableHystrix注解开启熔断功能

package com.service1;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;/*** @ClassDescription: 服务1启动项* @Author:李白* @Date:2023/5/31 14:46*/
@EnableEurekaClient
@SpringBootApplication
@EnableHystrix
public class Service1Application {public static void main(String[] args) {SpringApplication.run(Service1Application.class, args);}
}

1.4 测试熔断功能

启动service1服务,postman请求接口调用
由于请求响应时间3秒超出了熔断的时间2秒,在请求执行2秒时即返回熔断结果
在这里插入图片描述

2. 服务调用者熔断器的使用

这里以service2服务为例使用熔断器,分两步,引入熔断器依赖,配置文件开启参数,请求控制类的方法上使用注解配置熔断参数,服务启动类添加注解开启。

2.1 hystrix依赖

service2服务的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:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>spring_cloud_demo</artifactId><groupId>com.cloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>spring_cloud_service2</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>2.2.10.RELEASE</version></dependency></dependencies></project>

2.2 配置文件

service2服务中的配置文件中添加hystrix参数,开启hystrix
不在yml中配置hystrix参数功能也可正常使用,这一步可以忽略
这里是和服务提供者service1不同的地方,service1服务提供者不需要配置
service1是服务的提供者 service2是服务的调用者
application.yml

server:port: 8003spring:application:name: Service2-appeureka:client:service-url:defaultZone: http://localhost:8001/eureka/#Feign,这里应该是默认开启,因为这里不写,功能也正常用
#feign:
#  hystrix:
#    #开启熔断器
#    enabled: true

2.3 请求控制类加注解配置

在想要熔断的请求方法上添加@HystrixCommand注解,配置参数

  • fallbackMethod参数值为熔断返回结果的方法名字符串
  • commandProperties参数为花括号抱起来的注解@HystrixProperty
  • @HystrixProperty注解的参数以键值对存在键为name值为value
  • "TimeOutCondition"是熔断结果返回的函数,自己创建设置返回值
  • "execution.isolation.thread.timeoutInMilliseconds"是指请求超时多少秒进行熔断
  • "2000"是指2秒

Service2Controller.java

package com.service2.controller;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.service2.service.Service2Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;/*** @ClassDescription: 请求控制类(service2)* @Author:李白* @Date:2023/5/31 18:42*/
@RestController
@RequestMapping("/caller")
public class Service2Controller {@AutowiredService2Service service2Service;@PostMapping@HystrixCommand(fallbackMethod = "TimeOutCondition", commandProperties = {//超过1秒,服务熔断,返回指定方法中的值@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1000")})public String addInfo(){return service2Service.addInfo();}@DeleteMappingpublic String remove(){return service2Service.removeInfo();}@PutMappingpublic String change(){return service2Service.changeInfo();}@GetMappingpublic String search(){return service2Service.searchInfo();}/*** 熔断调用函数* @return*/public String TimeOutCondition(){return "远程调用失败-超时1秒";}}

2.4 开启熔断器功能

在service2的启动类上添加注解开启熔断器

package com.service2;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;/*** @ClassDescription: 服务2启动项* 注解@EnableFeignClients开启feign功能,也可以添加参数,basePackages的值可指定使用该功能的接口所在包* 注解@EnableHystrix开启熔断器 也可用@EnableCircuitBreaker开启熔断器,不过后者现在已被弃用* @Author:李白* @Date:2023/5/31 14:51*/
@EnableEurekaClient
@SpringBootApplication
//@EnableFeignClients(basePackages = "com.service2.service")
@EnableFeignClients
@EnableHystrix
public class Service2Application {public static void main(String[] args) {SpringApplication.run(Service2Application.class, args);}
}

2.5 测试熔断功能

启动eureka服务,service1服务,service2服务,postman请求接口调用
由于service1中的请求响应时间3秒,service1的熔断时间为2秒,service2设置的熔断时间为1秒,所以在超出1秒时,返回的是service2设置的熔断结果
在这里插入图片描述
这里可以将service2的熔断时间设置为2.5秒,可以发现结果返回的时service1设置的熔断结果,因为2.5秒大于2秒,service2的熔断机制未触发,在请求2秒时就直接返回了service1熔断返回的结果

以上就是熔断器hystrix的使用



http://www.ppmy.cn/news/241159.html

相关文章

LiangGaRy-学习笔记-Day20

1、raid磁盘阵列 1.1、阵列介绍 简称&#xff1a;独立冗余磁盘阵列 概念&#xff1a;把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组&#xff08;逻辑硬盘&#xff09;。从而提供比单个硬盘更高的存储性能和提供数据备份技术。 RAID可以预防数据丢失&#xff1b;…

【Web网站服务】Nginx优化

Nginx网页优化 一、配置Nginx网页缓存时间1.1设置方法 二、隐藏Nginx版本号2.1方法一&#xff1a;修改配置文件2.2方法二&#xff1a;修改源码文件&#xff0c;重新编译 三、修改用户与组四、日志切割五、连接超时六、更改进程数七、网页压缩八、配置防盗链九、Linux内核参数优…

【Spring Boot学习】今天是我的生日,舍友催我去吃饭,我还是坚持写完了Spring Boot配置文件,祝自己生日快乐哈

前言: 大家好,我是良辰丫,上一篇文章中我们已经学习了Spring Boot项目的的创建,今天我们会学习Spring Boot的配置文件,在今天的学习中我们会遇到许多我们不认识的注解,这些注解是Spring MVC中的,我们后续会介绍,大家先不用管这些注解是什么意思.那么,为什么不先学习MVC呢?我想…

挑选笔记本

中央处理器&#xff08;英文Central Processing Unit&#xff0c;CPU&#xff09;是一台计算机的运算核心和控制核心。CPU、内部存储器和输入/输出设备是电子计算机三大核心部件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU由运算器、控制器和寄存器及实现它们…

OpenCL

转自&#xff1a;https://baike.baidu.com/item/OpenCL/8477301?fraladdin OpenCL&#xff08;全称Open Computing Language&#xff0c;开放运算语言&#xff09;是第一个面向异构系统通用目的并行编程的开放式、免费标准&#xff0c;也是一个统一的编程环境&#xff0c;便于…

OpenCL 简单概念

OpenCL&#xff08;全称Open Computing Language&#xff0c;开放运算语言&#xff09;是第一个面向异构系统通用目的并行编程的开放式、免费标准&#xff0c;也是一个统一的编程环境&#xff0c;便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码…

显示硬件发展与视频开发系列(5)----智能时代05--运算平台

无论对于机器视觉&#xff0c;还是人工智能&#xff0c;相对从前&#xff0c;数据量发生了地覆天翻的变化。传统的运算框架不能满足现实的发展。人工智能影响不是一点一线&#xff0c;而是整个计算体系。 从AI/AR/VR芯片&#xff0c;到GPU数据处理&#xff0c;再到平台架构&…

正当防卫4

相信有很多玩家们都玩过正当防卫吧&#xff0c;对这款游戏感兴趣的玩家们一定不要错过这款&#xff1a;正当防卫4破解版&#xff0c;英文名为Just Cause 4&#xff0c;这是一款有着第三人称的动作冒险类单机游戏&#xff0c;它是由Avalanche Studios所制作的&#xff0c;由Squa…