一、服务降级与服务熔断区别
1.服务降级:不管在什么情况下,服务降级的流程都是先调用正常的方法,再调用fallback的方法。 也就是服务器繁忙,请稍后再试,不让客户端等待并立刻返回一个友好提示。
2.服务熔断:假设服务宕机或者在单位时间内调用服务失败的次数过多,即服务降级的次数太多,那么则服务熔断。 并且熔断以后会跳过正常的方法,会直接调用fallback方法,即所谓“服务熔断后不可用”。 类似于家里常见的保险丝,当达到最大服务访问后,会直接拒绝访问,拉闸限电,然后调用服务降级的fallback方法,返回友好提示。
二、服务降级
1.Hystrix
依赖
.<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.10.RELEASE</version> </dependency>
开启Hystrix
使用服务降级
import com.minos.entity.UserBorrowDetail; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import com.test.service.BorrowService; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.Collections; @RestController public class BorrowController { @Resource BorrowService service; @HystrixCommand(fallbackMethod = "onError") @RequestMapping("/borrow/{uid}") UserBorrowDetail findUserBorrows(@PathVariable("uid") int uid){ return service.getUserBorrowDetailByUid(uid); } UserBorrowDetail onError(int uid){ return new UserBorrowDetail(null, Collections.emptyList()); } }
2.OpenFeign
使用OpenFeign参考
https://blog.csdn.net/qq_29752857/article/details/129221077
配置文件开启OpenFeign服务降级
feign: circuitbreaker: enabled: true
配置服务熔断
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @FeignClient(value = "userService", fallback = UserFallbackClient.class) //声明为userservice服务的HTTP请求客户端 //@FeignClient(value = "userService") //声明为userservice服务的HTTP请求客户端 public interface UserClient { //路径保证和其他微服务提供的一致即可 @RequestMapping("/user/{uid}") User getUserById(@PathVariable("uid") int uid); //参数和返回值也保持一致 }
import com.minos.entity.User; import org.springframework.stereotype.Component; @Component //注意,需要将其注册为Bean,Feign才能自动注入 public class UserFallbackClient implements UserClient{ @Override public User getUserById(int uid) { //这里我们自行对其进行实现,并返回我们的替代方案 User user = new User(); user.setName("我是替代方案"); return user; } }