断路器,AOP实现断路器模式 ------------Hystrix
断路器:https://martinfowler.com/bliki/CircutiBreaker.html
核心思想:
在断路器对象中封装受保护的方法调用。
该断路器监控调用和断路情况
调用失败触发阈值后,后续调用直接由短路器返回错误,不再执行实际调用。
理解:
客户端通过circuit breaker调用服务提供者,正常的时候可以调用。如果服务提供方出现了问题,发生了超时, 前几次可以超时处理, 到达一个阀值可以通过断路器进行处理, 就不再向服务方发起请求。
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger; @Aspect
@Component
@Slf4j
public class CircuitBreakerAspect {
// 阀值
private static final Integer THRESHOLD = 3;
//记录失败的次数
private Map<String, AtomicInteger> counter = new ConcurrentHashMap<>();
// 记录被保护的次数
private Map<String, AtomicInteger> breakCounter = new ConcurrentHashMap<>(); /**
*
* @param pjp 程序连接点
* @return
* @throws Throwable
*/
@Around("execution(* 拦截的区域")
public Object doWithCircuitBreaker(ProceedingJoinPoint pjp) throws Throwable {
// 获取当前执行的方法
String signature = pjp.getSignature().toLongString();
log.info("Invoke {}", signature);
Object retVal;
try {
if (counter.containsKey(signature)) {
// 失败次数达到预制,如果保护次数没到,返回null
if (counter.get(signature).get() > THRESHOLD &&
breakCounter.get(signature).get() < THRESHOLD) {
log.warn("Circuit breaker return null, break {} times.",
breakCounter.get(signature).incrementAndGet());
return null;
}
} else {
counter.put(signature, new AtomicInteger(0));
breakCounter.put(signature, new AtomicInteger(0));
}
retVal = pjp.proceed();
counter.get(signature).set(0);
breakCounter.get(signature).set(0);
} catch (Throwable t) {
log.warn("Circuit breaker counter: {}, Throwable {}",
counter.get(signature).incrementAndGet(), t.getMessage());
breakCounter.get(signature).set(0);
throw t;
}
return retVal;
}
}
Hystrix
Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力。本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力。为了实现容错和自我保护,下面我们看看Hystrix如何设计和实现的。
Hystrix设计目标:
- 对来自依赖的延迟和故障进行防护和控制——这些依赖通常都是通过网络访问的
- 阻止故障的连锁反应
- 快速失败并迅速恢复
- 回退并优雅降级
- 提供近实时的监控

