前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud教程-04:断路器(Hystrix-Ribbon)

SpringCloud教程-04:断路器(Hystrix-Ribbon)

作者头像
IT云清
发布2019-05-15 11:30:33
4000
发布2019-05-15 11:30:33
举报
文章被收录于专栏:IT云清IT云清

摘要:本文主要讲解在SpringCloud中,如何使用Hystrix来实现断路器功能。

在微服务架构中,我们把系统拆分成了很多小的服务,各个服务之间通过注册中心进行调用和依赖,为了保证服务的高可用性,各个服务通常会集群部署,此时,许多服务由于各种问题可能会调用失败,比如超时、异常等,在类似A->B->C->D的调用链中,如果D出现了阻塞或者延迟,那么前面的ABC服务都会出现问题,导致相关依赖ABCD的服务都会受到影响,此时,如果调用的请求量较大,请求继续积压堆积,那最终这个系统可能会瘫痪。

如何能够保证在一个服务出问题的情况下,不会出现故障传播,导致整体服务瘫痪,这个就是Hystrix需要做的事情。当某个服务出现问题时,通过断路器的故障监控,立即向调用方返回一个指定的结果,而不是长时间的阻塞,这样就避免了故障服务调用线程的积压堆积。Hystrix提供了熔断、隔离、监控等一系列的保护功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。

本文介绍如何结合上一文SpringCloud教程-03:负载均衡(Ribbon),使用Hystrix来实现断路器功能。主要分为以下几个步骤:

  • 1.创建项目
  • 2.引入依赖
  • 3.修改配置文件
  • 4.添加启动注解
  • 5.注入模板类
  • 6.跨服务调用
  • 7.启动项目,测试

1.创建项目

新建一个Springboot项目hystrix_ribbon_server1。

2.引入依赖

代码语言:javascript
复制
<!--eureka-client-->    <dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>    </dependency>
    <!--eureka ribbon-->    <dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>    </dependency>
    <!--hystrix-->    <dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>    </dependency>

代码语言:javascript
复制
  <!--springcloud依赖管理-->  <dependencyManagement>    <dependencies>      <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-dependencies</artifactId>        <version>Finchley.SR2</version>        <type>pom</type>        <scope>import</scope>      </dependency>    </dependencies>  </dependencyManagement>

3.修改配置文件

代码语言:javascript
复制
server:  port: 8017spring:  application:    name: hystrix-ribbon-servereureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/

4.添加启动注解

见5中代码注解

5.注入模板类

代码语言:javascript
复制
package com.java4all.hystrix_ribbon_server1;
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.netflix.hystrix.EnableHystrix;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;
@EnableHystrix@EnableEurekaClient@SpringBootApplicationpublic class HystrixRibbonServer1Application {
  /**   *   * @Bean : 注入一个名为restTemplate的bean   * @LoadBalanced :表明这个 restTemplate 开启了负载均衡的功能   *   * */  @Bean  @LoadBalanced  RestTemplate restTemplate(){return new RestTemplate();}
  public static void main(String[] args) {    SpringApplication.run(HystrixRibbonServer1Application.class, args);  }}

6.跨服务调用

写一套简单的业务代码,然后调用前面创建的company-server服务提供的接口。

6.1 controller

代码语言:javascript
复制
@RestController@RequestMapping(value = "hrs")public class HrsController {
  @Autowired  private HrsService hrsService;
  @GetMapping(value = "getCompany")  public String getCompany(String id){    String company = hrsService.getCompany(id);    System.out.println(company);    return company;  }}
6.2 service

代码语言:javascript
复制
public interface RibbonService {  String getCompany(String id);}

6.3 serviceImpl

在serviceImpl实现类中,我们引入前面的RestTemplate模板类,来跨服务调用,并开启了负载均衡功能。

在getCompany方法上添加@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法erroCompany,熔断方法直接返回了一个字符串。当此服务出现问题时,这个接口调不通后直接进入熔断方法。

代码语言:javascript
复制
@Servicepublic class HrsServiceImpl implements HrsService{
  //启动类中注入了此模板,并且开启了负载均衡功能  @Autowired  RestTemplate restTemplate;
  //给方法添加熔断器的功能,并指定熔断方法  @HystrixCommand(fallbackMethod = "erroCompany")  @Override  public String getCompany(String id) {    //程序名替代服务地址,ribbon会根据服务名自动选择服务实例    String company = restTemplate        .getForObject("http://company-server/company/get?id=" + id, String.class);    return company;  }    /**熔断方法*/  public String erroCompany(String id){    return "服务出错,返回默认企业:"+id;  }}

7.启动项目,测试

此时,启动项目,访问http://localhost:8017/hrs/getCompany?id=234,我们这个项目的接口会去调用前面启动的企业服务,由于企业服务启动了两台:8011,8014,那么,通过ribbon负载均衡后,会分发到两台服务上。

如下:

640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png

当我们把8011挂掉后,此时,由于eureka更新服务列表默认时间为30s,这之间,如果请求落在8011上,那么,就会调用熔断方法,返回指定的结果,如下:

640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年05月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 6.2 service
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档