Spring Cloud 学习——4.netfix hystrix 实现断路器

1.前言

  在一个微服务系统中,不同服务之间相互调用,可能形成一些调用链。那么当下游的的某一个服务故障时,可能会导致级联故障(即导致直接或者间接调用该服务的所有上游服务都不可用)。为了解决这种问题,就需要引入断路器。断路器的作用是:在调用服务的方法中声明一个断路节点,当本次调用服务失败时,根据节点声明的处理方式进行处理,避免抛出异常。

  spring cloud 提供了四种断路器实现:Netflix Hystrix、 Resilience4J、Sentinel、Spring Retry 。本文实现 Netfix Hystrix 的简单示例。

2.添加依赖

  spring boot 1.x 环境下,添加依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
    <version>1.x.x.RELEASE</version>
</dependency>

  spring boot 2.x 环境下,添加依赖:

<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
                <version>2.x.x.RELEASE</version>
            </dependency>

3.启用断路器

  启动类添加注解  @EnableCircuitBreaker 。

4.编写服务提供者

@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/get/{id}")
    public User get(@PathVariable("id")String id){
        System.out.println("/user/get/{id},id=" + id);
        User user = new User();
        user.setId(id);
        user.setUsername("onezai");
        user.setPassword("123456");
        user.setMobile("13128921555");
        return user;
    }
}

5.编写 feign 服务调用接口

@FeignClient("sys")
public interface UserClient {
    @GetMapping(value = "/sys/user/get/{id}")
    User getUserById(@PathVariable("id") String id);
}

6.编写服务调用者

@RestController
@RequestMapping("/")
public class HomeController {
    @Autowired
    EurekaClient eurekaClient;
    @Autowired
    RestTemplate restTemplate;
    @Autowired
    UserClient userClient;

    @GetMapping("/getUser/{id}")
    @HystrixCommand(fallbackMethod = "getUserDefault")
    public User getUser(@PathVariable("id")String id){
        User user = userClient.getUserById(id);
        System.out.println("user:\n" + JSONObject.fromObject(user).toString());
        return user;
    }

  其中  @HystrixCommand(fallbackMethod = "getUserDefault")  声明了一个断路节点,指定当调用的服务不可用时,回退到 getUserDefault 方法,下面是该方法的实现:

public User getUserDefault(String id){    User user = new User();    user.setId(id);    user.setUsername("defaultUser");    user.setPassword("defaultPass");    user.setMobile("13122225555");    return user;}

7.验证结果

  7.1.首先我们来验证正常情况下的结果:

  7.2.接下来我们验证异常的情况:

    首先我们将该行  @GetMapping("/get/{id}")  代码注释掉,这样也就人为地创造了服务不可用的条件,测试

  断路成功。

8.注意

