前言
本章讲解Spring Cloud的Netflix的第三个组件Hystrix
方法
1.概念
Hystrix也就是我们常说的熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。在微服务架构中,每个服务结点相安无事的进行运作,一旦某个节点出现了问题,那么服务器将会立即抛出异常。如果在高并发的条件下,这样的后果不堪设想。所以我们推出Hystrix来解决这个问题。
Hystrix涉及到两个常用的概念:服务降级、服务熔断
服务降级:当一个服务因为异常或者该服务实例停止的时候,我们需要一个备用的服务方法来代替用户调用的真实远程方法,该方法包含一些必要的错误信息(低端的服务),由于相对正常服务的质量较差,因而习惯叫做服务降级。
服务熔断:当一个服务在一定的时间频率内不断的服务降级,那么我们认为该服务不可用。系统将会直接调用服务降级后的服务。直到我们原本的服务恢复正常为止。
2.Hystrix的服务提供端实现
1)修改提供端pom文件,加入必要的依赖
<!-- hystrix坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2)修改提供端启动类,加入@EnableHystrix注解允许使用Hystrix
package cn.edu.ccut;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
@EnableEurekaClient
@EnableHystrix
@SpringBootApplication
public class EurekaProviderApp {
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApp.class, args);
}
}
3)修改服务代码
package cn.edu.ccut.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
@RestController
public class ProviderController {
@RequestMapping("/getStr")
@HystrixCommand(fallbackMethod="getString_back")//表示出现异常即执行指定的方法
public String getString(){
System.out.println("===调用原来的服务1===");
int a = 1/0;
return "略略略";
}
//备用方法
public String getString_back(){
return "error";
}
}
这样的话,一旦消费端调用该方法出现了异常,那么直接服务降级跳转至备用方法执行。
由于我在服务方法中故意写了一个异常的代码,所以访问该方法将会出现如下结果:
3.Hystrix的服务消费端实现
由于我们在服务端实现时,每次都需要为服务方法编写一个备用的方法,那么一旦服务方法很多,那么编码体验是糟糕的!
而且一旦该服务彻底的宕机,那么服务端实现断路将无从谈起!
基于此,我们采用服务消费端的实现。
1)修改消费端pom文件,加入必要的依赖
<!-- hystrix坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2)修改application.properties,允许在feign中使用hystrix
#enable hystrix
feign.hystrix.enabled=true
3)编写备用的服务类ProviderServiceFallBack ,该类编写如下所示。
package cn.edu.ccut.feign;
import org.springframework.stereotype.Component;
import feign.hystrix.FallbackFactory;
@Component
public class ProviderServiceFallBack implements FallbackFactory<ProviderService>{
@Override
public ProviderService create(Throwable arg0) {
return new ProviderService() {
@Override
public String getString() {
System.out.println("===调用备用的服务===");
return "error";
}
};
}
}
4)在服务接口位置的注解@FeignClient添加新的属性fallbackFactory指向我们的备用服务类
@FeignClient(value="eureka-provider",fallbackFactory=ProviderServiceFallBack.class) //服务提供者服务名
public interface ProviderService {
@RequestMapping("/getStr")
public String getString();
}
这样,我们在该类中可以为所有的服务方法添加必要的降级处理。
一旦服务提供方的方法调用失败,那么就爱那个直接跳转执行服务降级之后的方法返回给用户!
那么访问该方法也会出现之前的页面效果: