继续上一章,这里使用的熔断器是由feign内部提供的;(我感觉springcloud做的非常臃肿)
当调用服务端,久久没有得到相应的时候,我们应该让此次请求降级,实现降级的方法有 线程池和服务熔断的方式;
线程池的方式:是为每一个服务创建一个线程池,当调用某个服务的时候,如果出现了问题,那么该线程就不会归还到线程池,当线程池中的线程耗尽的时候,该服务自然不会再被访问到了,因为线程池中已经没有可供操作的线程了;
服务熔断的方式: Hystrix ; 当某项服务满足一定的条件后(一直无法访问等等) 再有线程访问该服务的时候,直接返回,执行降级方法;
继上一章,上一章在configuration类中注入了RestTemplate对象;
此时,将不需要再使用注入该对象;
需要再启动类上注解@EnableFeignClient @EnableCircuitBreaker
或者使用@SpringCloudApplication(包含@SpringBootApplciation和@EnableDiscoveryClient以及@EnableCircuitBreaker)
和 @EnableFeignClient即可
添加接口
package com.itheima.client;
import com.itheima.client.impl.UserClientFallBack;
import com.itheima.config.FeignConfig;
import com.itheima.pojo.User;
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;
/**
* @author Administrator
*/
@Component
@FeignClient(value = "user-service",fallback = UserClientFallBack.class,configuration = FeignConfig.class)
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Integer id);
}
创建接口实现类UserClientFallBack
package com.itheima.client.impl;
import com.itheima.client.UserClient;
import com.itheima.pojo.User;
import org.springframework.stereotype.Component;
/**
* @author Administrator
*/
@Component
public class UserClientFallBack implements UserClient {
@Override
public User findById(Integer id) {
User user = new User();
user.setUsername("用户查询出错");
user.setId((long)id);
return user;
}
}
新建Controller用于测试
package com.itheima.controller;
import com.itheima.client.UserClient;
import com.itheima.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Administrator
*/
@RestController
@RequestMapping("/cf")
// ConsumerController 可以被完全替代, 里面的默认方法会被UserClient和UserClient的实现类替代
public class ConsumerFeignController {
@Autowired
private UserClient userClient;
@GetMapping("/{id}")
public User findById(@PathVariable("id") Integer id){
return userClient.findById(id);
}
}
配置文件中,配置
feign:
hystrix:
enabled: true # 开启hystrix的熔断功能 默认关闭
# 可选择配置项
# 配置熔断策略: 事实上timeoutinMiiliseconds 最大就是设置为2000,设置再大,从浏览器反馈的时间来看也是2秒,设置成500也可以;
hystrix:
command:
default:
circuitBreaker:
errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50%
sleepWindowInMilliseconds: 10000 # 熔断后休眠时长,默认值5秒
requestVolumeThreshold: 10 # 熔断触发最小请求次数,默认值是20
execution:
isolation:
thread:
timeoutInMilliseconds: 2000 # 熔断超时设置,默认为1秒
测试访问;