微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
微服务保护
文章目录
- 微服务框架
- 微服务保护
- 32 隔离和降级
- 32.1 Feign整合Sentinel
- 32.1.1 隔离和降级
- 32.1.2 Feign 整合Sentinel
- 32.1.3 总结
32 隔离和降级
32.1 Feign整合Sentinel
32.1.1 隔离和降级
虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。
而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了。
【回顾栗子】
这是三个微服务,服务之间有相互依赖的关系,…
一个拖垮一个,最终导致雪崩问题的出现,
[线程隔离]
给每个业务划分独立的线程池,或者限定每个业务可以使用的线程数量,
服务C 挂掉导致业务2 阻塞后,后面的再有更多的请求进来,就算阻塞住了,也不会把服务搞崩,因为它最多占用服务器10 个线程的资源,再有更多请求进来,我就直接拒绝掉【这样就相当于把故障给隔离到一定的范围内】
这就是线程隔离。
[熔断降级]
熔断降级会去统计故障服务的比例,比如上图中,服务A 访问服务D ,成功的有1 个,失败的有2 个,显然故障比例过高,这个时候 断路器 就会去熔断业务。
熔断之后再有请求服务D 业务一来,就会快速失败,直接拒绝【这就是熔断】
不管是线程隔离还是熔断降级,都是对客户端(调用方)的保护。【避免服务调用者被拖垮】
【如何实现?】
32.1.2 Feign 整合Sentinel
SpringCloud中,微服务调用都是通过Feign来实现的,因此做客户端保护必须整合Feign和Sentinel。
-
修改OrderService的application.yml文件,开启Feign的Sentinel功能
-
给FeignClient编写失败后的降级逻辑
①方式一:FallbackClass,无法对远程调用的异常做处理
②方式二:FallbackFactory,可以对远程调用的异常做处理,我们选择这种
【修改配置文件】
sentinel:
enabled: true
默认是false,true → 开启feign 对sentinel 的支持
【编写失败降级逻辑】
新建FallbackFactory 类
package cn.itcast.feign.clients.fallback;
import cn.itcast.feign.clients.UserClient;
import cn.itcast.feign.pojo.User;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
/**
* ClassName: UserClientFallbackFactory
* date: 2022/11/5 17:15
*
* @author DingJiaxiong
*/
@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
@Override
public UserClient create(Throwable throwable) {
return new UserClient() {
@Override
public User findById(Long id) {
//编写错误降级逻辑
log.error("查询用户信息异常",throwable);
return new User();
}
};
}
}
这就是降级逻辑
【将UserClientFallbackFactory 对象注册为bean,搞一个配置类】
修改DefaultFeignConfiguration
package cn.itcast.feign.config;
import cn.itcast.feign.clients.fallback.UserClientFallbackFactory;
import feign.Logger;
import org.springframework.context.annotation.Bean;
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
@Bean
public UserClientFallbackFactory userClientFallbackFactory(){
return new UserClientFallbackFactory();
}
}
【修改UserClient 接口】
package cn.itcast.feign.clients;
import cn.itcast.feign.clients.fallback.UserClientFallbackFactory;
import cn.itcast.feign.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "userservice",fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
OK,重启order 服务
OK,
先访问一次接口
进入sentinel 控制台
现在就实现整合了。GET:http://userservice/user/{id} 这个就是我们order 服务远程调用user 服务获取用户信息的请求路径
32.1.3 总结
Sentinel支持的雪崩解决方案:
- 线程隔离(仓壁模式)
- 降级熔断
Feign整合Sentinel的步骤:
- 在application.yml中配置:feign.sentienl.enable=true
- 给FeignClient编写FallbackFactory并注册为Bean
- 将FallbackFactory配置到FeignClient