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);
}
}
用户正常访问服务:
微服务节点出现问题,服务降级:
评论 (0)