前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud-Hystrix【解决灾难性雪崩-降级】

SpringCloud-Hystrix【解决灾难性雪崩-降级】

作者头像
用户4919348
发布2019-06-15 14:54:01
5760
发布2019-06-15 14:54:01
举报
文章被收录于专栏:波波烤鸭

  本文我们来演示下Hystrix中解决雪崩效应的第一种方式降级的实现

Hystrix-降级

一、场景介绍

  先来看下正常服务调用的情况

在这里插入图片描述
在这里插入图片描述

  当consumer调用provider服务出现问题的情况下:

在这里插入图片描述
在这里插入图片描述

  此时我们对consumer的服务调用做降级处理

在这里插入图片描述
在这里插入图片描述

二、案例演示

1.创建项目

  创建一个SpringCloud项目

在这里插入图片描述
在这里插入图片描述

2.添加依赖

  添加Hystrix依赖,调用通过ribbon来负载均衡

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
        <version>1.4.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.8</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
        <version>1.3.2.RELEASE</version>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR5</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3.修改配置

  修改application.properties文件,设置名称,端口和注册中心的信息

代码语言:javascript
复制
spring.application.name=eureka-ribbon-consumer-hystrix
server.port=9091
#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://dpb:123456@eureka1:8761/eureka/,http://dpb:123456@eureka2:8761/eureka/

4.修改启动类

  在启动类中添加注解开启熔断。@EnableCircuitBreaker

代码语言:javascript
复制
@EnableCircuitBreaker // 开启熔断 断路器
@EnableEurekaClient
@SpringBootApplication
public class SpringcloudEurekaConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudEurekaConsumerApplication.class, args);
    }

}

5.修改业务层

  业务层代码中在getUsers方法中通过ribbon来获取负载均衡的地址,通过RestTemplate来调用服务,在方法头部添加@HystrixCommand注解,通过fallbackMethod 属性指定当调用的provider方法异常的时候的fallback方法为fallBack方法,然后在其方法中返回了托底数据。

代码语言:javascript
复制
@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;
    }
}

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

在这里插入图片描述
在这里插入图片描述

6.测试

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

在这里插入图片描述
在这里插入图片描述

操作成功~ 案例代码:https://github.com/q279583842q/SpringCloud-dpb-Demo

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年06月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hystrix-降级
    • 一、场景介绍
      • 二、案例演示
        • 1.创建项目
        • 2.添加依赖
        • 3.修改配置
        • 4.修改启动类
        • 5.修改业务层
        • 6.测试
    相关产品与服务
    负载均衡
    负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档