分析:
在微服务架构中,存在着众多的服务单元 ,若一个单元出现故障,就会因为依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较于传统的架构更加不稳定,因此为了解决这样的问题,产生了断路器等一系列的服务保护机制。
其中,Spring Cloud Hystrix实现了断路器、线程隔离等一系列服务保护功能,也是基于Netflix的开源框架Hystrix实现的,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供强大的容错能力。Hystrix具备服务降级、服务熔断、线程、信号隔离、请求缓存、请求合并以及服务监控等强大的功能。
在服务消费方
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-hystrix-dashboard
com.netflix.hystrix
hystrix-javanica
1.5.12
有两种方式:
1、服务间利用RestTemplate进行通信
2、利用Feign通信(Feign整合了负载均衡和Eureka)
1、RestTemplate
在需要容错处理的方法添加
@HystrixCommand
注解,并指定一个容错方法,即fallbackMethod。这里是自己本地的方法,前一个是执行sayHello()方法调用服务提供者接口进行测试,后一个是容错方法,也就是fallbackMethod指定的方法,注意容错方法参数个数类型要和原方法一致。
配置好后执行服务注册中心跟服务提供者和消费者,正常使用消费接口,数据显示正常。关闭服务提供者,再使用消费接口就会执行容错方法,返回容错信息。
@RequestMapping(value = "/hello",method = RequestMethod.GET)
// 要做容错处理的方法上加@HystrixCommand注解,并指定一个容错方法,即fallbackMethod
// 如果调用没有做Hytrix容错的方法,则直接返回异常信息
@HystrixCommand(fallbackMethod = "demoFallbackMethod")
public String sayHello(String name){
return helloService.sayHello(name);
}
/**
* 请求失败执行的方法
* fallbackMethod的方法参数个数类型要和原方法一致
* 利用feign的话可以统一使用错误回调方法 不用在方法使用@HystrixCommand
* @return
*/
public String demoFallbackMethod(String name){
System.out.println("这里调用了容错Hystrix机制");
return "你好" + name + ":服务出错";
}
2、利用Feign
使用feign之前需要先了解一下feign,此处需要有一定的基础知识。
导入feign依赖,并且创建一个feign客户端,用于当作通信接口。
启动类中需要添加@EnableFeignClients 。
虽然使用了Ribbon和Hystrix可以实现负载均衡和容错处理,但是这个编码在实现大量业务时会显得太过于冗余。
使用feign可以设置统一的hystrix fallback,也就是将同错方法进行统一的管理,减少代码的冗余。
1、由于我们在入口程序使用了@EnableFeignClients注解,Spring启动后会扫描标注了@FeignClient注解的接口,然后生成代理类。
2、我们在@FeignClient接口中指定了value,其实就是指定了在Eureka中的服务名称。
3、在FeignClient中的定义方法以及使用了SpringMVC的注解,Feign就会根据注解中的内容生成对应的URL,然后基于Ribbon的负载均衡去调用REST服务。
一般在实际开发中fallback 方法不会直接写在接口方法所在类里,那样太杂乱
value:服务提供者名称,fallback:指定的容错方法统一实现类
@Component
@EnableFeignClients
// fallback显示指定使用的容错类
@FeignClient(value = "spring-cloud-client-1",fallback = TestHelloServiceFallback.class) //注册在服务中心的application name//用于与该服务进行通信
public interface HelloService {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
String sayHello(@RequestParam(value = "name") String name);
}
新建一个fallback类,实现feign通信接口(这里是实现HelloService)。
之所以要实现通信接口,也是为了保证与原方法一致(参数列表,名称)。
通过@Component注解将其注入spring中。
/**
* 使用feign后统一的服务降级,该类一般要实现调用远程服务的接口(这样保证方法名一致)
* 也就是统一的容错方法
*/
@Component
public class TestHelloServiceFallback implements HelloService {
@Override
public String sayHello(String name) {
return "服务出错";
}
}
最后在yml文件中配置开启feign熔断。
配置好后,可以不用不在方法上使用
@HystrixCommand
注解。
# 开启feign的容错方式
feign:
hystrix:
enabled: true # 开启Feign熔断
最后,重启服务,在关闭服务提供方后,会调用容错方法返回容错信息。
没有配置hystrix熔断的普通方法的话会直接返回错误信息。
---END--- 简单记录!