hystrix

Spring Cloud Finchley.SR1 的学习与应用 7

岁酱吖の 提交于 2019-11-27 16:22:37
Hystrix 分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况,这种现象被称为服务雪崩效应。为了应对服务雪崩,一种常见的做法是手动服务降级。而 Hystrix 的出现,给我们提供了另一种选择。 服务雪崩效应 在微服务架构中, 我们将系统拆分成了很多服务单元, 各单元的应用间通过服务注册 与订阅的方式互相依赖。 由于每个单元都在不同的进程中运行,依赖通过远程调用的方式 执行, 这样就有可能因为网络原因或是依赖服务自身间题出现调用故障或延迟, 而这些问 题会直接导致调用方的对外服务也出现延迟, 若此时调用方的请求不断增加, 最后就会因 等待出现故障的依赖方响应形成任务积压, 最终导致自身服务的瘫痪。 举个例子, 在一个电商网站中, 我们可能会将系统拆分成用户、 订单、 库存、 积分、 评论等一系列服务单元。 用户创建一个订单的时候, 客户端将调用订单服务的创建订单接 口,此时创建订单接口又会向库存服务来请求出货(判断是否有足够库存来出货)。 此时若 库存服务因自身处理逻辑等原因造成响应缓慢, 会直接导致创建订单服务的线程被挂起, 以等待库存申请服务的响应, 在漫长的等待之后用户会因为请求库存失败而得到创建订单 失败的结果。 如果在高并发情况之下,因这些挂起的线程在等待库存服务的响应而未能释 放, 使得后续到来的创建订单请求被阻塞, 最终导致订单服务也不可用。即雪崩效应

Feign使用Hystrix无效原因及解决方法

拥有回忆 提交于 2019-11-27 16:18:20
最近项目重构使用了Spring Boot和Spring Cloud。这两者结合确实给项目带来了方便,同时也遇到了一些问题。其中使用feign作为服务消费,但是断路器hystrix一直不起作用让人很费解。最终经过重重查找终于找到原因,以及解决方法。 问题产生原因 首先,使用spring-cloud搭建微服务的过程大部分是根据网上的教程来的,由于网上教程的时间较早,而spring-cloud更新迭代较快,会造成依赖上的一些问题。教程中的spring-cloud的依赖是 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Brixton.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> 而我自己使用idea搭建项目使用的是较新的依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RELEASE</version>

Hystrix之ThreadLocal上下文传播

南笙酒味 提交于 2019-11-27 16:14:34
引言 ThreadLocal ThreadLocal这个类给线程提供了一个本地变量,这个变量是该线程自己拥有,各线程间不共享。在该线程存活和ThreadLocal实例能访问的时候,保存了对这个变量副本的引用。当线程消失的时候,所有的本地实例都会被GC。并且建议ThreadLocal最好是使用 private static 修饰。 InheritableThreadLocal InheritableThreadLocal是为了解决子线程获得父线程本地变量的需求,继承自ThreadLocal。如果你使用它,那么保存的所有东西都已经不在原来的threadLocals里面,而是在一个新的叫inheritableThreadLocals变量中。意思就是说每个线程Thread里面还有一个Map变量,名叫inheritableThreadLocals,它保存的是需要传递的引用(通过InheritableThreadLocal设置的线程变量)。 这种父子传递的需求还是有些比较重要的应用场景,如上下文传递(用户标识、事务等),调用日志跟踪等。Log4j中的MDC就是基于InheritableThreadLocal实现。但一般来说我们用线程池比较多,线程池会缓存线程,重复使用,线程可能会执行不同的任务。这样一来它的上下文传递就达不到正确的效果。 TransmittableThreadLocal

Histrix简介

半腔热情 提交于 2019-11-27 15:16:14
Hystrix 主要应用到分布式环境中,用于处理服务与服务之间,在调用失败的情况下如何处理的工具; 它是一个中间组件,像插件一样配置在服务之间; 主要功能:   1、快速失败   2、服务降级   3、服务隔离   4、类实时(near real-time)监控 主要解决问题:   分布式环境中,复杂的依赖关系,部分服务不可用、低可用性或性能低下可能会对整个服务环境造成连锁反应,降低整体服务质量; Hystrix的策略:   为了能够像插件一样灵活的在服务之间使用,Hystrix将所有的服务调用抽象成Command,使用命令模式来处理服务之间的调用;   为了实现服务快速失败,Hystrix内部设置了很多类实时监控;   为了实现快速响应,Hystrix提供了缓存服务(request/gloable);   为了实现服务隔离,Hystrix提供了请求分组,线程隔离/信号量策略; 如何学习Hystrix:   Hystrix是一个开源的java程序: https://github.com/Netflix/Hystrix/wiki   最好的学习资料就是看Hystrix的wiki,它的wiki资料丰富,写作非常规范,要点明确,语义准确,例子也非常充分; 来源: https://www.cnblogs.com/souyoulang/p/11368119.html

(四)Java B2B2C o2o多用户商城 springcloud架构-断路器(Hystrix)

