栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Sentinel

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Sentinel

Sentinel
  • 引入依赖
  • 启动控制台
  • 端口简单配置
  • 流量控制
  • 熔断降级配置
    • 1. 使用Sentinel来保护feign远程调用
    • 2. 自定义受保护的资源
  • gateway网关限流

官网地址:https://sentinelguard.io/zh-cn/index.html

引入依赖

    com.alibaba.cloud
    spring-cloud-starter-alibaba-sentinel



    com.alibaba.cloud
    spring-cloud-alibaba-sentinel-gateway



    org.springframework.cloud
    spring-cloud-starter-gateway

#可获取监控信息

     org.springframework.boot
     spring-boot-starter-actuator



    com.alibaba.csp
    sentinel-web-servlet

启动控制台

下载控制台jar包:https://github.com/alibaba/Sentinel/releases

java -Dserver.port=8333 -Dcsp.sentinel.dashboard.server=localhost:8333 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.3.jar
端口简单配置
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard=localhost:8333
流量控制

添加流控规则

流控模式:链路的可以选择哪条至哪条的链路控制,关联模式B流量大可以对A进行限制。
流控效果:warm up(预热)慢慢上升到峰值。

配置流量过大提示

@Configuration
public class SeckillSentinelConfig implements BlockExceptionHandler {


    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {

            R error = R.error(BizCodeEnume.TOO_MANY_REQUEST.getCode(), BizCodeEnume.TOO_MANY_REQUEST.getMsg());
        httpServletResponse.setCharacterEncoding("UTF-8");
        httpServletResponse.setContentType("application/json");
        httpServletResponse.getWriter().write(JSON.toJSONString(error));

    }
}

结果:

熔断降级配置 1. 使用Sentinel来保护feign远程调用

调用方的熔断保护:

@FeignClient(name = "sayService", url = "http://localhost:11111", fallback = SayServiceFallback.class, configuration = FeignConfiguration.class)
public interface SayService {

    @RequestMapping(value = "/feign/hello", method = RequestMethod.POST)
    SaySomeThing saySomeThing(@RequestBody SaySomeThing saySomeThing);
    
}
public class SayServiceFallback implements SayService {
    
    Logger logger = LoggerFactory.getLogger(SayServiceFallback.class);
    
    @Override
    public SaySomeThing saySomeThing(SaySomeThing saySomeThing) {
        SaySomeThing saySomeThingFail = new SaySomeThing();
        saySomeThingFail.setName("错误");
        saySomeThingFail.setWords("错误的话");
        logger.error("调用失败");
        return saySomeThingFail;
    }
}
@Configuration
public class FeignConfiguration {
    @Bean
    public SayServiceFallback sayServiceFallback() {
        return new SayServiceFallback();
    }    
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
2. 自定义受保护的资源
基于代码和注解的两种方式
try (Entry entry = SphU.entry("seckillSkus")) {
	//业务逻辑
} catch(Exception e) {}
@SentinelResource(value = "getCurrentSeckillSkusResource",blockHandler = "blockHandler")
public List getCurrentSeckillSkus() {
    
}

// 降级调用的方法,参数必须和被调用方法一致
public List blockHandler(BlockException e) {

    log.error("getCurrentSeckillSkusResource被限流了,{}",e.getMessage());
    return null;
gateway网关限流

编写流控降级返回配置类

@Configuration
public class SentinelGatewayConfig {

    public SentinelGatewayConfig() {
        GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
            //网关限流了请求,就会调用此回调
            @Override
            public Mono handleRequest(ServerWebExchange exchange, Throwable t) {

                R error = R.error(BizCodeEnum.TO_MANY_REQUEST.getCode(), BizCodeEnum.TO_MANY_REQUEST.getMessage());
                String errorJson = JSON.toJSONString(error);

                Mono body = ServerResponse.ok().body(Mono.just(errorJson), String.class);
                return body;
            }
        });
    }

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992957.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号