Spring Boot Alibaba(三)----Sentinel
服务容错保护-Sentinel一、 Sentinel 是个啥为什么要用它1. 灵魂拷问为什么要用想象一下这个场景上游服务大哥疯狂调用你的服务小弟你的服务又疯狂调用下游服务小弟的跟班。突然跟班下游挂了或者大哥上游流量洪峰来了。后果你的服务小弟直接被夹在中间要么被上游累死资源耗尽要么被下游拖死线程阻塞。最后整个系统像多米诺骨牌一样啪全挂了这就是传说中的服务雪崩。2. Sentinel 登场Sentinel哨兵阿里出品必属精品。它是以流量为切入点的服务保护框架。流量控制防上游就像水闸控制每秒通过的请求数QPS或者同时干活的线程数Thread。口号上游大哥慢点来我顶不住啊熔断降级防下游熔断发现下游不对劲响应慢、报错多直接切断连接眼不见心不烦。降级熔断后不能干瞪眼啊得返回个默认值比如“系统繁忙”或空数据给用户体验留条底裤。口号下游不行我就撤绝不恋战二、 Sentinel 的四大规则武功秘籍Sentinel 怎么保护你靠的就是规则1. 流控规则最常用流控直接对 URL 下手。比如/hello接口限制 QPS2。超过直接拒绝没商量。热点参数比如你有个接口查商品详情参数是id。如果id1001的商品突然爆了你可以单独限制这个参数别让它把数据库打挂。授权黑白名单机制。比如只允许originapp的请求访问其他的比如爬虫统统踢走。系统这是“上帝视角”。如果整个服务的负载Load或 CPU 飙高了Sentinel 会自动开启限流保住小命要紧。2. 降级规则保命符这里有三个维度满足一个就触发熔断异常比例5秒内发了5次请求如果有10%0.1都报错了 -熔断5秒。异常数5秒内发了5次请求只要有1次报错 -熔断5秒。慢调用比例5秒内发了5次请求如果有10%的请求超过1毫秒RT才返回 -熔断5秒。注这里的阈值根据业务实际情况调整别设太死板哦。️ 三、 从零开始环境搭建与整合保姆级教程光说不练假把式咱们来点实操的1. 启动 Sentinel 控制台Dashboard你得先有个地方看监控吧下载去 GitHub 下载sentinel-dashboard.jar。启动命令行输入java -jar sentinel-dashboard.jar。访问浏览器打开http://localhost:8080账号密码默认都是sentinel。注意这一步不做后面规则都没地方配2. 引入依赖Maven在你的pom.xml里加上这个“护身符”dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency如果是整合 Feign记得还要有 Feign 的依赖哦。3. 配置文件application.yml告诉你的服务Sentinel 控制台在哪里spring:cloud:sentinel:transport:dashboard:localhost:8080# 控制台地址port:8719# 客户端端口默认8719被占用会自动1四、 Sentinel 整合 Feign重中之重Consumer 调用 Provider 通常是用 Feign所以熔断降级必须在 Feign 上做文章。1. 开启 Feign 对 Sentinel 的支持在application.yml中必须加这一句否则 Feign 不会理你feign:sentinel:enabled:true2. 编写降级逻辑Fallback当 Provider 挂了Feign 得知道该怎么办。我们需要一个“备胎”工厂。ComponentpublicclassUserFeignFallbackFactoryimplementsFallbackFactoryUserFeign{OverridepublicUserFeigncreate(Throwablet){// t 就是报错的原因可以打印日志returnnewUserFeign(){OverridepublicUsergetUserById(Integerid){// 返回一个假数据或者包含错误信息的对象returnnewUser(id,服务降级了t.getMessage(),0);}};}}3. 指定降级工厂在你的 Feign 接口上贴上fallbackFactory标签FeignClient(valuesentinel-provider,fallbackFactoryUserFeignFallbackFactory.class)publicinterfaceUserFeign{GetMapping(/user/{id})UsergetUserById(PathVariable(id)Integerid);}搞定现在 Provider 挂了Feign 会自动调用你的 Fallback 逻辑用户看到的不再是 500 错误而是友好的提示。五、 全局异常处理统一口径默认的 Sentinel 报错信息太丑了而且格式不统一。我们要做一个“统一异常处理器”。实现BlockExceptionHandler接口ComponentpublicclassGlobalBlockExceptionHandlerimplementsBlockExceptionHandler{Overridepublicvoidhandle(HttpServletRequestrequest,HttpServletResponseresponse,BlockExceptione)throwsException{response.setContentType(application/json;charsetutf-8);Resultresultnull;// 判断是哪种异常if(einstanceofFlowException){resultnewResult(-1,哎呀被限流了稍后再试...);}elseif(einstanceofDegradeException){resultnewResult(-2,服务降级了功能暂时不可用...);}elseif(einstanceofAuthorityException){resultnewResult(-4,授权失败你谁啊);}elseif(einstanceofSystemBlockException){resultnewResult(-5,系统负载过高正在自救...);}// 返回 JSON 给前端response.getWriter().write(newObjectMapper().writeValueAsString(result));}}这样不管触发什么规则前端收到的都是统一的 JSON 格式体验满分六、 规则持久化告别“一重启就丢”默认情况下你在 Sentinel Dashboard 上配的规则都在内存里。服务一重启或者控制台一关规则全没了这怎么行我们需要把规则存到Nacos配置中心。第一步改造 Sentinel Dashboard我们要让 Dashboard 能把规则推送到 Nacos。下载sentinel-dashboard-nacos-1.8.1.jar这是阿里魔改过的版本支持 Nacos。用压缩软件打开这个 jar 包或者解压。找到application.properties文件修改nacos.address192.168.61.132:8848重新打包或者在解压目录下启动启动这个新的 Dashboard。第二步微服务从 Nacos 拉取规则引入依赖dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId/dependency配置 application.ymlspring:cloud:sentinel:datasource:ds1:# 数据源名称随便起nacos:server-addr:${spring.cloud.nacos.discovery.server-addr}namespace:sentinel# 建议单独搞个命名空间groupId:SENTINEL_GROUPdataId:${spring.application.name}-flow-rules# 规则文件的IDrule-type:flow# 告诉 Sentinel 这个文件里存的是流控规则data-type:json# 数据格式第三步验证在 Nacos 配置中心新建配置Data ID 必须和上面配置的dataId一致。内容填 JSON 格式的规则可以去 Dashboard 导出一个看看格式。启动微服务你会发现规则自动生效了这时候哪怕 Sentinel Dashboard 挂了只要 Nacos 在规则就在总结Sentinel 就是微服务的保镖。限流防上游搞事。熔断降级防下游拖后腿。整合 Feign让远程调用更健壮。持久化让规则永久生效。