浅谈微服务降级、熔断与雪崩
在微服务中,当持续的请求大量的失败时,线程堆积导致服务器不堪重负,就会出现雪崩事件,这时候我们就要采取措施,进行熔断与服务降级,下面先说这三者的概念
雪崩
假如有三个微服务A、B、C,一个请求的执行过程是A->B->C,当B请求C出现大量错误(即错误)到达一定的阈值,服务不堪重负C服务崩溃了,那么B任然在不停地请求C,就会有大量的线程堆积,慢慢地B也崩了,随后A也崩了,这就是雪崩效应
熔断
当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用(hytrix自动测试请求,请求在阈值内恢复调用)。
服务降级
当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度!
当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户!
服务降级有很多种降级方式!如开关降级、限流降级、熔断降级!
代码:
添加依赖
添加Hystrix依赖,调用通过ribbon来负载均衡
修改配置
修改application.properties文件,设置名称,端口和注册中心的信息
spring.application.name=eureka-ribbon-consumer-hystrix
server.port=9091
#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/,http://eureka2:8761/eureka/
修改启动类
在启动类中添加注解开启熔断。@EnableCircuitBreaker
@EnableCircuitBreaker // 开启熔断 断路器
@EnableEurekaClient
@SpringBootApplication
public class SpringcloudEurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaConsumerApplication.class, args);
}
}
修改业务层
业务层代码中在getUsers方法中通过ribbon来获取负载均衡的地址,通过RestTemplate来调用服务,在方法头部添加@HystrixCommand注解,通过fallbackMethod 属性指定当调用的provider方法异常的时候的fallback方法为fallBack方法,然后在其方法中返回了托底数据。
@Service
public class UserService {
/**
* ribbon 负载均衡
* LoadBalancerClient 通过服务名称可以获取对应的服务的相关信息 ip port等
*/
@Autowired
private LoadBalancerClient loadBalancerClient;
@HystrixCommand(fallbackMethod = "fallBack")
public List<User> getUsers(){
// ServiceInstance 封装的有服务的基本信息 IP和端口等
ServiceInstance si = this.loadBalancerClient.choose("eureka-ribbon-provider");
StringBuilder sb = new StringBuilder();
sb.append("http://")
.append(si.getHost())
.append(":")
.append(si.getPort())
.append("/user");
System.out.println("服务地址:"+sb.toString());
// SpringMVC RestTemplate
RestTemplate rt = new RestTemplate();
ParameterizedTypeReference<List<User>> type = new ParameterizedTypeReference<List<User>>() {};
// ResponseEntity:封装了返回值的信息
ResponseEntity<List<User>> response = rt.exchange(sb.toString(), HttpMethod.GET,null,type);
List<User> list = response.getBody();
return list;
}
/**
* 服务降级
* 返回托底数据的方法
* @return
*/
public List<User> fallBack(){
List<User> list = new ArrayList<>();
list.add(new User(3,"我是托底数据",22));
return list;
}
}
控制层代码仅仅是调用了业务层的方法
测试
启动eureka注册中心,然后启动consumer服务,provider服务不用启动,这样我们访问consumer中的服务的时候就会出现异常,当我们浏览器看到托底数据的话,表示降级成功.
- 本文标签: java springcloud
- 版权声明: 本站原创文章,于2019年06月26日由wzbjsz发布,转载请注明出处