通过sentinelResouce的资源名实现了配置规则的兜底,将配置规则的兜底进行了抽取,避免冗余代码。通过OpenFeign实现了java异常的Fallback的兜底,将java异常的兜底进行了抽取,避免冗余代码。通过OpenFeign的接口+注解的调用实现了客户端的负载均衡,实现了远程调用的抽取,避免冗余代码。
1、整体流程整合
2、工程准备完成,保证84可以轮询访问9003和9004
9003和9004是服务提供者。消费者84,在消费者84进行服务限流、熔断、fallback等配置
常识:
3、因为fallback只管控java运行异常,blockHandler只管空sentinel配置异常。当blockHandler和fallbackHandler都配置情况下,有异常没有限流走fallbackHandler,有限流有异常走blockHandler
@RequestMapping("/consumer/fallback/{id}")
@SentinelResource(value = "fallback", fallback = "handlerFallback", blockHandler = "blockHandler") //fallback和blockHandler 都配置
public CommonResult<Payment> fallback(@PathVariable("id") Long id) {
CommonResult<Payment> result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/" + id, CommonResult.class, id);
if (id == 4) {
throw new IllegalArgumentException("IllegalArgumentException,非法参数异常");
} else if (result.getData() == null) {
throw new NullPointerException("NullPointerException,该ID没有对应记录,空指针异常");
}
return result;
}
/**
* 本例子是 fallback handlerFallback
*
* @param id
* @param e
* @return
*/
public CommonResult handlerFallback(@PathVariable("id") Long id, Throwable e) {
Payment payment = new Payment(id, "null");
return new CommonResult(444, "兜底异常handlerFallback,exception内容" + e.getMessage(), payment);
}
//--------------------------------- OpenFeign ---------------------------------
/**
* 本例子是 blockHandler
*
* @param id
* @param blockException
* @return
*/
public CommonResult blockHandler(@PathVariable("id") Long id, BlockException blockException) {
Payment payment = new Payment(id, "null");
return new CommonResult(445, "blockHandler-sentinel限流,无此流水:blockException" + blockException.getClass().getCanonicalName(), payment);
}
访问:http://localhost:84/consumer/fallback/5
超过限流则会走blockHandler
结果:
4、对openFiegn的整合(去掉了ribbon和restTemplate的调用,改用接口加注解的方式调用),后续不再使用ribbon了,只掌握openFeign的使用就好
(1)、maven的添加openFeign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)、主启动类的添加配置
(3)、controller代码,主要是sentinel的配置
@GetMapping(value = "/consumer/paymentSQL/{id}")
@SentinelResource(value = "blockHandler",blockHandler = "blockHandler") //它实现了配置违规,包括限流、熔断、热点规则等问题
public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id) {
return paymentService.PaymentSQL(id);
}
(4)、OpenFeign通过接口+注解的方式进行远程调用,实现了fallback的java代码端降级的功能的功能。openFeign通过接口的@FeignClient注解定义访问外部哪个服务,通过接口的方法定义访问外部服务哪个方法
@Service
public class PaymentFallbackServiceImpl implements PaymentService {
@Override
public CommonResult<Payment> PaymentSQL(Long id) {
return new CommonResult<>(444444444, "服务降级返回,----PaymentFallbackServiceImpl", new Payment(id, "errorSerial"));
}
}