微服务之服务保护
Sentinel引入Java项目中
一:安装Sentinel
官网地址:https://github.com/alibaba/Sentinel/releases
二:安装好后在sentinel-dashboard.jar所在目录运行终端
三:运行命令,端口自己指定
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
四:然后访问,localhost:8090 账号密码刚开始默认是sentinel
五:项目中引入依赖
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
六:配置application.yaml
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8090
http-method-specify: true # 开启请求方式前缀
fallback
一般簇点链路都是springmvc的接口,如果要基于openfeign的远程调用也加入簇点链路,就需要一个配置
feign:
sentinel:
enabled: true
FeignClient的Fallback有两种配置方式:
- 方式一:FallbackClass,无法对远程调用的异常做处理
- 方式二:FallbackFactory,可以对远程调用的异常做处理,通常都会选择这种
步骤一:自定义类,实现FallbackFactory,编写对某个FeignClient的fallback逻辑
@Slf4j
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {
@Override
public ItemClient create(Throwable cause) {
// 创建ItemClient接口实现类,实现其中的方法,编写失败降级的处理逻辑
return new ItemClient() {
@Override
public List<ItemDTO> getItemByIds(Collection<Long> ids) {
log.error("查询商品信息失败,cause: {}", cause.getMessage());
return CollUtils.emptyList();
}
@Override
public void deductStock(List<OrderDetailDTO> items) {
throw new RuntimeException("扣减商品库存失败");
}
};
}
}
步骤二:在配置类中把这个类注册为一个bean
@Bean
public ItemClientFallbackFactory createItemClientFallbackFactory(){
return new ItemClientFallbackFactory();
}
步骤三:在userClient接口中使用ItemClientFallbackFactory
@FeignClient(value = "item-service",fallbackFactory = ItemClientFallbackFactory.class)
public interface ItemClient {
@GetMapping("/items")
List<ItemDTO> getItemByIds(@RequestParam("ids") Collection<Long> ids);
@PutMapping("/items/stock/deduct")
void deductStock(@RequestBody List<OrderDetailDTO> items);
}
服务熔断
熔断降级是解决雪崩问题的重要手段。思路是由断路器统计服务调用的异常比例,慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;当服务恢复时,断路器会放行访问该服务的请求。