微服务速成-Setinel

微服务速成-Setinel 作用作为服务保护可以对资源包括接口方法调用远程 调用进行限流熔断降级等操作快速入门使用1下载Sentinel的jar包下载不了的去这个https://github.com/alibaba/Sentinel/releases/tag/1.8.8启动命令java -jar sentinel浏览器地址localhost:8080 账号密码都是sentinel2引入Sentinel依赖依赖名称 spring-cloud-starter-alibaba-sentinel配置Sentinel的地址spring.cloud.sentinel.transport.dashboard127.0.0.1:80803项目中使用一共有三种场景使用web接口进行保护调用某个方法接口进行保护远程调用时进行保护并且限流等规则触发时会抛出BlockException我们需要做好异常处理web接口进行保护在Sentinel中心的簇点链路中对服务的主接口进行保护--添加规则报错处理手动实现BlockExceptionHandler接口并且将该类注册到容器当中即可自定义异常处理Component public class MyBlockExceptionHandler implements BlockExceptionHandler { Override public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception { // 所有被限流/熔断的请求都走到这里 response.setStatus(200); response.setContentType(application/json;charsetutf-8); response.getWriter().write({\msg\:\请求太频繁了请稍后再试\}); } }对方法进行保护对于Sentinel而言是无法直接感知到方法调用的只能手动加上SentinelResource注解这样Sentinel就能识别到这个资源并对其进行保护SentinelResource( value getProduct, blockHandler blockHandlerMethod, // Sentinel 限流/熔断时走这个 fallback fallbackMethod // 业务代码报错时走这个 ) public Product getProduct(Long id) { // 远程调用 product 服务 return productClient.getProduct(id); } // blockHandler参数和原方法一致最后多一个 BlockException public Product blockHandlerMethod(Long id, BlockException e) { return new Product(请求太频繁了请稍后再试); } // fallback参数和原方法一致最后多一个 Throwable public Product fallbackMethod(Long id, Throwable e) { return new Product(服务暂时不可用); }报错处理同样的违反规则是会抛出BlockException首先Sentinel会去找注解上有没有blockHandler如果没有再去找fallback如果都没有则抛给SpringBoot来处理异常我们可以自定义一个全局异常处理类RestControllerAdvice public class GlobalExceptionHandler { /** * 当没有给blockHandler时会被默认处理 */ ExceptionHandler(BlockException.class) public R handleBlockException(BlockException e){ return R.error(系统错误e.getMessage()e.getClass()); } }对远程调用进行保护我们只需要在配置中改写Feign远程调用的配置即可实现远程调用也被Sentinel保护起来配置如下feign.sentinel.enabledtrue同时编写一个降级类来实现远程调用的接口自定义fallback逻辑并在FeignClient注解上加上fallbackFeignClient(value service-product, fallback ProductClientFallback.class) public interface ProductClient { GetMapping(/product) Product getProduct(RequestParam(productId) Long productId); }// 降级兜底 Component public class ProductClientFallback implements ProductClient { Override public Product getProduct(Long productId) { Product p new Product(); p.setName(商品服务暂时不可用); return p; } }异常处理总结