springcloud(四)整合sentinel
Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助保障微服务的稳定性。
规则:围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
服务端
下载sentinel服务端 地址:https://github.com/alibaba/Sentinel/releases
sentinel服务端也是基于springboot开发 它的版本与客户端发开的springboot版本毫无联系,所以sentinel下载任何版本都可用
下载完以后直接java -jar运行 默认是8080端口 登录网址http://127.0.0.1:8080/login 账号/密码:sentinel
未整合客户端之前登录
客户端
直接在pom中引入下面的依赖 版本可自行配置
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.2.1.RELEASE</version> </dependency>
配置文件 我使用的是yml文件
spring: cloud: sentinel: transport: #连接sentinel的dashboard dashboard: 127.0.0.1:8080 #client-ip: 192.168.0.9:9000 port: 8719 #注意这里的端口默认是8719 如果8719被占用会自动+1 无需当心 #eager: true #暴露的健康检查服务端点 management: endpoint: web: exposure: include: '*'
注:若整合完以后发现服务端还是未监听到任何客户端服务,那是因为sentinel是懒加载 需要先访问一次接口
最终整合完成的结果
sentinel 自定义返回错误
例如:
限流 重写之前
重写之后
方法很简单只需要重写BlockExceptionHandler
/** * 自定义Sentinel异常实现 * * @author Administrator * */ @Component public class MyBlockHandler implements BlockExceptionHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws Exception { String msg = null; if (ex instanceof FlowException) { msg = "已被限流"; } else if (ex instanceof DegradeException) { msg = "已被降级"; } else if (ex instanceof ParamFlowException) { msg = "已被热点参数限流"; } else if (ex instanceof SystemBlockException) { msg = "系统规则"; } else if (ex instanceof AuthorityException) { msg = "授权规则"; } response.setStatus(500); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Type", "application/json;charset=utf-8"); response.setContentType("application/json;charset=utf-8"); new ObjectMapper().writeValue(response.getWriter(), msg); } }