第7步: 流量控制,服务降级熔断(Sentinel) - YuHaiQing233/explore-cloud-alibaba GitHub Wiki

1. 安装Sentinel控制台

# 参考文档: https://sentinelguard.io/zh-cn/docs/dashboard.html
# 下载地址: https://github.com/alibaba/Sentinel/releases

# 执行启动命令
nohup java -jar sentinel-dashboard-1.8.2.jar &

启动成功后访问控制台 http://192.168.174.11:8080/#/login

默认 账号: nacos 密码: nacos

2. Sentinel 客户端配置

pom依赖

<!-- 服务熔断、降级、限流 依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

application.yaml 配置

spring:
  cloud:
    sentinel:
      transport:
        dashboard: 192.168.174.11:8080      # 与仪表盘交互,如果在控制台配置了相关规则,会推送到本服务
        port: 8719                          # 当前服务客户端 端口,如果当前端口存在则+1,直到端口未占用为止


# Feign 启用Sentinel实现服务降级、熔断
feign:
  sentinel:
    enabled: true

业务实现

Feign接口业务逻辑及配置

package com.explore.order.feign;

import com.explore.base.ResultResponse;
import com.explore.order.feign.fallback.UserFeignFallback;
import com.explore.user.domain.User;
import com.explore.user.dto.UserReductionRequest;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * 调用三方接口类
 *
 * @author: HaiQing.Yu
 * @time: 2022/2/4 10:04
 */
@FeignClient(name = "cloud-user",path = "/api/user",fallback = UserFeignFallback.class)
public interface IUserFeign {

    @GetMapping(value = "/info/{num}")
    ResultResponse<String> info(@PathVariable("num") Integer num);

    @GetMapping("/find/{userId}")
    User getById(@PathVariable("userId") Long userId);

    @PostMapping("/reduction")
    Boolean reduction(@RequestBody UserReductionRequest request);
}

服务降级处理

package com.explore.order.feign.fallback;

import com.explore.base.ResultResponse;
import com.explore.order.feign.IUserFeign;
import com.explore.user.domain.User;
import com.explore.user.dto.UserReductionRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * 用户服务 流量控制异常处理和服务降级处理
 *
 * @author: YuHaiQing
 * @time: 2022/2/4 21:53
 */
@Component
public class UserFeignFallback implements IUserFeign {

    @Override
    public ResultResponse<String> info(@PathVariable("num") Integer num) {
        return ResultResponse.error(555,"服务降级处理,o(╥﹏╥)o");
    }

    @Override
    public User getById(Long userId) {
        return null;
    }

    @Override
    public Boolean reduction(UserReductionRequest request) {
        return null;
    }
}

流量控制 自定义异常处理

package com.explore.order.feign.fallback;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.explore.base.ResultResponse;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * 用户服务 流量控制处理
 *
 * @author: YuHaiQing
 * @time: 2022/2/4 22:27
 */
public class UserBlockHandler {

    /**
     * 用户服务流量控制
     *
     * @author: HaiQing.Yu
     * @time: 2022/2/4 22:28
     */
    public static ResultResponse<String> infoBlockHandler(@PathVariable("num") Integer num, BlockException exception) {
        return ResultResponse.error(555,"流量控制处理,╮(╯▽╰)╭");
    }
}

Controller 业务逻辑

package com.explore.order.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.explore.base.ResultResponse;
import com.explore.order.feign.IProductFeign;
import com.explore.order.feign.IUserFeign;
import com.explore.order.feign.fallback.UserBlockHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author: YuHaiQing
 * @time: 2022/2/4 21:50
 */
@RestController
@RequestMapping("/api/order")
public class InfoController {

    @Resource
    private IUserFeign userFeign;
    @Resource
    private IProductFeign productFeign;

    /**
     * 用户服务信息
     *
     * @author: HaiQing.Yu
     * @time: 2022/2/4 21:51
     */
    @GetMapping("/user/info/{num}")
    @SentinelResource(value = "userInfo",blockHandler = "infoBlockHandler",blockHandlerClass = {UserBlockHandler.class})
    public ResultResponse userInfo(@PathVariable("num") Integer num){
        return userFeign.info(num);
    }


    /**
     * 用户服务信息
     *
     * @author: HaiQing.Yu
     * @time: 2022/2/4 21:51
     */
    @GetMapping("/product/info")
    @SentinelResource(value = "productInfo",blockHandler = "infoBlockHandler",blockHandlerClass = {UserBlockHandler.class})
    public ResultResponse productInfo(){
        return productFeign.info();
    }
}
⚠️ **GitHub.com Fallback** ⚠️