当后端一个接口响应非常慢的时候,那么请求该接口的时候会被强制等待,直到返回或者超时结束.若在高负载的情况下,如果不做处理的话,这些问题会导致系统崩溃.
Feign已经为我们集成了Hystrix,默认就会使用断路器包裹所有方法
下面来看下简单的服务降级使用过程:
继续使用前面搭建的Eureka,Feign,Service服务
一 : 新建一个UserServiceFallBack类,实现UserService接口
package cn.sh.daniel.fallback;
import org.springframework.stereotype.Component;
import cn.sh.daniel.entity.User;
import cn.sh.daniel.service.UserService;
/**
* UserService接口的降级服务
*
* @author Daniel
* @time 2018年1月18日 下午2:35:09
*
*/
@Component
public class UserServiceFallBack implements UserService{
@Override
public User findUserById(Long id) {
return new User();
}
@Override
public String aveUser(User user) {
return "Error";
}
@Override
public User findUserByNameAndPassword(String name, String password) {
return new User();
}
}
这边只是简单的实现了这几个方法二 : 在UserService接口中添加fallback去指定降级的方法
package cn.sh.daniel.service;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import cn.sh.daniel.config.FeignLoggerConfiguration;
import cn.sh.daniel.entity.User;
import cn.sh.daniel.fallback.UserServiceFallBack;
@FeignClient(value = "cloud-shop-userservice",fallback = UserServiceFallBack.class,configuration = FeignLoggerConfiguration.class)
public interface UserService {
@GetMapping("/user/{id}")
public User findUserById(@PathVariable("id")Long id);
@PostMapping("/user/user")
public String aveUser(@RequestBody User user) ;
@GetMapping("/user/findUser")
public User findUserByNameAndPassword(@RequestParam("name")String name ,@RequestParam("password")String password);
}
三 : 重启Feign服务,调用服务可以正常调用, 那此处将userservice服务shut down掉,再执行此方法看效果
直接报错了?
经过查证,原来feign集成hystrix需要配置开启
feign:
hystrix:
enabled: true
重新启动继续上面的操作:
发现终于走进了降级方法啦!!