实现了断路服务器模式
在需要服务熔断的方法上添加@HystrixCommand注解, fallbackMethod指定熔断的地址,默认情况下@HystrixCommand是在另外一个线程执行的。可以做一些超时的处理。
@HystrixProperty(name="excution.isolation.strategy",value="SEMAPHORE")设置为信号
Hystrix配置项参考:
Spring cloud 支持
spring-cloud-starter-netfixi-hystrix
@EnableCircuitBreaker
Feign支持
feign.hystrix.enable=true
@FeignClient
fallback / fallbackFactory
简单示例:
pom引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
application.properties
feign.client.config.default.connect-timeout=500
feign.client.config.default.read-timeout=500
#开启feign支持
feign.hystrix.enabled=true #cousul连接配置
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.prefer-ip-address=true
bootstarp.properties
spring.application.name=name-service
开启注解:
@EnableDiscoveryClient // 注册发现服务
@EnableFeignClients // feign的支持
@EnableCircuitBreaker // feignClient的演示
//Spring cloud 支持
@PostMapping("/order")
@HystrixCommand(fallbackMethod = "fallbackCreateOrder")
public CoffeeOrder createOrder() {
/*业务代码*/
return order;
} public CoffeeOrder fallbackCreateOrder() {
log.warn("Fallback to NULL order.");
return null;
}
//FeignClient 的支持 import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @FeignClient(name = "waiter-service", contextId = "coffee",
qualifier = "coffeeService", path="/coffee",
fallback = FallbackCoffeeService.class)
// 如果用了Fallback,不要在接口上加@RequestMapping,path可以用在这里
public interface TestService { @GetMapping("/{id}")
Product getById(@PathVariable Long id); } /*实现TestService*/ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import java.util.Collections;
import java.util.List; @Slf4j
@Component
public class FallbackTestService implements TestService{ @Override
public Product getById(Long id) {
/**发送了垄断的逻辑代码*/
return null;
} }
/**Controller调用*/ @GetMapping("testGetById")
public String testGetById() {
TestService.getById((long) 1);
return "";
}
断路器,AOP实现断路器模式 ------------Hystrix的更多相关文章
- 为了支持AOP的编程模式,我为.NET Core写了一个轻量级的Interception框架[开源]
ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架,虽然这只是一个很轻量级的框架,但是在大部分情况下能够满足我们的需要.不过我觉得 ...
- Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式
Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式 主题 概念 Hibernate 延迟加载的代理模式 Spring AOP的代理模式 区别和联系 静态代理和动态代理 概念 代 ...
- AOP基础—代理模式
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代 ...
- 3.静态AOP实现-代理模式
通过代理模式实现在RegUser()方法本身业务前后加上一些自己的功能,如:BeforeProceed和AfterProceed,即不修改UserProcessor类又能增加新功能 定义1个用户接口, ...
- C# Aspect-Oriented Programming(AOP) 利用多种模式实现动态代理
什么是AOP(Aspect-Oriented Programming)? AOP允许开发者动态地修改静态的OO模型,构造出一个能够不断增长以满足新增需求的系统,就象现实世界中的对象会在其生命周期中不断 ...
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
好长时间没有用过Spring了. 突然拿起书.我都发现自己对AOP都不熟悉了. 其实AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解决问 ...
- 关于在C#中实现AOP 拦截编程模式的新的探索
前面有篇文章,是从其他个人博客中贴过来的.地址:http://www.lanhusoft.com/Article/240.html 作者总结实现的挺好. 但是.不能不考虑性能!!使用 ContextB ...
- 5.动态代理AOP实现-DynamicProxy模式
通过动态代理模式Interceptor实现在RegUser()方法本身业务前后加上一些自己的功能,如:PreProceed和PostProceed,即不修改UserProcessor类又能增加新功能 ...
- AOP的工作模式
代理主要有静态代理和动态代理. 静态代理:在代理中实现接口并创建实现类对象,在对实现类的方法增加功能(不常用). 动态代理:实现implements InvocationHandler接口.实现方法: ...
随机推荐
- Sersync 上配置 Sersync 服务
上面的工作做好之后呢,下面就开始正式配置我们的 Sersync 了! 我们在 Sersync 安装过程中所用到包均是从谷歌 Sersync 项目组取得的,地址: https://code.google ...
- K8S进入容器方法
前言 k8s如何进入一个pod里有多个容器的方法 参考地址 https://blog.csdn.net/aa1215018028/article/details/81205691 方法1 kubect ...
- Linux 查找指定内容在哪个文件中
在实际的工作中,忘记配置项放在哪个文件中时,可借助命令来查询. eg: 1.grep -r "查询内容" 文件目录 #这样查询出来的包括文件名+内容 grep -r -l ...
- [python 学习] IO操作之读写文件
一.读取全部文件: # -*- coding: utf-8 -*- f = open('qq_url.txt','r'); print f.read(); f.close(); 二.读取规定长度文件 ...
- 06.队列、python标准库中的双端队列、迷宫问题
class QueueUnderflow(ValueError): """队列为空""" pass class SQueue: def __ ...
- Python3解leetcode Kth Largest Element in a Stream
问题描述: Design a class to find the kth largest element in a stream. Note that it is the kth largest el ...
- select自定义箭头问题 。。。和一行内不同颜色的整体鼠标滑过变色
1.select自定义箭头问题 用<select><option></option></select>的时候自带的三角箭头与需要的三角不同,这是还要求有 ...
- FFT IP核调用与仿真之SCALE压缩因子设置
关于FFT IP核的配置,网上有很多相关的资料可以参考,但是唯独涉及到scaled压缩因子设置这个参数,资料却非常匮乏,这是个什么参数,应该整么设置,设置后对结果输出会有什么影响,整样才能知道它设置的 ...
- 【Java】JSONObject学习
介绍 JSONObject只是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素.JSONObject可以很方便的转换成字符串,也可以 ...
- Alisha’s Party
Alisha’s Party Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...