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);
        
    }

}

 

posted @ 2021-05-15 10:28  陳丶  阅读(1402)  评论(0编辑  收藏  举报