我是靠谱客的博主 难过酒窝,最近开发中收集的这篇文章主要介绍springboot2 springcloud Greenwich.SR3 构建微服务--8.服务熔断,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在order-service服务中, 因为涉及到了对product-service的服务调用, 现在假设万一product宕机了, order 得不到返回数据了, 岂不是一起跟着宕机, 然后就会发生连链式效应, 造成整个服务的不可用, 当product不可以用了, 我们应该把他隔离开来. 

做好各个服务的错误处理方式, 能够提高服务的稳健性以及可用性. 

在分布式环境中,许多服务依赖项中的一些必然会失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。

Hystrix被设计的目标是:

  1. 对通过第三方客户端库访问的依赖项(通常是通过网络)的延迟和故障进行保护和控制。
  2. 在复杂的分布式系统中阻止级联故障。
  3. 快速失败,快速恢复。
  4. 回退,尽可能优雅地降级。
  5. 启用近实时监控、警报和操作控制。

Hystrix设计原则是什么:

  • 防止任何单个依赖项耗尽所有容器(如Tomcat)用户线程。
  • 甩掉包袱,快速失败而不是排队。
  • 在任何可行的地方提供回退,以保护用户不受失败的影响。
  • 使用隔离技术(如隔离板、泳道和断路器模式)来限制任何一个依赖项的影响。
  • 通过近实时的度量、监视和警报来优化发现时间。
  • 通过配置的低延迟传播来优化恢复时间。
  • 支持对Hystrix的大多数方面的动态属性更改,允许使用低延迟反馈循环进行实时操作修改。
  • 避免在整个依赖客户端执行中出现故障,而不仅仅是在网络流量中。

Hystrix是如何实现它的目标的:

  1. 用一个HystrixCommand 或者 HystrixObservableCommand (这是命令模式的一个例子)包装所有的对外部系统(或者依赖)的调用,典型地它们在一个单独的线程中执行
  2. 调用超时时间比你自己定义的阈值要长。有一个默认值,对于大多数的依赖项你是可以自定义超时时间的。
  3. 为每个依赖项维护一个小的线程池(或信号量);如果线程池满了,那么该依赖性将会立即拒绝请求,而不是排队。
  4. 调用的结果有这么几种:成功、失败(客户端抛出异常)、超时、拒绝。
  5. 在一段时间内,如果服务的错误百分比超过了一个阈值,就会触发一个断路器来停止对特定服务的所有请求,无论是手动的还是自动的。
  6. 当请求失败、被拒绝、超时或短路时,执行回退逻辑。
  7. 近实时监控指标和配置变化。

 

现在我们在order-service中做熔断 ,使用的组件是: hystix.

阿里也开源了一个熔断限流的组件, 叫熔断限流Sentinel. 你们也可以试试

1.添加依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        

2.在启动类上添加注解

@EnableHystrix  //Hystrix 容错

现在看order的启动类上的注解就很多 , 所以这个时候就有一个新的注解 

@SpringCloudApplication  简化注解, 方便很多. 这个就是集成了几个注解, 方便一起使用, 
一个springcloudapplication注解就代替了springbootapplication注解以及eureka注解和熔断器的注解

@EnableCircuitBreaker  这个注解和我们使用的@EnableHystrix 是一样的, 不用担心.

 

写一个测试方法



import com.example.product.client.ProductList;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;

/**
 * 微服务和分布式必须考虑的是:容错   两种处理: 重试和断路器
 */
@RequestMapping("hystrix-demo")
@RestController
//下面的这个方法,没有生效
//@DefaultProperties(defaultFallback = "errorHandle2")   //这个类的所有方法都有熔断处理
public class HystrixController {

    /*@Autowired
    private ProductList productList;*/


    /**
     * 熔断处理外部的错误调用.
     */
    @HystrixCommand(fallbackMethod = "errorHandle")
    @GetMapping("test1")
    public String get() {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> entity = restTemplate.postForEntity("http://localhost:8081/product/listForOrder"
                , Arrays.asList("1", "2"), String.class);
        return entity.getBody();
    }


    /**
     * 处理服务内部的错误
     */
    //超时的配置,默认超时时间1s,配置4s
    /*@HystrixCommand(fallbackMethod = "errorHandle2", commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "4000")
    })*/
    //可以全部写到配置文件里面去.
    /*@HystrixCommand(fallbackMethod = "errorHandle2", commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),   //设置熔断
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),//时间窗
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),//
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")//百分比
    })*/
    //全部写到配置文件里后,只需要很简单的写法了
    @HystrixCommand(fallbackMethod = "errorHandle2")
    @GetMapping("test2")
    public String test2() {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getForEntity("http://localhost:8081/hello", Void.class);
        //这是成功调用了, 但是等待超时了
        throw new RuntimeException("抛出异常");
    }


    /**
     * 方法名,返回值一致就行了
     */
    public String errorHandle() {
        return "服务器忙,请售后重试";
    }

    /**
     * 方法名,返回值一致就行了
     */
    public String errorHandle2() {
        return "服务器忙,请售后重试2";
    }


}

还有什么熔断的超时时间的配置

 

服务的熔断可以在控制面板中看到, 依赖添加

        <!-- hystix 可视化 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
在启动类上添加注解, @EnableHystrixDashboard

配置文件中还要加上这个配置

management.context-path=/

 

访问链接http://localhost:8082/hystix  就可以看到了

 

 在监控的界面有两个重要的图形信息:一个实心圆和一条曲线。

  ▪实心圆:1、通过颜色的变化代表了实例的健康程度,健康程度从绿色、黄色、橙色、红色递减。2、通过大小表示请求流量发生变化,流量越大该实心圆就越大。所以可以在大量的实例中快速发现故障实例和高压实例。

  ▪曲线:用来记录2分钟内流浪的相对变化,可以通过它来观察流量的上升和下降趋势。

 

整个代码地址是:

https://github.com/changhe626/micro-service

Java Framework,欢迎各位前来交流java相关
QQ群:965125360

 

最后

以上就是难过酒窝为你收集整理的springboot2 springcloud Greenwich.SR3 构建微服务--8.服务熔断的全部内容,希望文章能够帮你解决springboot2 springcloud Greenwich.SR3 构建微服务--8.服务熔断所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部