开发者社区> 小阿杰.> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【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



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


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

image.png

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


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
F版本SpringCloud 2—什么是SpringCloud?SpringCloud版本选择
引言:搭建微服务架构就像是买电脑,使用SpringCloud就是在买品牌机。
832 0
Spring Boot 应用可视化监控,一目了然!
Spring Boot 应用可视化监控,一目了然!
195 0
Spring Boot中使用Spring Security进行安全控制
Spring Boot中使用Spring Security进行安全控制
151 0
Spring Boot 实现定时任务的 4 种方式
定时任务实现的几种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
114 0
Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览
Spring Boot刚发布了2.3.0版本,好基友Spring Cloud还没跟上
1012 0
企业级 SpringBoot 教程 (二)Spring Boot配置文件详解
springboot采纳了建立生产就绪Spring应用程序的观点。 Spring Boot优先于配置的惯例,旨在让您尽快启动和运行。在一般情况下,我们不需要做太多的配置就能够让spring boot正常运行。
1139 0
Spring boot 通用配置文件模板
001 # =================================================================== 002 # COMMON SPRING BOOT PROPERTIES 003 # 004 # This sample file is provided as a guideline.
1612 0
Spring Boot 启动加载数据 CommandLineRunner
实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求。 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现。
966 0
Spring Boot属性配置文件详解
相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷。我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁多的XML配置内容,替代它的是在pom.xml中引入模块化的Starter POMs,其中各个模块都有自己的默认配置,所以如果不是特殊应用场景,就只需要在application.properties中完成一些属性配置就能开启各模块的应用。
915 0
+关注
小阿杰.
一个爱鼓捣的程序猿,JAVA开发者和爱好者。公众号【Java全栈架构师】维护者,自建微信小程序【软考真题解析】【实用在线工具箱】,欢迎阅读交流。
93
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载