微服务降级、熔断与雪崩

本人博客网址:https://www.wzbjsz.cn

在微服务中,当持续的请求大量的失败时,线程堆积导致服务器不堪重负,就会出现雪崩事件,这时候我们就要采取措施,进行熔断与服务降级,下面先说这三者的概念
雪崩

假如有三个微服务A、B、C,一个请求的执行过程是A->B->C,当B请求C出现大量错误(即错误)到达一定的阈值,服务不堪重负C服务崩溃了,那么B任然在不停地请求C,就会有大量的线程堆积,慢慢地B也崩了,随后A也崩了,这就是雪崩效应

熔断

当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用(hytrix自动测试请求,请求在阈值内恢复调用)。

服务降级

当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度!
当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户!

服务降级有很多种降级方式!如开关降级、限流降级、熔断降级!
file
代码:
添加依赖
添加Hystrix依赖,调用通过ribbon来负载均衡



org.springframework.boot
spring-boot-starter-web



org.springframework.boot
spring-boot-starter-test
test


org.springframework.cloud
spring-cloud-starter-config
1.4.5.RELEASE


org.springframework.cloud
spring-cloud-starter-eureka
1.4.6.RELEASE


org.apache.httpcomponents
httpclient
4.5.8


org.springframework.cloud
spring-cloud-starter-hystrix
1.3.2.RELEASE
 




org.springframework.cloud
spring-cloud-dependencies
Dalston.SR5
pom
import



修改配置
修改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;
}

}

控制层代码仅仅是调用了业务层的方法
file
测试

  启动eureka注册中心,然后启动consumer服务,provider服务不用启动,这样我们访问consumer中的服务的时候就会出现异常,当我们浏览器看到托底数据的话,表示降级成功.
file

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值