断路器,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接口.实现方法: ...
随机推荐
- 5.canvas
1.canvas:固定语句:定义画布/设置绘图环境为2d. 2.canvas样式:lineWidth线宽/strokeStyle绘制样式. 3.canvas绘制矩形: Context.moveTo(x ...
- 05.Linux-CentOS系统本地Yum源搭建
CentOS系统 1.挂载镜像光盘[root@localhost ~]# mount /dev/sr0 /media/cdrom/ 2.创建本地yum源仓库[root@localhost ~]# cd ...
- 使用GDB调试产生多进程的程序
如果一个进程fork了多个进程,这时使用GBD工具对程序进行调试会如何呢? 实际上,GDB 没有对多进程程序调试提供直接支持.例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试 ...
- phpstorm 生产php pojo类
一. 修改Generate POJO.groovy文件 改为 import com.intellij.database.model.DasTable import com.intellij.datab ...
- python数据分析第二版:numpy
一:Numpy # 数组和列表的效率问题,谁优谁劣 # 1.循环遍历 import numpy as np import time my_arr = np.arange(1000000) my_lis ...
- hdu 6053: TrickGCD (2017 多校第二场 1009) 【莫比乌斯 容斥原理】
题目链接 定义f[n]表示n是最大公约数情况下的计数,F[n]为n是公约数情况下的计数 (可以和 http://www.cnblogs.com/Just--Do--It/p/7197788.html ...
- [super class]和[self class]
参考: https://www.jianshu.com/p/3f2bcc588b44?utm_campaign=hugo&utm_medium=reader_share&utm_con ...
- UEditor可以如何直接复制word的图文内容到编辑器中
如何做到 ueditor批量上传word图片? 1.前端引用代码 <!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN& ...
- [CF959F]Mahmoud and Ehab and yet another xor task题解
搞n个线性基,然后每次在上一次的基础上插入读入的数,前缀和线性基,或者说珂持久化线性基. 然后一个num数组记录当时线性基里有多少数 然后每次前缀操作一下就珂以了 代码 #include <cs ...
- A Good Game
A Good Game 维护前缀和,排序 #include<bits/stdc++.h> using namespace std; typedef long long ll; #defin ...