首页 > 其他分享 >springboot整合sentinel,sleuth

springboot整合sentinel,sleuth

时间:2023-10-02 18:00:12浏览次数:40  
标签:sleuth springboot skuId zipkin spring skuItemVo CompletableFuture sentinel

 

1.  整合sentinel流控

  当需要对一个接口进行流量监控时可以使用springboot整合sentinel

  (1)在common模块中导入依赖 spring-cloud-starter-alibaba-sentinel;

  (2)下载sentinel控制台并启动;

  (3)配置 sentinel 控制台地址信息

spring.cloud.sentinel.transport.dashboard=localhost:8333
spring.cloud.sentinel.transport.port=8719

  (4)在控制台调整参数(默认所有的流控规则保存在内存中,重启失效)

  对获取当前秒杀活动添加流量控制,当请求超过时,会被阻塞

  (5)添加统计审计信息,对每一个微服务都导入 spring-boot-starter-actuator,并暴露所有端点 management.endpoints.web.exposure.include=*

   (6)添加配置类,自定义 sentinel 流控返回的数据

@Configuration
public class GulimallSeckillSentinelConfig {

    public GulimallSeckillSentinelConfig() {

        WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {
            @Override
            public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException {
                R error = R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(), BizCodeEnume.TO_MANY_REQUEST.getMsg());
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/json");
                response.getWriter().write(JSON.toJSONString(error));

            }
        });

    }

}

 

2. sentinel熔断降级

  (1)服务调用方的熔断保护:feign.sentinel.enable=true

  (2)远程服务发生异常时,触发我们的熔断回调方法

  在商品服务详情中会进行远程调用秒杀服务,当秒杀服务异常时,会触发fallback方法

    @Override
    public SkuItemVo item(Long skuId) throws ExecutionException, InterruptedException {
        SkuItemVo skuItemVo = new SkuItemVo();

        //1、sku基本信息的获取  pms_sku_info
        CompletableFuture<SkuInfoEntity> infoFutrue = CompletableFuture.supplyAsync(() -> {
            SkuInfoEntity info = getById(skuId);
            skuItemVo.setInfo(info);
            return info;
        }, executor);

        //3、获取spu的销售属性组合
        CompletableFuture<Void> saleAttrFuture = infoFutrue.thenAcceptAsync((res)->{
            List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.getSaleAttrBySpuId(res.getSpuId());
            skuItemVo.setSaleAttr(saleAttrVos);
        },executor);

        //4、获取spu的介绍    pms_spu_info_desc
        CompletableFuture<Void> descFuture = infoFutrue.thenAcceptAsync((res)->{
            SpuInfoDescEntity spuInfoDescEntity = spuInfoDescService.getById(res.getSpuId());
            skuItemVo.setDesc(spuInfoDescEntity);
        },executor);

        //5、获取spu的规格参数信息
        CompletableFuture<Void> baseAttrFuture = infoFutrue.thenAcceptAsync((res)->{
            List<SpuItemAttrGroupVo> attrGroupVos = attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(), res.getCatalogId());
            skuItemVo.setGroupAttrs(attrGroupVos);
        },executor);

        //2、sku的图片信息    pms_sku_images
        CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> {
            List<SkuImagesEntity> images = skuImagesService.getImagesBySkuId(skuId);
            skuItemVo.setImages(images);
        }, executor);

        CompletableFuture<Void> seckillFuture = CompletableFuture.runAsync(() -> {
            //3、远程调用查询当前sku是否参与秒杀优惠活动
            R skuSeckilInfo = seckillFeignService.getSkuSeckilInfo(skuId);
            if (skuSeckilInfo.getCode() == 0) {
                //查询成功
                SeckillSkuVo seckilInfoData = skuSeckilInfo.getData("data", new TypeReference<SeckillSkuVo>() {
                });
                skuItemVo.setSeckillSkuVo(seckilInfoData);

                if (seckilInfoData != null) {
                    long currentTime = System.currentTimeMillis();
                    if (currentTime > seckilInfoData.getEndTime()) {
                        skuItemVo.setSeckillSkuVo(null);
                    }
                }
            }
        }, executor);

        //等待所有任务都完成
        CompletableFuture.allOf(saleAttrFuture,descFuture,baseAttrFuture,imageFuture,seckillFuture).get();
        return skuItemVo;
    }

@FeignClient(value = "gulimall-seckill",fallback = SeckillFeignServiceImpl.class)
public interface SeckillFeignService {

    /**
     * 根据skuId查询商品是否参加秒杀活动
     * @param skuId
     * @return
     */
    @GetMapping(value = "/sku/seckill/{skuId}")
    R getSkuSeckilInfo(@PathVariable("skuId") Long skuId);

}

