前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud 入门教程4、服务容错保护:断路器(Hystrix)

Spring Cloud 入门教程4、服务容错保护:断路器(Hystrix)

作者头像
KenTalk
发布2018-09-11 11:35:50
5540
发布2018-09-11 11:35:50
举报
文章被收录于专栏:Ken的杂谈Ken的杂谈

一、前言

1、为什么需要断路器

在分布式架构中,一个应用依赖多个服务是非常常见的,如果其中一个依赖由于延迟过高发生阻塞,调用该依赖服务的线程就会阻塞,如果相关业务的QPS较高,就可能产生大量阻塞,从而导致该应用/服务由于服务器资源被耗尽而拖垮。

另外,故障也会在应用之间传递,如果故障服务的上游依赖较多,可能会引起服务的雪崩效应。就跟数据瘫痪,会引起依赖该数据库的应用瘫痪是一样的道理。

所以,断路器就是用来支持服务隔离、熔断等操作的工具。断路器会以隔离的方式来处理服务请求,当断路数量达到阈值,就会触发熔断(直接返回失败)。

2、什么是Hystrix?

Hystrix是SOA/微服务架构中提供服务隔离、熔断、降级机制的工具/框架。通过以上手段来降低服务故障带来的关联影响,以提高系统的整体可用性。

Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex distributed systems where failure is inevitable. -https://github.com/Netflix/Hystrix

Hystrix就是断路器的典型代表。

Hystrix工作原理:https://cloud.tencent.com/developer/article/1333814

3、本篇环境信息

框架

版本

Spring Boot

2.0.0.RELEASE

Spring Cloud

Finchley.BUILD-SNAPSHOT

JDK

1.8.x

4、准备工作

  • 准备Eureka Server、服务提供者

参考上一篇 https://cloud.tencent.com/developer/article/1333820

源码:https://github.com/ken-io/springcloud-course/tree/master/chapter-03/

启动Eureka Server: http://localhost:8800

启动Test Service:http://localhost:8602

  • 了解服务消费者

服务消费者Ribbon: https://cloud.tencent.com/developer/article/1333833

服务消费者Feign:

https://cloud.tencent.com/developer/article/1333820

二、Ribbon + Hystrix应用

本篇基于 https://cloud.tencent.com/developer/article/1333833

中ribbonclient项目代码进行修改,引入Spring Cloud Netflix Hystrix

源码:https://github.com/ken-io/springcloud-course/tree/master/chapter-02/ribbonclient

1、项目中引入Hystrix

修改pom.xml,引入Spring Cloud Netflix Hystrix

代码语言:javascript
复制
  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  </dependency>

2、配置Hystrix启动类

修改启动类App.java,增加@EnableHystrix注解开启Hystrix

代码语言:javascript
复制
@EnableHystrix
@EnableDiscoveryClient
@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3、断路处理实现

修改TestService.java,增加断路器功能

  1. 在index方法上增加注解 @HystrixCommand并通过fallbackMethod参数指定断路后执行的方法
  2. 定义断路处理方法,返回服务/操作断路后的提示
代码语言:javascript
复制
@Service
public class TestService {

    @Autowired
    private RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "indexError")
    public Object index() {
        return restTemplate.getForObject("http://testservice", String.class);
    }

    public Object plus(int numA, int numB) {
        String url = String.format("http://testservice/plus?numA=%s&numB=%s", numA, numB);
        return restTemplate.getForObject(url, String.class);
    }

    public Object indexError() {
        return "{\"code\": 999,\"message\": \"服务断路\"}";
    }
}

4、断路处理测试

启动 ribbonclient 项目,

访问:http://localhost:8604/ti ,将看到

代码语言:javascript
复制
{
  "code": 0,
  "message": "hello",
  "content": null,
  "serviceName": "testservice",
  "host": "localhost:8602"
}

关闭testservice,然后再访问 http://localhost:8604/ti ,将看到

