【Spring Cloud 系列】六、断路器(Hystrix)+ Feign(Hoxton.M3 版本)

简介: 【Spring Cloud 系列】六、断路器(Hystrix)+ Feign(Hoxton.M3 版本)

本文是基于Hystrix+Feign实现断路器模式


环境:


IDEA
JDK1.8
Spring Cloud Hoxton.M3
Spring Boot 2.2.0


一、Hystrix简介


  背景:在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。

  解决:Netflix开源了Hystrix组件,实现了断路器模式,SpringCloud对这一组件进行了整合。在微服务架构中,一个请求需要调用多个服务是非常常见的较底层的服务如果出现故障,会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值(Hystric 是5秒20次) 断路器将会被打开。断路打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值,能够在一个、或多个依赖同时出现问题时保证系统依然可用。


二、创建项目


1、File ----- New -----Project


image.png


2、Spring Initializr  ----- Next

image.png

3、等待创建项目中

image.png

4、输入 Group   和  Artifact

点击 Next

image.png

5、选择Spring cloud Discovery -----Eureka Discovery Client---- Next

image.png

6、点击 Finish 创建完成

image.png


三、完善项目


1、完善pom.xml

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



2、HystrixserverFeignApplication增加注解,@EnableFeignClients 开启Feign的负载均衡功能


@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class HystrixserverFeignApplication {
  public static void main(String[] args) {
    SpringApplication.run(HystrixserverFeignApplication.class, args);
  }
}


3、设置配置文件


server.port=8766
spring.application.name=HystrixFeginServer
#注册到服务中心的地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
#是否注册到eureka服务器,
eureka.client.registerWithEureka=true 
#是否从eureka服务器获取注册信息
eureka.client.fetchRegistry=true
#是否开启自我保护模式,默认为true。
eureka.server.enable-self-preservation=true
#打开Feign自带断路器
feign.hystrix.enabled=true


4、Controller


@RestController
public class HystrixController {
    @Autowired
    private HystrixService hystrixService;
    @RequestMapping("/gethystrix")
    public String getHystrix(String name){
       return hystrixService.getHystrix(name);
    }
}


5、Service


  添加注解通过@FeignClient来指定我们调用哪个服务,前面启动了两个服务,都为Client-Server1,feign会通过服务名来调用服务。fallback 指定fallback的实现即可断路器功能,然后在接口的实现类中添加熔断逻辑。


@FeignClient(value = "Client-Server1",fallback = HystrixServiceImpl.class)
public interface HystrixService {
    @RequestMapping(value = "/test",method = RequestMethod.GET)
    String getHystrix(@RequestParam(value = "name")String name);
}


6、HystrixServiceImpl


  编写fallback的实现类中添加熔断逻辑。


@Component
public class HystrixServiceImpl implements HystrixService {
    @Override
    public String getHystrix(String name) {
        return "hi,"+name+",sorry,Hystrix Feign error!";
    }
}


四、运行项目


1、输入项目地址和参数


http://localhost:8766/gethystrix?name=123

  在CLIENT-SERVER1 和CLIENT-SERVER2两个项目都正常运行的情况下,实现负载均衡,返回结果如下



image.png

image.png



2、端口8762和8763来回切换,实现了负载均衡。


  现在关闭CLIENT-SERVER1 和CLIENT-SERVER2  再次访问接口,返回接口如下,进入了fallback方法,实现了短路,减少了因链接异常造成的线程阻塞问题,避免了容器线程的浪费。

image.png

  以上就是一个SpringCloud 基于Hystrix+Feign实现断路器模式的学习过程。欢迎交流学习。


目录
相关文章
|
22天前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
143 15
|
29天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14217 19
|
22天前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
41 3
|
1月前
|
消息中间件 Java 开发者
Spring Cloud微服务框架:构建高可用、分布式系统的现代架构
Spring Cloud是一个开源的微服务框架,旨在帮助开发者快速构建在分布式系统环境中运行的服务。它提供了一系列工具,用于在分布式系统中配置、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等领域的支持。
119 5
|
1月前
|
Java API 开发工具
Spring Boot与Spring Cloud Config的集成
Spring Boot与Spring Cloud Config的集成
|
26天前
|
消息中间件 Java Nacos
通用快照方案问题之通过Spring Cloud实现配置的自动更新如何解决
通用快照方案问题之通过Spring Cloud实现配置的自动更新如何解决
48 0
|
26天前
|
缓存 监控 Java
通用快照方案问题之Spring Boot Admin的定义如何解决
通用快照方案问题之Spring Boot Admin的定义如何解决
34 0
|
26天前
|
监控 NoSQL Java
通用快照方案问题之Martin Flower提出的微服务之间的通信如何解决
通用快照方案问题之Martin Flower提出的微服务之间的通信如何解决
31 0
|
1月前
|
Java 微服务 Spring
【spring cloud】注解@SpringCloudApplication和@SpringBootApplication的区别
【spring cloud】注解@SpringCloudApplication和@SpringBootApplication的区别