什么是服务降级
服务降级处理实在客户端实现完成的,与服务端没有关系
我们可以思考一下,我们在做熔断处理的时候有这么一个现象:controller中,每个要做熔断的方法都有一个与之对应的熔断方法,这样就会造成方法膨胀。这个时候我们就要做服务降级。
所谓降级,一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。这样做,虽然服务水平下降,但好歹可用,比直接挂掉要强。
首先,我们可以将controller中的fallback方法全部解耦合到公共api依赖中,做法如下:
/**
* 首先这个接口可以对外暴露服务
*
* 其次,经过加工后的这个接口还有服务降级解耦的功能,
* 将提供者的controller中的所有方法的熔断方法统一在这管理
* 做法:新建一个实现了FallbackFactory接口的类UserClientServiceFallbackFactory
*
*/
@FeignClient(value="SPRINGBOOT-MYBATIS-PROVIDER-001", fallbackFactory = UserClientServiceFallbackFactory.class)
public interface UserClientService {
@RequestMapping("/getUserInfo")
List<User> getUsers();
@RequestMapping("/getRealUserInfo/{id}")
User getRealUserInfo(Integer id);
}
/**
* 千万不要忘记在这个类上面新增@Component注解,否则不好使,注意,这是个大坑
*/
@Component
public class UserClientServiceFallbackFactory implements FallbackFactory<UserClientService> {
public UserClientService create(Throwable throwable) {
return new UserClientService() {
public List<User> getUsers() {
return null;
}
public User getRealUserInfo(Integer id) {
User user = new User();
user.setName("该ID:"+ id +" 没有对应的信息,Consumer客户端提供的降级信息,此刻provide服务关闭");
return user ;
}
};
}
}
目的是为了模拟微服务调用的时候出现timeout或被调的微服务报错的情况的熔断降级
其次修改springboot-mybatis-consumer-feignhysitrix001中的配置
#pom.xml中添加熔断依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
#修改server port
server.port=9002
# 连接池的配置信息
# 初始化大小,最小,最大
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
#这个配置当filter中没有设置wall的时候,启动是ok的,反之则报错,谨记谨记!
#spring.datasource.druid.db-type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.db-type=mysql
spring.datasource.druid.url=jdbc:mysql://192.168.200.245:2060/ltttest?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull
spring.datasource.druid.username=root
spring.datasource.druid.password=&i5Sb_oV<>km
#====================================服务熔断===========================================
feign.hystrix.enabled=true
#====================================eureka配置=========================================
spring.application.name=eureka-client-9002
# 指定eureka server通信地址,注意/eureka/不能少
eureka.client.service-url.defaultZone=http://eureka10002.com:10002/eureka/,http://eureka10003.com:10003/eureka/,http://eureka10004.com:10004/eureka/
# 是否注册IP到eureka server,如不指定或设为false,那就会注册主机名到eureka server
eureka.instance.prefer-ip-address=true

controller(springboot-mybatis-consumer-feignhysitrix001)(ApplicationConsumerfeignhystrix001类)中的修改
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.hc"})
@EnableCircuitBreaker
public class ApplicationConsumerfeignhystrix001 {
private static Logger logger = Logger.getLogger(ApplicationConsumerfeignhystrix001.class);
/**
* Start
*/
public static void main(String[] args) {
SpringApplication.run(ApplicationConsumerfeignhystrix001.class, args);
// logger.info("SpringBoot Start Success");
}
}

启动eureka集群(三台)
启动hystrix提供者(ApplicationProviderHystrix001)
启动feign消费者(AppUserConsumerFeignHysitrix001)
1.正常访问

2.故意关掉提供者服务,然后访问

网友评论