这篇文章我们还是在之前的文章《Spring Cloud微服务项目模板系列(一)添加服务治理和远程调用》代码里面进行调整。这里我们主要使用常用的限流降级工具sentinel。所有的代码在文末就可以下载。这里我们主要调几个知识点来介绍下。
一、启动sentinel dashboard服务
sentinel dashboard是一个单独的服务,这里部署的话,可以参考这票文字《微服务实战spring cloud alibaba(十四)微服务子项目如何集成sentinel》。
二、项目如何和sentinel dashboard服务进行连通?
连通的话,我们只需要添加一个maven依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
然后在配置文件中添加sentinel的服务端配置即可
spring: cloud: sentinel: transport: port: 29999 dashboard: 192.168.31.30:28080
三、为单个接口定义服务降级和限流的处理方式
如果我们需要为某个接口配置限流或者降级的处理方法的话,我们首选需要在接口上添加一个sentinelresource的注解,示例如下:
@SentinelResource(value = "product", blockHandlerClass = SentinelHandlerResponse.class, blockHandler = "blockHandler", fallbackClass = SentinelFallbackResponse.class, fallback = "fallback") @GetMapping("/product/{pid}") public BaseResponse product(@PathVariable("pid") Integer pid) { Product product = productService.findByPid(pid); log.info("查询到商品:" + JSON.toJSONString(product)); return BaseResponse.ok(product); }
在注解里面我们定义了限流和降级的类和方法,所以需要实现这两个类和方法,handler代码如下:
// 注意这里必须使用static修饰方法 public static BaseResponse blockHandler(Integer pid,BlockException e) { log.info("进入到sentinel异常处理了"); if (e instanceof FlowException) { return BaseResponse.fail(ResponseEnum.INTERFACELIMIT); } else if (e instanceof ParamFlowException) { return BaseResponse.fail(ResponseEnum.INTERFACELIMIT); } else if (e instanceof DegradeException) { return BaseResponse.fail(ResponseEnum.INTERFACEDEGRADATION); } else if (e instanceof AuthorityException) { return BaseResponse.fail(ResponseEnum.NOPOWER); } return BaseResponse.fail(ResponseEnum.UNKNOWNERROR); }
fallback的方法如下:
// 注意这里必须使用static修饰方法 public static BaseResponse fallback(Throwable throwable) { return BaseResponse.fail(ResponseEnum.INTERFACEDEGRADATION); }
这里有两个注意事项:
1、这里的方法必须使用static进行修饰
2、handler的方法里面需要添加上降级接口的参数,例如我们在接口里面有一个pid的参数,那么在handler里面也需要添加上这个参数,并且鞋带上BlockException参数,这样子发生降级之后才会匹配到这个方法,然后执行这个方法的逻辑处理,如果没有接口里面的参数,这个方法是不生效的。
3、handler里面的方法返回值和接口需要保持一致。
四、配置feign调用结合sentinel
这里的话,我们首先需要在消费者的项目里面添加如下的配置
feign: sentinel: enabled: true
这里的消费者指的是服务调用者,而不是服务被调用者,也就是例如:A服务调用B服务,那么A服务就是消费者。
还有我们需要在在feign里面也需要设置一个服务降级的配置,例如:
@FeignClient(value = "service-product",fallback = ProductErrorService.class) public interface ProductClient { //指定调用提供者的哪个方法 @GetMapping(value = "/product/{pid}") BaseResponse findByPid(@PathVariable("pid") Integer pid); }
这里的ProductErrorService需要我们进行实现,这里的代码如下:
@Component public class ProductErrorService implements ProductClient { @Override public BaseResponse findByPid(Integer pid) { return BaseResponse.fail(ResponseEnum.INTERFACEDEGRADATION); } }
备注:
1、这里的feign的fallback类里面一定要添加spring的注解,同时如果这个类在其他的子模块里面,需要配置扫描,例如:
@SpringBootApplication(scanBasePackages = "org.shop.*")
以上就是当前的微服务模板里面添加sentinel限流降级的应用。最后按照惯例,附上本案例的源码,登录后即可下载。
还没有评论,来说两句吧...