目录
开门见山,和Sentinel一样解决了我们的项目中因为级联失败而导致服务雪崩现象
解决:
1.流量控制
进行限流,QPS
2.缓存
对可能频繁访问的数据加入缓存中,减少数据库的压力
3.服务熔断降级
服务接口拒绝服务,本质就是我们的断路器限制我们的服务请求访问
项目实战
@EnableCircuitBreaker:启用断路器
@EnableHystrixDashboard:启用Hystrix
- @EnableDiscoveryClient
- @EnableCircuitBreaker//启用断路器
- @SpringBootApplication
- @SpringCloudApplication
- @EnableHystrixDashboard
- public class MicroserviceProviderHystrixApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(MicroserviceProviderHystrixApplication.class, args);
- }
-
- }
1.依赖
- <dependencies>
-
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plus-boot-starterartifactId>
- <version>3.4.2version>
- dependency>
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-netflix-hystrixartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-openfeignartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-netflix-hystrix-dashboardartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-actuatorartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- <exclusions>
- <exclusion>
- <groupId>org.junit.vintagegroupId>
- <artifactId>junit-vintage-engineartifactId>
- exclusion>
- exclusions>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- dependency>
- dependencies>
2.mapper
- @Mapper
- public interface ProductMapper extends BaseMapper
{ -
- }
3.service
在业务接口上指定异常回退
- //在业务接口上指定异常处理类
- @FeignClient(name = "microservice-provider-hystrix",fallbackFactory = IProductClientServiceFallbackFactory.class)
- public interface IProductService extends IService
{ -
- Product getProductById(Integer id);
-
- }
- @Service
- public class ProductService extends ServiceImpl
implements IProductService{ -
-
- @Override
- public Product getProductById(Integer id) {
- Product product = baseMapper.selectById(id);
- return product;
- }
- }
3.控制层
@HystrixCommand(fallbackMethod="xxx"):当方法抛出异常进行熔断降级处理方法
- @RestController
- public class ProductController {
-
- @Autowired
- private ProductService productService;
-
- @GetMapping("{id}")
- @HystrixCommand(fallbackMethod ="errorCallBack")
- public Object get(@PathVariable("id") Integer id){
- Product p = productService.getProductById(id);
- if(p==null){
- throw new RuntimeException("查无此商品");
- }
- return new JsonResult
(200,p); - }
-
- /**
- * 熔断降级的方法
- */
- public Object errorCallBack(@PathVariable("id") Integer id){
- return id+"不存在,error";
- }
-
-
- }
4.FailBackFactory实现类
这个需要导入feign,在FeiginClient中,可以制定fallback实现服务不可以用时自动调用fallback指定处理方法
- @Component
- public class IProductClientServiceFallbackFactory implements FallbackFactory
{ - @Override
- public IProductService create(Throwable throwable) {
- //回退机制
- return new IProductService() {
- @Override
- public Product getProductById(Integer id) {
- Product product = new Product();
- product.setCategoryId(999999);
- product.setPrice(99999999L);
- return product;
- }
-
- @Override
- public boolean saveBatch(Collection
entityList, int batchSize) { - return false;
- }
-
- @Override
- public boolean saveOrUpdateBatch(Collection
entityList, int batchSize) { - return false;
- }
-
- @Override
- public boolean updateBatchById(Collection
entityList, int batchSize) { - return false;
- }
-
- @Override
- public boolean saveOrUpdate(Product entity) {
- return false;
- }
-
- @Override
- public Product getOne(Wrapper
queryWrapper, boolean throwEx) { - return null;
- }
-
- @Override
- public Map
getMap(Wrapper queryWrapper) { - return null;
- }
-
- @Override
- public
V getObj(Wrapper queryWrapper, Function super Object, V> mapper) { - return null;
- }
-
- @Override
- public BaseMapper
getBaseMapper() { - return null;
- }
-
- @Override
- public Class
getEntityClass() { - return null;
- }
- };
- }
- }

Hystrix技术点
1.快速失败并且迅速恢复
2.优雅降级
3.实施实时监控
将外部服务包装到HystrixCommand对象中,并单独线程中处理
服务错误百分比超过了阈值,熔断器开关自动打开,一段时间内停止对该服务的所有请求。