  值得注意的是:fallbackMethod 指定的方法必须与 HystrixCommand 注解作用的方法参数一致,否则会报错:

com.netflix.hystrix.contrib.javanica.exception.FallbackDefinitionException: fallback method wasn‘t found: getUserDefault([class java.lang.String])
at com.netflix.hystrix.contrib.javanica.utils.MethodProvider$FallbackMethodFinder.doFind(MethodProvider.java:190) ~[hystrix-javanica-1.5.18.jar:1.5.18]
at com.netflix.hystrix.contrib.javanica.utils.MethodProvider$FallbackMethodFinder.find(MethodProvider.java:159) ~[hystrix-javanica-1.5.18.jar:1.5.18]
at com.netflix.hystrix.contrib.javanica.utils.MethodProvider.getFallbackMethod(MethodProvider.java:73) ~[hystrix-javanica-1.5.18.jar:1.5.18]
at com.netflix.hystrix.contrib.javanica.utils.MethodProvider.getFallbackMethod(MethodProvider.java:59) ~[hystrix-javanica-1.5.18.jar:1.5.18]
at com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect.setFallbackMethod(HystrixCommandAspect.java:331) ~[hystrix-javanica-1.5.18.jar:1.5.18]

······

9.完

原文地址:https://www.cnblogs.com/coding-one/p/12298279.html

时间: 2024-11-10 11:40:34

Spring Cloud 学习——4.netfix hystrix 实现断路器的相关文章

Spring Cloud 学习——5.使用 feign 的 hystrix 支持

1.前言 hystrix 是一个微服务系统的断路器组件,上文介绍了 spring cloud 通过 netfix hystrix 提供对 hystrix 的支持.同时 spring cloud 也提供了 openfeign 的支持, 而 openfeign 本身就已经内置了 hystrix 支持.所以本文介绍一个使用 openfeign 内置 hystrix 的简单示例. 前文链接: Spring Cloud 学习——3.openfeign实现声明式服务调用 Spring Cloud 学习——4

spring cloud 学习(4) - hystrix 服务熔断处理

hystrix 是一个专用于服务熔断处理的开源项目,当依赖的服务方出现故障不可用时,hystrix有一个所谓的断路器,一但打开,就会直接拦截掉对故障服务的调用,从而防止故障进一步扩大(类似中电路中的跳闸,保护家用电器). 使用步骤:(仍然在之前的示例代码上加以改造) 一.添加hystrix依赖 compile 'org.springframework.cloud:spring-cloud-starter-hystrix' 二.在需要熔断的方法上添加注解 package com.cnblogs.y

Spring Cloud 学习——6.zuul实现路由、负载均衡、安全验证

1.前言 在一个大微服务架构的系统中,可能存在着很多服务,如果将这些服务全部对外暴露,会带来很多问题.比如安全问题,有些核心服务直接对外暴露很容易被攻击:比如身份验证问题,有些接口服务是要求登录的,如果各种服务各自对外暴露,那么这些要求登录的请求第一个触达的服务模块都要向“用户服务模块”查询鉴权结果,这样既对“用户服务模块”造成额外压力,也增加了这些其它服务模块的开发成本,所以应该考虑将身份验证的事情交到网关模块中直接完成:比如运维难度和成本问题,如果每一种服务都各自对外暴露,那么整个系统就需要

spring cloud:Edgware.RELEASE版本hystrix超时新坑

升级到Edgware.RELEASE发现,zuul中不管如何设置hystrix的超时时间均不起作用,仍然是默认的1000ms.  降回低版本后正常,但是低版本的fallback方法中,又拿不到详细异常信息,最终暂时在Edgware.RELEASE中,将hystrix的超时关掉,参考以下配置: ribbon: ReadTimeout: 5000 ConnectTimeout: 5000 MaxAutoRetries: 0 MaxAutoRetriesNextServer: 1 hystrix: c

Spring Cloud学习--配置中心(Config)

Spring Cloud学习--配置中心(Config) 一 Spring Cloud Config简介 二 编写 Config Server 三 编写Config Client 四 使用refresh端点手动刷新配置 五 Spring Config Server与Eurelka配合使用 六 Config Server的高可用 一. Spring Cloud Config简介 微服务要实现集中管理微服务配置.不同环境不同配置.运行期间也可动态调整.配置修改后可以自动更新的需求,Spring Cl

Spring Cloud第八篇 | Hystrix集群监控Turbine

? 本文是Spring Cloud专栏的第八篇文章,了解前七篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cloud第二篇 | 使用并认识Eureka注册中心 Spring Cloud第三篇 | 搭建高可用Eureka注册中心 Spring Cloud第四篇 | 客户端负载均衡Ribbon Spring Cloud第五篇 | 服务熔断Hystrix Spring Cloud第六篇 | Hystrix仪表盘监控

断路器Hystrix与Turbine集群监控-Spring Cloud学习第三天

文章大纲 一.Hystrix基础介绍二.断路器Hystrix简单使用三.自定义Hystrix请求命令四.Hystrix的服务降级与异常处理五.Hystrix的请求缓存与请求合并六.Hystrix仪表盘与Turbine集群监控七.项目源码与参考资料下载八.参考文章 一.Hystrix基础介绍 1. Hystrix简介   一个用户管理项目,里边就三个功能:用户注册.用户登录.用户详情浏览.按照传统的软件开发方式直接创建一个Web项目,分分钟就把这三个功能开发出来了,但是我现在想使用微服务+服务治理

Spring Cloud学习系列第五篇【API网关服务】

这篇随笔接着学习微服务中一个比较重要的组件API网关服务.当我们微服务架构完成后最终是要提供给外部访问的,于是我们需要一个统一的访问入口,能隐藏我们内部服务URL细节,这就有点像局域网里那个网关的概念了,这是API网关服务就应运而生了.API网关作用有能为实现请求路由.负载均衡.校验过滤等基础功能,还能实现请求转发的熔断机制.服务集合等高级功能.补充下通常我们对外服务统一入口可以采用F5.Nginx等方式也能实现前面的请求路由与负载均衡,但是要实现后面功能了F5.Nginx就无能为力了吧,这就是

Spring Cloud学习(一)

Spring Cloud是什么? Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路器.数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署.Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易