对sentinel接入不了解的可以看上一篇关于sentinel接入指南的文章:
CSDN地址
掘金地址
当一个项目涵盖功能特别多,所有功能糅合在一起时,每次的更新维护或新需求的支撑可能会变得异常艰难;
所以在这时候就需要考虑将系统拆分为不同功能的多个服务系统;具体如何拆分此处就不多做说明;但是拆分的系统间
是有一些依赖关系的,也就是说拆分后将会多出系统间的调用。所以时下比较流行的rpc将是系统拆分后依赖调用的不二选择,
当前比较流行的rpc框架有阿里的dubbo和spring-cloud,还有一些如thrift这样的rpc也还算活跃。littlehow-sentinel就是为
spring-cloud集成做准备的(关于spring-cloud网上有太多文章介绍)。
feign项目地址
深入理解feign-01
深入理解feign-02
服务间的调用有出现很多单系统不会出现的问题,诸如系统间数据一致性如何保证啊、服务依赖关系管理啊等等;
littlehow-sentinel-feign主要解决的问题就是服务异常时降级、高峰调用限流
首先项目必须是springboot,JDK1.8
littlehow-sentinel地址
maven依赖(自己搭建的maven私服,依赖仅供参考)
<dependency>
<groupId>com.littlehowgroupId>
<artifactId>littlehow-sentinelartifactId>
<version>1.0.0version>
dependency>
#是否启用littlehow-sentinel
feign.sentinel.enabled=true
#该项不配置的情况下默认为(1,10,0.4#2,10,20)
#如果想要配置为默认不降级则配置为以下形式即可
#feign.sentinel.degrade =
#配置格式如:grade,timeWindow,count#grade,timeWindow,count
#同一个规则属性用,隔开,多个规则用#隔开
#grade参考com.alibaba.csp.sentinel.slots.block.RuleConstant下
# DEGRADE_GRADE_RT:平均响应时长(ms)
# DEGRADE_GRADE_EXCEPTION_RATIO:异常率, 例:0.4表示异常数/通过数>0.4将降级;
# DEGRADE_GRADE_EXCEPTION_COUNT:异常数
#timeWindow:单位s,10表示10秒的时间窗口内,上面的grade统计值都在10秒窗口内计算;
#count:为double值,根据grade配置适合的数字即可
#feign.sentinel.degrade = 1,10,0.4#2,10,20
#默认为false,表示是否除了业务异常,其余所有异常都进行fallback处理
#false情况下,降级只有DegradeException,限流只有FlowException会fallback
#true情况下,只有BizException不会fallback,其余异常将全部fallback
#feign.sentinel.fallback.all = false
限流和熔断都将抛出SentinelException异常
SentinelException拥有getCode和getMessage方法,用于获取异常码和异常信息
所以需要在全局异常处理器中处理该异常
熔断降级:异常码和异常信息为(“degrade exception"和"666001”)
限流:异常码和异常信息为(“too many requests"和"666002”)
接口实现
生效
接受spring容器管理即可(也就是可以基于@Component一族或者@Bean注解即可)
所有基于注解的限流、熔断、降级都在调用端生效;
可以同时配置多个限流和降级
配合Degrade降级使用,fallback方法必须和原方法参数一致,或则在原方法参数基础下加上最后一个异常Throwable参数
littlehow-sentinel组件提供普通降级或则限流的接入方案
只需要在方法上加上@Rule @Degrade @Flow注解就可自动生效
普通方案代码如下:
public class TestService {
private static AtomicInteger integer = new AtomicInteger();
/**
* 这里主要测试异常降级以及使用自动以fallback
* @param name
* @param age
* @return
*/
@Degrade
@Fallback(FallbackService.class)
public String getHello(String name, Integer age) {
if (integer.getAndIncrement() % 2 == 0) {
throw new IllegalArgumentException("这是自己定义的异常哦");
}
return "hello " + name + ", 已经" + age + "岁了";
}
/**
* 这里主要测试限流
* @return
*/
@Flow(count = 10)
public String getUUID() {
return UUID.randomUUID().toString();
}
}
public class FallbackService {
private static AtomicInteger integer = new AtomicInteger();
public String getHello(String name, Integer age, Throwable t) {
if (integer.getAndIncrement() % 2 == 0) {
throw new SentinelException("降级fallback处理", "888888");
}
return "fallback hello " + name + ", t = " + t.getClass().getName();
}
}
public class Run {
public static void main(String[] args) {
testFlow();
testDegrade();
}
private static void testFlow() {
TestService service = SentinelAopUtils.getProxyObject(TestService.class);
for (int i = 0; i < 15; i++) {
try {
System.out.println(service.getUUID());
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static void testDegrade() {
TestService service = SentinelAopUtils.getProxyObject(TestService.class);
for (int i = 0; i < 45; i ++) {
try {
System.out.println(service.getHello("littlehow", 18));
} catch (IllegalArgumentException e) {
System.out.println("error ------> " + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
运行Run即可得到降级和限流效果