概述
在order-service服务中, 因为涉及到了对product-service的服务调用, 现在假设万一product宕机了, order 得不到返回数据了, 岂不是一起跟着宕机, 然后就会发生连链式效应, 造成整个服务的不可用, 当product不可以用了, 我们应该把他隔离开来.
做好各个服务的错误处理方式, 能够提高服务的稳健性以及可用性.
在分布式环境中,许多服务依赖项中的一些必然会失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。
Hystrix被设计的目标是:
- 对通过第三方客户端库访问的依赖项(通常是通过网络)的延迟和故障进行保护和控制。
- 在复杂的分布式系统中阻止级联故障。
- 快速失败,快速恢复。
- 回退,尽可能优雅地降级。
- 启用近实时监控、警报和操作控制。
Hystrix设计原则是什么:
- 防止任何单个依赖项耗尽所有容器(如Tomcat)用户线程。
- 甩掉包袱,快速失败而不是排队。
- 在任何可行的地方提供回退,以保护用户不受失败的影响。
- 使用隔离技术(如隔离板、泳道和断路器模式)来限制任何一个依赖项的影响。
- 通过近实时的度量、监视和警报来优化发现时间。
- 通过配置的低延迟传播来优化恢复时间。
- 支持对Hystrix的大多数方面的动态属性更改,允许使用低延迟反馈循环进行实时操作修改。
- 避免在整个依赖客户端执行中出现故障,而不仅仅是在网络流量中。
Hystrix是如何实现它的目标的:
- 用一个HystrixCommand 或者 HystrixObservableCommand (这是命令模式的一个例子)包装所有的对外部系统(或者依赖)的调用,典型地它们在一个单独的线程中执行
- 调用超时时间比你自己定义的阈值要长。有一个默认值,对于大多数的依赖项你是可以自定义超时时间的。
- 为每个依赖项维护一个小的线程池(或信号量);如果线程池满了,那么该依赖性将会立即拒绝请求,而不是排队。
- 调用的结果有这么几种:成功、失败(客户端抛出异常)、超时、拒绝。
- 在一段时间内,如果服务的错误百分比超过了一个阈值,就会触发一个断路器来停止对特定服务的所有请求,无论是手动的还是自动的。
- 当请求失败、被拒绝、超时或短路时,执行回退逻辑。
- 近实时监控指标和配置变化。
现在我们在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.服务熔断所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复