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

举报
小阿杰· 发表于 2022/01/25 22:08:58 2022/01/25
【摘要】 本文是基于Hystrix+Feign实现断路器模式 环境:IDEAJDK1.8Spring Cloud Hoxton.M3Spring Boot 2.2.0 一、Hystrix简介  背景:在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常...

本文是基于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

1.jpg

2、Spring Initializr ----- Next

2.jpg

3、等待创建项目中

3.png

4、输入 Group 和 Artifact

点击 Next

4.png

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

5.png

6、点击 Finish 创建完成

6.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两个项目都正常运行的情况下,实现负载均衡,返回结果如下

7.png

8.png

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

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

9.png

结语

  好了,以上就是Spring Cloud 断路器(Hystrix)+ Feign介绍,感谢您的阅读,希望您喜欢,如对您有帮助,欢迎点赞收藏。如有不足之处,欢迎评论指正。下次见。
  作者介绍:【小阿杰】一个爱鼓捣的程序猿,JAVA开发者和爱好者。公众号【Java全栈架构师】欢迎关注阅读交流。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。