荒凉一梦 提交于 2019-11-27 15:09:52
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。 为了解决这个问题,业界提出了断路器模型。 一、断路器简介 Netflix has created a library called Hystrix that implements the circuit breaker pattern. In a microservice architecture it is common to have multiple layers of service calls. . —-摘自官网 Netflix开源了Hystrix组件,实现了断路器模式,SpringCloud对这一组件进行了整合。 在微服务架构中,一个请求需要调用多个服务是非常常见的,如下图: 较底层的服务如果出现故障,会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值

跟我学Spring Cloud(Finchley版)-15-Hystrix监控详解

柔情痞子 提交于 2019-11-27 15:09:35
Hystrix提供了监控Hystrix Command的能力,本节来详细探讨。 监控端点与数据 应用整合Hystrix,同时应用包含 spring-boot-starter-actuator 依赖,就会存在一个 /actuator/hystrix.stream 端点,用来监控Hystrix Command。 当被@HystrixCommand 注解了的方法被调用时,就会产生监控信息,并暴露到该端点中 。当然,该端点默认是不会暴露的,需使用如下配置将其暴露。 management: endpoints: web: exposure: include: 'hystrix.stream' 此时,访问 /actuator/hystrix.stream 可返回如下结果: {"type":"HystrixCommand","name":"findById","group":"MovieController","currentTime":1547905939151,"isCircuitBreakerOpen":false,"errorPercentage":0,"errorCount":0,"requestCount":0,"rollingCountBadRequests":0,"rollingCountCollapsedRequests":0,"rollingCountEmit":0,

疯狂Spring Cloud连载(17)Hystrix属性配置与回退

两盒软妹~` 提交于 2019-11-27 14:39:03
本文节选自《疯狂Spring Cloud微服务架构实战》 京东购买地址: https://item.jd.com/12256011.html 当当网购买地址: http://product.dangdang.com/25201393.html Spring Cloud教学视频: https://my.oschina.net/JavaLaw/blog/1552993 Hystrix属性配置与回退 属性配置 使用Hystrix时,可以为命令设置属性,以下的代码片断,为一个命令设置了执行的超时时间: public MyCommand(boolean isTimeout) { super( Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup")) .andCommandPropertiesDefaults(HystrixCommandProperties.Setter() .withExecutionTimeoutInMilliseconds(500)) ); } 以上的配置仅对该命令生效,设置了命令的超时时间为500毫秒,该配置项的默认值为1秒,如果想对全局生效,可以使用以下的代码片断: ConfigurationManager .getConfigInstance() .setProperty(

疯狂Spring Cloud连载(15)第一个Hystrix程序

試著忘記壹切 提交于 2019-11-27 14:38:49
本文节选自《疯狂Spring Cloud微服务架构实战》 京东购买地址: https://item.jd.com/12256011.html 当当网购买地址: http://product.dangdang.com/25201393.html Spring Cloud教学视频: https://my.oschina.net/JavaLaw/blog/1552993 Spring Cloud电子书: https://my.oschina.net/JavaLaw/blog/1570383 第一个Hystrix程序 先编写一个简单的Hello World程序,展示Hystrix的基本作用。前面的章节会单独讲解Hystrix框架,后面章节才会整合Spring Cloud一起使用。 准备工作 使用Spring Boot的spring-boot-starter-web项目,建立一个普通的Web项目,发布两个测试服务用于测试,控制器的代码请见代码清单6-1。 代码清单6-1: codes\06\6.2\first-hystrix-server\src\main\java\org\crazyit\cloud\MyController.java @RestController public class MyController { @GetMapping("/normalHello") public

spring cloud 断路器 Hystrix

旧城冷巷雨未停 提交于 2019-11-27 13:00:16
一、微服务架构中使用断路器的原因 二、代码实现 1、在Ribbon中使用短路器 1.1、引入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> 1.2、在Springboot类中增加 @EnableHystrix来开启Hystrix @SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient @EnableHystrix public class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run( ServiceRibbonApplication.class, args ); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } } 1.3、在服务方法上增加@HystrixCommand(fallbackMethod = "backError")

跟我学Spring Cloud(Finchley版)-11-Feign常见问题总结

痴心易碎 提交于 2019-11-27 12:54:51
本文总结Feign常见问题及解决方案。 一、FeignClient接口如使用 @PathVariable ,必须指定value属性 代码示例: @FeignClient("microservice-provider-user") public interface UserFeignClient { @RequestMapping(value = "/simple/{id}", method = RequestMethod.GET) public User findById(@PathVariable("id") Long id); ... } 其中的 @PathVariable("id") 中的”id”,也就是value属性,必须指定,不能省略。 二、构造多参数请求 详见: 如何使用Feign构造多参数的请求 三、如需产生Hystrix Stream监控信息,需要做一些额外操作 Feign本身已经整合了Hystrix,可直接使用 @FeignClient(value = "microservice-provider-user", fallback = XXX.class) 来指定fallback类,fallback类继承@FeignClient所标注的接口即可。 但是假设如需使用Hystrix Stream进行监控,默认情况下,访问 http://IP:PORT/actuator