Hystrix服务降级

suaxi
2020-12-31 / 0 评论 / 140 阅读 / 正在检测是否收录...

Hystrix服务降级

A、B、C三台服务器,A在某一时间段的负载很重,急需扩容,而此时间段B、C负载很小或没有访问量,需关闭其中的服务器,拿去给A扩容,以降低负载,同时设置fallback回调,让这个时间段需要访问B、C服务器的用户得到“服务暂时不可用或关闭”的信息,这个过程可以简单的比喻为服务降级

1、API接口设置fallback回调

pojo

package com.sw.springcloud.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @Author suaxi
 * @Date 2020/12/28 21:07
 */

@Data
@NoArgsConstructor
@Accessors(chain = true) //链式编程
public class Dept implements Serializable {
    private Long deptno;
    private String dname;
    private String db_source; //数据存在哪个数据库

    public Dept(String dname) {
        this.dname = dname;
    }
}

service接口

package com.sw.springcloud.service;

import com.sw.springcloud.pojo.Dept;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.List;

/**
 * @Author suaxi
 * @Date 2020/12/29 20:02
 */

@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class)
public interface DeptClientService {

    @GetMapping("/dept/get/{id}")
    public Dept findById(@PathVariable("id")Long id);

    @GetMapping("/dept/list")
    public List<Dept> findAll();

    @PostMapping("/dept/add")
    public boolean addDept(Dept dept);
}

FallbackFactoryService服务降级设置

package com.sw.springcloud.service;

import com.sw.springcloud.pojo.Dept;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @Author suaxi
 * @Date 2020/12/30 9:33
 * 服务降级
 */

@Component
public class DeptClientServiceFallbackFactory implements FallbackFactory {
    @Override
    public Object create(Throwable throwable) {
        return new DeptClientService() {
            @Override
            public Dept findById(Long id) {
                return new Dept()
                        .setDeptno(id)
                        .setDname("未查询到数据,该服务现已被关闭")
                        .setDb_source("没有数据库信息");
            }

            @Override
            public List<Dept> findAll() {
                return null;
            }

            @Override
            public boolean addDept(Dept dept) {
                return false;
            }
        };
    }
    /*
    服务熔断:服务端,某个服务超时或异常,引起熔断(类似于保险丝)

    服务降级:客户端,从系统整体负载考虑,当某个服务熔断或关闭之后,服务将不再被调用
             此时在客户端可以设置一个回调FallbackFactory,返回一个默认的缺省值,可以
             提升用户体验,但服务质量随之下降
     */
}

2、消费者端设置

appliction.yml配置服务降级

server:
  port: 80

eureka:
  client:
    register-with-eureka: false #不向注册中心注册自己(消费者端)
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
#开启降级feign.hystrix
feign:
  hystrix:
    enabled: true

将RestTemplate注册到Spring容器中

package com.sw.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Author suaxi
 * @Date 2020/12/28 22:15
 */

@Configuration
public class ConfigBean {

    @Bean
    @LoadBalanced //注册Ribbon
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

SpringBoot启动类

package com.sw.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

/**
 * @Author suaxi
 * @Date 2020/12/28 22:29
 */

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.sw.springcloud"})
public class FeignDeptConsumer_80 {
    public static void main(String[] args) {
        SpringApplication.run(FeignDeptConsumer_80.class,args);
    }
}

用户正常访问服务:

6.用户正常访问(服务降级).png

微服务节点出现问题,服务降级:

7.服务降级.png

0

评论 (0)

取消