五大神兽03"/>
SpringCloud五大神兽03
1.简介
- 雪崩:在微服务架构中,假如某个微服务无法正常运行就会形成阻塞,导致调用这个微服务的其他所有微服务都会阻塞。到达某个时间节点,服务器的并发量会达到峰值,这样的话,后续其他请求即使访问的不是当前被阻塞的微服务也会无法正常访问。这种由于一个微服务异常导致整个微服务架构都无法工作的情况称为雪崩。
- 熔断:监听服务提供者方请求的并发量、访问失败率,只要并发量或者失败率达到一定阈值,服务消费者和提供者之间的请求就会断开,称为熔断。
- 降级:当发生熔断现象时,服务提供者就不会有任何响应,这样对服务消费者来说体验很差,所以退而求其次,给服务消费者返回托底数据而不是没有任何响应,这就叫降级。
- 托底数据:异常发生时,服务提供者给服务消费者返回的异常提示消息,托底数据类型和正常响应返回的数据类型一致。
- Hystrix 断路器:解决雪崩效应的一种自我保护机制,包括四个方面:
- 资源隔离(限流):包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用;
- 熔断:当失败率达到阀值自动触发熔断(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复;
- 降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据;
- 缓存:提供了请求缓存、请求合并实现;
2.使用
① Ribbon集成Hystrix:在服务提供者方使用,需要
- 在服务提供者方添加Hystrix依赖;
- 在Controller的每个接口方法上添加@HystrixCommand注解并指定返回托底数据的方法名;
- 自定义返回托底数据的方法;
- 在启动类上添加@EnableHystrix注解;
② Feign集成Hystrix:由于Feign本身已经集成了Hystrix,所以在服务消费者方使用Hystrix,只需要
- 在yml中配置开启Hystrix支持;
- 在FeignClient中指定返回托底数据的方法名;
- 自定义返回托底数据的方法(需要实现FallbackFactory接口);
2.1.Ribbon集成Hystrix
服务提供者端集成,服务消费者端正常调用
2.1.1.导入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- Hystrix依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
</dependencies>
2.1.2.写启动类
添加@EnableHystrix注解,开启Hystrix支持
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class Provider8082App {public static void main(String[] args) {SpringApplication.run(Provider8082App.class,args);}
}
2.1.3写yml配置
配置端口和服务名称、注册到Eureka注册中心
server:port: 8082eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/instance:instance-id: service-provider-ribbon:8082 #自定义一个服务id名称,否则就默认使用当前计算机名称作为服务的idspring:application:name: SERVICE-PROVIDER-RIBBON #服务名称标识 如果不配置,则默认是UNKNOWN
2.1.4.写Controller
方法上添加@HystrixCommand注解进行资源隔离、fallbackMethod属性指定返回托底数据的方法名、定义返回托底数据的方法
注意:如果有多个方法,每个方法上都需要加@HystrixCommand注解,并定义返回托底数据的方法,该方法的返回值类型需要和正常响应时返回的数据类型一致。
@RestController
public class ProviderController8082 {/*** @HystrixCommand 用HystrixCommand对象包裹该微服务进行隔离* fallbackMethod:定义返回托底数据的方法名* @return*/@HystrixCommand(fallbackMethod = "providerFallback")@GetMapping("/ribbon/provider")public String provider(){System.out.println("provider..............");//自定义异常int i = 1/(new Random().nextInt(3));return "*****8082*****";}/*** 定义返回托底数据的方法* @return*/public String providerFallback(){return "服务器繁忙~~~~";}
}
2.1.5.浏览器访问
当异常发生时,微服务响应的结果是我们自定义的数据
2.2.Feign集成Hystrix
由于Feign是在服务消费者方使用的,并且Feign内部已经集成了Hystrix,所以直接在服务消费者方使用,服务提供者方正常写。
2.2.1.导入依赖
只需要导入Feign即可
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- feign场景启动器 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
</dependencies>
2.2.2.写启动类
@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
public class FeignConsumerApp {public static void main(String[] args) {SpringApplication.run(FeignConsumerApp.class,args);}@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
2.2.3.写yml配置
开启熔断支持:feign.hystrix.enabled=true
server:port: 9091eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/instance:instance-id: feign-consumer:9091 #自定义一个服务id名称,否则就默认使用当前计算机名称作为服务的idspring:application:name: FEIGN-CONSUMER #服务名称标识 如果不配置,则默认是UNKNOWNfeign:hystrix:enabled: true #开启熔断支持
2.2.4.写FeignClient和FallBackFactory方法
FeignClient和FallBackFactory方法都单独定义,加上@Component交给Spring管理
FeignClient:
/*** value:服务提供者的名字* fallbackFactory:返回托底数据的方法*/
@FeignClient(value = "SERVICE-PROVIDER",fallbackFactory = ProviderFallbackFactory.class)
@Component
public interface ProviderClient {@GetMapping("/feign/provider")String provider();
}
FallBackFactory方法:
/*** 返回托底数据的方法,必须实现FallbackFactory接口*/
@Component
public class ProviderFallbackFactory implements FallbackFactory<ProviderClient> {/*** 重写create方法,返回值用匿名内部类的方式写,返回异常提示信息* 通过throwable可以取出异常信息* @param throwable* @return*/@Overridepublic ProviderClient create(Throwable throwable) {return new ProviderClient() {@Overridepublic String provider() {return "服务繁忙"+throwable.getMessage();}};}
}
2.2.5.写Controller
注入ProviderClient对象,调方法(类似mapper层接口调用方式)
@RestController
public class FeignConsumerController {@Autowiredprivate ProviderClient providerClient;@GetMapping("/feign/consumer")public String feignConsumer(){System.out.println("feignConsumer.....................");String s = providerClient.provider();return s;}
}
2.2.6.浏览器访问测试
服务提供者端写一个异常,异常提示信息被返回到了浏览器页面显示
3.总结
Hystrix断路器的作用就是自定义方法,在微服务出现异常的时候返回托底数据给服务消费者,而不是没有任何响应,这样的话,整个微服务架构还可以继续运作。
由于Feign内部已经集成了Hystrix,所以一般都使用Feign而不是Ribbon。
更多推荐
SpringCloud五大神兽03
发布评论