当前位置: 首页 > article >正文

【SpringCloud】06-Sentinel

1. 雪崩问题

一个微服务出现问题导致一系列微服务都不可以正常工作。
服务保护方案:

  1. 请求限流。
  2. 线程隔离。
    在这里插入图片描述
  3. 服务熔断
    在这里插入图片描述

2. Sentinel

  1. 启动Sentinel
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
  1. 依赖
<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 配置
spring:
  cloud: 
    sentinel:
      transport:
        dashboard: localhost:8090
      http-method-specify: true # 将请求方式也作为簇点链路

簇点链路: Controller中的Rest接口

3. Fallback

  1. 配置openfeign使之能够成为簇点链路
feign:
  okhttp:
    enabled: true # 开启OKHttp功能
  sentinel: # 让feign可以成为簇点链路
    enabled: true
  1. 设置FallbackFactory
package com.hmall.api.client.fallback;

import com.hmall.api.client.ItemClient;
import com.hmall.api.dto.ItemDTO;
import com.hmall.api.dto.OrderDetailDTO;
import com.hmall.common.utils.CollUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;

import java.util.Collection;
import java.util.List;

@Slf4j
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
                log.info("查询商品失败!", cause);
                return CollUtils.emptyList();
            }

            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                log.info("扣减商品库存失败!", cause);
                throw new RuntimeException(cause);
            }
        };
    }
}

  1. 注册Bean
package com.hmall.api.config;

import com.hmall.api.client.fallback.ItemClientFallbackFactory;
import com.hmall.common.utils.UserContext;
import feign.Logger;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;

public class DefaultFeignConfig {
    @Bean
    public Logger.Level feignLogLevel() {
        return Logger.Level.FULL;
    }

    @Bean
    public RequestInterceptor userInfoRequestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate requestTemplate) {
                Long userId = UserContext.getUser();
                if (userId!=null) {
                    requestTemplate.header("user-info", userId.toString());
                }
            }
        };
    }

    @Bean
    public ItemClientFallbackFactory itemClientFallbackFactory() {
        return new ItemClientFallbackFactory();
    }
}
  1. 配置Bean
@FeignClient(value = "item-service", fallbackFactory = ItemClientFallbackFactory.class)
public interface ItemClient {
    @GetMapping("/items")
    List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);

    @PutMapping("/items/stock/deduct")
    void deductStock(@RequestBody List<OrderDetailDTO> items);
}

4. 熔断

拒绝发送请求给故障的微服务
在这里插入图片描述


http://www.kler.cn/a/372555.html

相关文章:

  • SQL语言基础
  • 【网页布局技术】项目五 使用CSS设置导航栏
  • 【宠粉赠书】大模型项目实战:多领域智能应用开发
  • ffmpeg视频滤镜:网格-drawgrid
  • 功能测试:方法、流程与工具介绍
  • 数据结构 ——— 二叉树的概念及结构
  • KVM 虚拟机Anolis OS 8.9 下利用宝塔面板中的 Docker 配置 Nextcloud + onlyoffice
  • BSV区块链为供应链管理带来效率革命
  • Python爬虫——网站基本信息
  • shell函数详解
  • 大模型面试题持续更新_Moe(2024-10-30)
  • WebRTC学习六:MediaStream 常用API介绍
  • 深度学习之激活函数
  • vue3(setup) keep-alive 列表页跳转详情缓存,跳转其它更新
  • unity 中使用zeroMq和Mqtt 进行通讯
  • layui xm-select
  • HTML入门教程14:HTML图像
  • NewStarCTF2024-Week4-Web-WP
  • 关于微信小程序启用组件按需注入
  • openGauss开源数据库实战十
  • 详解:模板设计模式
  • Linux多机器文件分发
  • 时间序列分类任务---tsfresh库
  • 基于Spring Boot+Vue的健身房管理系统(协同过滤算法、功能非常多)
  • C++初阶(八)--内存管理
  • Spark RDD