第7步: 流量控制,服务降级熔断(Sentinel) - YuHaiQing233/explore-cloud-alibaba GitHub Wiki
# 参考文档: 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
<!-- 服务熔断、降级、限流 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
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();
}
}