SpringCloud教程-06:断路器(Hystrix-Feign)

640?wx_fmt=jpeg

图片来源:pexels网站


640?wx_fmt=png java4all原创,欢迎关注 640?wx_fmt=gif

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

640?wx_fmt=gif
 
 

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

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

前面介绍过Hystrix-Ribbon结合,本文介绍如何结合上一文SpringCloud教程-05:负载均衡(Feign),使用Hystrix来实现断路器功能。

主要分为以下几个步骤:

1.创建项目

新建一个Springboot项目feign_server1。

2.引入依赖

<!--eureka-client-->	
    <dependency>	
      <groupId>org.springframework.cloud</groupId>	
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>	
    </dependency>	
	
    <!--feign-->	
    <dependency>	
      <groupId>org.springframework.cloud</groupId>	
      <artifactId>spring-cloud-starter-openfeign</artifactId>	
    </dependency>

 
 
<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.修改配置文件

 
 
server:	
  port: 8015	
spring:	
  application:	
    name: feign-server1	
eureka:	
  client:	
    service-url:	
      defaultZone: http://localhost:8761/eureka/	
feign:	
  hystrix:	
    enabled: true

4.添加启动注解

启动类添加@EnableFeignClients,开启Feign的负载均衡功能。

 
 
//开启Feign的负载均衡功能	
@EnableFeignClients	
@EnableEurekaClient	
@SpringBootApplication	
public class FeignServer1Application {	
	
  public static void main(String[] args) {	
    SpringApplication.run(FeignServer1Application.class, args);	
  }	
}

5.跨服务调用

写个简单的接口方法来调用。

5.1controller
 
 
@RestController	
//@RequestMapping(value = "feign")	
public class FeignController {	
	
  //编译报错,可以不用管,程序启动时才会注入此bean	
  @Autowired	
  FeignService feignService;	
	
  @GetMapping("getCompany")	
  public String getCompany(String id){	
    String company = feignService.getCompany(id);	
    System.out.println(company);	
    return company;	
  }	
}
5.2service

通过@FeignClient来指定我们调用哪个服务,前面启动了两个服务,都为company-server,feign会通过服务名来调用服务。

 
 
//通过此注解,来指定调用哪个服务	
@FeignClient(value = "company-server")	
public interface FeignService {	
	
  /**调用company-server服务中的company/get接口*/	
  @GetMapping(value = "/company/get")	
  String getCompany(@RequestParam(value = "id")String id);	
}

6.熔断实现

Feign中实现熔断功能非常简单,只需要在上面的@FeignClient中指定fallback的实现即可,然后在接口的实现类中添加熔断逻辑。

6.1service

只是在上面5.2中做了简单的修改:

 
 
//通过此注解,来指定调用哪个服务	
//如果开启了断路器,只需要添加fallback,在此接口实现类中添加熔断方法即可	
@FeignClient(value = "company-server",fallback = FeignServiceImpl.class)	
public interface FeignService {	
	
  /**调用company-server服务中的company/get接口*/	
  @GetMapping(value = "/company/get")	
  String getCompany(@RequestParam(value = "id")String id);	
}
6.2serviceImpl

添加断路器的实现逻辑,实现熔断方法。

 
 
@Component	
public class FeignServiceImpl implements FeignService{	
	
  //熔断方法	
  @Override	
  public String getCompany(String id) {	
    return "服务出错,返回指定企业信息:华为"+id;	
  }	
}

7.启动项目,测试

启动项目,然后访问接口http://localhost:8015/getCompany?id=36,可以看到服务会自动负载到两台服务上。

640?wx_fmt=png

640?wx_fmt=png

如果挂掉8011服务,可以看到访问结果如下:

640?wx_fmt=png

640?wx_fmt=png

SpringCloud系列:

为什么要实施微服务架构?

SpringCloud教程-01:服务注册与发现(Eureka)

SpringCloud教程-02:服务注册与消费

SpringCloud教程-03:负载均衡(Ribbon)

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

SpringCloud教程-05:负载均衡(Feign)

SpringBoot资料:SpringBoot系列教程资源


↓↓↓点击阅读原文,查看完整源码。

640?wx_fmt=jpeg

与其相忘江湖,不如点赞关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值