代码语言:javascript
复制
{
  "code": 999,
  "message": "服务断路"
}

这就说明,当testservice不可用的时候,我们访问增加了Hystrix容错措施的接口,会触发快速失败,立即执行fallback。而不是一直等待直到超时,很大程度上降低了造成阻塞可能。

三、Feign + Hystrix应用

本篇基于 https://cloud.tencent.com/developer/article/1333820

中feignclient项目代码进行修改

源码:https://github.com/ken-io/springcloud-course/tree/master/chapter-03/feignclient

Feign已经引入了Hystrix,所以不需要再单独引入

1、开启Hystrix

修改application.yml,开启Hystrix

代码语言:javascript
复制
feign:
  hystrix:
    enabled: true

2、断路处理实现

  • 新建 TestServiceHystrix.java

TestServiceHystrix会作为TestService的断路处理实现

代码语言:javascript
复制
package io.ken.springcloud.feignclient.service;

import io.ken.springcloud.feignclient.model.Plus;
import io.ken.springcloud.feignclient.model.Result;
import org.springframework.stereotype.Component;

@Component
public class TestServiceHystrix implements TestService {

    @Override
    public String indexService() {
        return "{\"code\": 999,\"message\": \"服务断路\"}";
    }

    @Override
    public Result plusService(int numA, int numB) {
        Result result = new Result();
        result.setCode(999);
        result.setMessage("服务断路");
        return new Result();
    }

    @Override
    public Result plusabService(Plus plus) {
        Result result = new Result();
        result.setCode(999);
        result.setMessage("服务断路");
        return new Result();
    }

    @Override
    public Result plus2Service(Plus plus) {
        Result result = new Result();
        result.setCode(999);
        result.setMessage("服务断路");
        return new Result();
    }
}
  • 修改TestService,指定fallback类
代码语言:javascript
复制
@FeignClient(value = "testservice", fallback = TestServiceHystrix.class)
public interface TestService {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    String indexService();

    @RequestMapping(value = "/plus", method = RequestMethod.GET)
    Result plusService(@RequestParam(name = "numA") int numA, @RequestParam(name = "numB") int numB);

    @RequestMapping(value = "/plus", method = RequestMethod.POST, consumes = "application/json")
    Result plusabService(Plus plus);

    @RequestMapping(value = "/plus2", method = RequestMethod.POST)
    Result plus2Service(@RequestBody Plus plus);


}

3、断路处理测试

启动 feignclient 项目

访问:http://localhost:8605/ti ,将看到

代码语言:javascript
复制
{
  "code": 0,
  "message": "hello",
  "content": null,
  "serviceName": "testservice",
  "host": "localhost:8602"
}

关闭testservice,然后再访问 http://localhost:8605/ti ,将看到

代码语言:javascript
复制
{
  "code": 999,
  "message": "服务断路"
}

这就说明,当testservice不可用的时候,我们访问增加了Hystrix容错措施的接口,会触发快速失败,立即执行fallback。而不是一直等待直到超时,很大程度上降低了造成阻塞可能。

四、备注

  • 本篇代码示例

https://github.com/ken-io/springcloud-course/tree/master/chapter-04

  • 本篇参考

https://github.com/Netflix/Hystrix/wiki

  • 延伸阅读

https://cloud.tencent.com/developer/article/1333814

http://tech.lede.com/2017/06/15/rd/server/hystrix/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
    • 1、为什么需要断路器
      • 2、什么是Hystrix?
        • 3、本篇环境信息
          • 4、准备工作
          • 二、Ribbon + Hystrix应用
            • 1、项目中引入Hystrix
              • 2、配置Hystrix启动类
                • 3、断路处理实现
                  • 4、断路处理测试
                  • 三、Feign + Hystrix应用
                    • 1、开启Hystrix
                      • 2、断路处理实现
                        • 3、断路处理测试
                        • 四、备注
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档