本文是基于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
2、Spring Initializr ----- Next
3、等待创建项目中
4、输入 Group 和 Artifact
点击 Next
5、选择Spring cloud Discovery -----Eureka Discovery Client---- Next
6、点击 Finish 创建完成
三、完善项目
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两个项目都正常运行的情况下,实现负载均衡,返回结果如下
2、端口8762和8763来回切换,实现了负载均衡。
现在关闭CLIENT-SERVER1 和CLIENT-SERVER2 再次访问接口,返回接口如下,进入了fallback方法,实现了短路,减少了因链接异常造成的线程阻塞问题,避免了容器线程的浪费。
以上就是一个SpringCloud 基于Hystrix+Feign实现断路器模式的学习过程。欢迎交流学习。