@Slf4j
@Component
public class SeckillFeignServiceImpl implements SeckillFeignService {

    @Override
    public R getSkuSeckilInfo(Long skuId) {
        log.info("熔断方法调用......");
        return R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(),BizCodeEnume.TO_MANY_REQUEST.getMsg());
    }
}

  也可以在控制台中对远程服务指定降级规则

 

3. 整合zipkin

  (1)docker 安装 zipkin 服务器

  docker run -d -p 9411:9411 openzipkin/zipkin

  (2)导入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

  zipkin 依赖也同时包含了 sleuth,可以省略 sleuth 的引用

  (3)添加zipkin相关配置

#服务追踪
spring.zipkin.base-url=http://zipkin安装地址:9411/
#关闭服务发现
spring.zipkin.discovery-client-enabled=false
spring.zipkin.sender.type=web
#配置采样器
spring.sleuth.sampler.probability=1

  服务调用链追踪信息统计

  Zipkin 默认是将监控数据存储在内存的,如果 Zipkin 挂掉或重启的话,那么监控数据就会丢失。所以如果想要搭建生产可用的 Zipkin,就需要实现监控数据的持久化。而想要实现数据持久化,自然就是得将数据存储至数据库,通常选用Elasticsearch。

标签:sleuth,springboot,skuId,zipkin,spring,skuItemVo,CompletableFuture,sentinel
From: https://www.cnblogs.com/homle/p/17739800.html

相关文章

  • springboot第40集:架构师写的代码,那叫一个优雅
    事务的隔离性上,从低到高可能产生的读现象分别是:脏读、不可重复读、幻读。脏读指读到了未提交的数据。不可重复读指一次事务内的多次相同查询,读取到了不同的结果。幻读师不可重复读的特殊场景。一次事务内的多次范围查询得到了不同的结果。通过在写的时候加锁,可以解决脏读。通过在......
  • springboot第40集:架构师写的代码,那叫一个优雅
    事务的隔离性上,从低到高可能产生的读现象分别是:脏读、不可重复读、幻读。脏读指读到了未提交的数据。不可重复读指一次事务内的多次相同查询,读取到了不同的结果。幻读师不可重复读的特殊场景。一次事务内的多次范围查询得到了不同的结果。通过在写的时候加锁,可以解决脏读。通过在读......
  • Sentinel系列之流量控制及熔断降级示例
    关于Sentinel的介绍网上很多,不再复制粘贴。本文主要演示Sentinel的两个重点功能:流量控制和熔断降级。示例基于Sentinel1.8.6, 同时使用JMeter进行并发请求(Postman无法并发)。当然也可以通过main方法,但这样就无法重复触发,并且无法学习Sentinel与Spring框架的集成另外需要注意的......
  • [SpringBoot 1] 自动装配和Run方法
    SpringBoot1阶段:1SpringBoot自动装配build.gradle中放依赖核心依赖,有很多启动器(spring-boot-start-xxx)@SpringBootApplication@SpringBootConfiguration@Configuration@Component@EnableAutoConfiguration@AutoConfiguration......
  • 熔断、限流、降级 —— SpringCloud Alibaba Sentinel
    Sentinel简介Sentinel是阿里中间件团队开源的,面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性Sentinel提供了两个服务组件:Sentinel用来实现微服务系统中服务熔断......
  • springboot 与 Redis整合
    SpringBoot操作数据:Spring-datajpajdbcmongodbredis!SpringData也是和SpringBoot齐名的项目!说明:在SpringBoot2.X之后,原来使用的jedis被替换成了lettucejedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedispool连接池,更新BIO模式lettuce:采用ne......
  • springboot web开发静态资源的映射规则
    前言我们之间介绍过SpringBoot自动配置的原理,基本上是如下:xxxxAutoConfiguration:帮我们给容器中自动配置组件;xxxxProperties:配置类来封装配置文件的内容;web开发中都在org.springframework.boot.autoconfigure.web包下今天看的静态资源映射规则都在org.springframework.boot.aut......
  • springboot web开发整合Freemarker 模板引擎
    目录Freemarker添加依赖配置文件ymlcontrollerhtmlFreemarker简介:FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组......
  • springboot 与异步任务,定时任务,邮件任务
    异步任务在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring3.x之后,就已经内置了@Async来完美解决这个问题。SpringBoot实现比较简单主启动类:添加注释......
  • springboot web开发springmvc自动配置原理
    前言我们也知道springboot启用springmvc基本不用做什么配置可以很方便就使用了但是不了解原理,开发过程中遇到点问题估计就比较头疼,不管了解的深不深入,先巴拉一番再说…下面我们先看看官网…我的版本是2.3.2版本,发现官网改动也比较大…不同版本自己巴拉下吧,结构虽然变化了,但......