摘要:服务雪崩效应是一种因服务提供者的不可用导致服务消费者的不可用并将不可用逐渐放大的过程。这种代理能够记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。这个自己持有的上下文默认实现类也是。
本篇集成Hystrix,继续搭建demo。
雪崩效应:
在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。
如果下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。
熔断器:
熔断器的原理很简单,如同电力过载保护器。它可以实现快速失败,如果它在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费CPU时间去等到长时间的超时产生。熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。
熔断器模式就像是那些容易导致错误的操作的一种代理。这种代理能够记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。
熔断器开关相互转换的逻辑如下图:
Hystrix熔断器:
1.断路器机制
断路器很好理解, 当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN). 这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力.
2.Fallback
Fallback相当于是降级操作. 对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值. fallback方法的返回值一般是设置的默认值或者来自缓存.
3.资源隔离
在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据调用的远程服务划分出多个线程池. 例如调用产品服务的Command放入A线程池, 调用账户服务的Command放入B线程池. 这样做的主要优点是运行环境被隔离开了. 这样就算调用服务的代码存在bug或者由于其他原因导致自己所在线程池被耗尽时, 不会对系统的其他服务造成影响. 但是带来的代价就是维护多个线程池会对系统带来额外的性能开销. 如果是对性能有严格要求而且确信自己调用服务的客户端代码不会出问题的话, 可以使用Hystrix的信号模式(Semaphores)来隔离资源.
我们在movie微服务中使用Hystirx,新建文件如下目录
在controller中,可以直接使用Hystrix注解,并且自定义fallback函数,当请求后端服务出现异常的时候, 可以使用fallback方法返回的值.
@GetMapping("/movie/{id}") @HystrixCommand(fallbackMethod = "fallbackMovie",commandProperties = @HystrixProperty(name = "execution.isolation.strategy",value = "semaphore")) public User findmovie(@PathVariable int id){ return userFeignClient.find(id); } public User fallbackMovie(int id){ User user=new User(); user.setId(10); return user; }
其中commandProperties = @HystrixProperty(name = "execution.isolation.strategy",value = "semaphore")的value Hystrix默认为thread,
默认使用线程池里隔离的线程,要想切换到调用者相同线程使用Spring Security的context,就要设置隔离策略为semaphore。
关于Spring父子容器context:
1. 首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境;
2. 其次,在web.xml中会提供有contextLoaderListener。在web容器启动时,会触发容器初始化事件,此时contextLoaderListener会监听到这个事件,其contextInitialized方法会被调用,在这个方法中,spring会初始化一个启动上下文,这个上下文被称为根上下文,即WebApplicationContext,这是一个接口类,确切的说,其实际的实现类是XmlWebApplicationContext。这个就是spring的IoC容器,其对应的Bean定义的配置由web.xml中的context-param标签指定。在这个IoC容器初始化完毕后,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,将其存储到ServletContext中,便于获取;
3. 再次,contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这个servlet可以配置多个,以最常见的DispatcherServlet为例,这个servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个servlet请求。DispatcherServlet上下文在初始化的时候会建立自己的IoC上下文,用以持有spring mvc相关的bean。在建立DispatcherServlet自己的IoC上下文时,会利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先从ServletContext中获取之前的根上下文(即WebApplicationContext)作为自己上下文的parent上下文。有了这个parent上下文之后,再初始化自己持有的上下文。这个DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化处理器映射、视图解析等。这个servlet自己持有的上下文默认实现类也是mlWebApplicationContext。初始化完毕后,spring以与servlet的名字相关(此处不是简单的以servlet名为Key,而是通过一些转换,具体可自行查看源码)的属性为属性Key,也将其存到ServletContext中,以便后续使用。这样每个servlet就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享相同的bean,即根上下文(第2步中初始化的上下文)定义的那些bean。
feign中使用Hystrix:
feign客户端
@FeignClient(name="userprovider",configuration = FeignClient.class,fallback = HystrixFallbackClient.class) public interface UserFeignClient { @RequestMapping (value = "/user/{id}",method = RequestMethod.GET) public User find(@PathVariable("id") int id); }
fallback的类HystrixFallbackClient实现fallback方法
@Component public class HystrixFallbackClient implements UserFeignClient { @Override public User find(int id) { User user=new User(); user.setId(1); return user; } }
若想禁用某个feignClient的Hystrix可以更改feignClient的config,在里面返回feign.bulider,默认为Hystrix的
FeignConfig:
@Configuration public class FeignConfig { @Bean public Contract feignContract(){ return new feign.Contract.Default(); } @Bean @Scope("prototype") public Feign.Builder feignBuilder(){ return Feign.builder(); } }
如果需要访问回退触发的原因,Hystrix也提供fallbackfactory :
改写UserFeignClient的属性:
@FeignClient(name="userprovider",configuration = FeignClient.class,fallbackFactory = HystrixFallbackFactory.class) public interface UserFeignClient { @RequestMapping (value = "/user/{id}",method = RequestMethod.GET) public User find(@PathVariable("id") int id); }
创建HystrixFallbackFactory,和一个继承UserFeignClient的接口
HystrixUserFeignClientWithFactory:
public interface HystrixUserFeignClientWithFactory extends UserFeignClient { }
HystrixFallbackFactory:
@Component public class HystrixFallbackFactory implements FallbackFactory{ private static final Logger logger= LoggerFactory.getLogger(HystrixFallbackFactory.class); @Override public UserFeignClient create(Throwable throwable) { this.logger.info("异常原因为{}",throwable.getMessage()); return new HystrixUserFeignClientWithFactory() { @Override public User find(int id) { User user=new User(); user.setId(0); return user; } }; } }
hystrix实时监控可视化可以使用dashboard
eureka的pom添加
`
org.springframework.cloud spring-cloud-starter-hystrix-dashboard
`
并给application添加注解@EnableHystrixDashboard,启动eureka,movie微服务(记得改UserFeignClient的fallback为fallbackfactory,删除fallback属性以及UserFeignClient实现类,不然报错)访问hystrix
先使用movie微服务,hystrix才能打印日志记录,访问http://localhost:8088/hystrix...
然后在http://localhost:8761/hystrix,输入http://localhost:8088/hystrix...地址,成功监控
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67701.html
摘要:本系列网络资料资料来源于网络,相关学习微服务与微服务架构定义理解单一应用程序划分为一组小的服务,每个服务有自己的进程。 本系列(java-study-springcloud-网络资料)资料来源于网络,springcloud相关学习 1、微服务与微服务架构 定义:https://martinfowler.com/arti... showImg(https://segmentfault.c...
摘要:实现配置和注册中心最近,阿里开源的比较火,可以和和共用,对升级到非常的方便。只需要添加依赖,使用配置注册中心地址即可。配置不生效,没有使用注解刷新配置分清注册中心和配置中心是两个概念,需要配置两个地址学会看源码,看维基。 Springcloud-nacos实现配置和注册中心 最近,阿里开源的nacos比较火,可以和springcloud和dubbo共用,对dubbo升级到springc...
摘要:调用百度实现图像识别使用渲染导出的制作的超级炫酷的三维模型一个代码库本人本人浏览器调试及所有错误代码整合千峰超级好用的各种开发自学文档这是它对应的学习视频使用教程详细虚拟机安装系统详解版网易开源镜像站在线数据互转使 1.Java调用百度API实现图像识别 2.使用Three.js渲染Sketchup导出的dae 3.three.js制作的超级炫酷的三维模型 4.three.js - 一...
摘要:调用百度实现图像识别使用渲染导出的制作的超级炫酷的三维模型一个代码库本人本人浏览器调试及所有错误代码整合千峰超级好用的各种开发自学文档这是它对应的学习视频使用教程详细虚拟机安装系统详解版网易开源镜像站在线数据互转使 1.Java调用百度API实现图像识别 2.使用Three.js渲染Sketchup导出的dae 3.three.js制作的超级炫酷的三维模型 4.three.js - 一...
阅读 2686·2021-09-26 10:19
阅读 2139·2021-09-24 10:27
阅读 2521·2021-09-01 10:42
阅读 2305·2019-08-29 16:09
阅读 2487·2019-08-29 15:17
阅读 1449·2019-08-29 15:09
阅读 636·2019-08-29 11:14
阅读 2302·2019-08-26 13:25